現在地 >> メニュー >> 基本編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引数―

出力用頂点データ。

combineのコールバック関数の定義


リファレンスにもあるが検出した交点は、
コールバック関数を記述して、位置、色を取得して出力にしなくてはならない。

[例]

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

目次

― その他 ―

Wiki内検索

計測中...(07.10.8〜)

Save The World






▲よろしければ広告のクリックもお願いします


▲ランキングに参加しました

管理人/副管理人のみ編集できます