最終更新: mikk_ni3_92 2008年10月07日(火) 15:53:28履歴
現在地 >> メニュー >> 基本編13 >> 基本編13::辺の交差
例えば、「星」を「ひと筆書き」すると、5つの交点があらわれる。
このように自分と交差して、交点が発生した場合は、「combineのコールバック」が必要である。
void combine( GLdouble coords[3], void *vertex_data[4], GLfloat weight[4], void **outData );
―第1引数―
テセレータによって検出した交点の座標。(x,y,zの3つ)
―第2引数―
交差する2辺を定義している、4つの近隣の点。
―第3引数―
第2引数の各点に対する重み付け。
―第4引数―
出力用頂点データ。
リファレンスにもあるが検出した交点は、
コールバック関数を記述して、位置、色を取得して出力にしなくてはならない。
[例]
注意点は、メモリリーク。
アニメーションをする時、ディスプレイリストなどに登録しないと、
呼び出すたびにテセレーションを行い、コールバック関数を行う。
ディスプレイリストに登録するなどして、1度だけテセレーションするようにするのがいい。
サンプルコード >> 基本編13::まとめコード3
例えば、「星」を「ひと筆書き」すると、5つの交点があらわれる。
このように自分と交差して、交点が発生した場合は、「combineのコールバック」が必要である。
void combine( GLdouble coords[3], void *vertex_data[4], GLfloat weight[4], void **outData );
―第1引数―
テセレータによって検出した交点の座標。(x,y,zの3つ)
―第2引数―
交差する2辺を定義している、4つの近隣の点。
―第3引数―
第2引数の各点に対する重み付け。
―第4引数―
出力用頂点データ。
リファレンスにもあるが検出した交点は、
コールバック関数を記述して、位置、色を取得して出力にしなくてはならない。
[例]
GLdouble vertices[64][6]; //64個まで追加可能 int vertexIndex = 0; ... ... gluTessCallback(tess, GLU_TESS_COMBINE, (void (__stdcall*)(void))TessCombine);//コールバック登録 ... ... void TessCombine(const GLdouble newVertex[3], const GLdouble *neighborVertex[4], const GLfloat neighborWeight[4], GLdouble **outData) { //座標を取得 vertices[vertexIndex][0] = newVertex[0]; vertices[vertexIndex][1] = newVertex[1]; vertices[vertexIndex][2] = newVertex[2]; //色の補間(線形補間) vertices[vertexIndex][3] = neighborWeight[0] * neighborVertex[0][3] + //赤 neighborWeight[1] * neighborVertex[1][3] + neighborWeight[2] * neighborVertex[2][3] + neighborWeight[3] * neighborVertex[3][3]; vertices[vertexIndex][4] = neighborWeight[0] * neighborVertex[0][4] + //緑 neighborWeight[1] * neighborVertex[1][4] + neighborWeight[2] * neighborVertex[2][4] + neighborWeight[3] * neighborVertex[3][4]; vertices[vertexIndex][5] = neighborWeight[0] * neighborVertex[0][5] + //青 neighborWeight[1] * neighborVertex[1][5] + neighborWeight[2] * neighborVertex[2][5] + neighborWeight[3] * neighborVertex[3][5]; *outData = vertices[vertexIndex]; //アドレスをわたす ++vertexIndex; }
注意点は、メモリリーク。
アニメーションをする時、ディスプレイリストなどに登録しないと、
呼び出すたびにテセレーションを行い、コールバック関数を行う。
ディスプレイリストに登録するなどして、1度だけテセレーションするようにするのがいい。
サンプルコード >> 基本編13::まとめコード3