現在地 >> メニュー >> 基本編12 >> OpenGL::曲面 >> 曲面::glMap()関数
関連:曲面::メッシュでの描画曲面::Nurbsオブジェクト

Bernstein多項式ベースの曲面


この方法では、「glMap2f()関数」や「glMap2d()関数」を使う。

手順

  1. 制御点を用意
  2. エバリュエータの設定
  3. 有効化、エバリュエータから座標をマッピング

[1]:制御点を用意


これは、曲線と同様。

[2]:エバリュエータの設定


エバリュエータによって、1頂点何要素使うか、頂点数、計算用パラメータ等を設定する。

void glMap2f(
GLenum target, 
GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, //u方向の設定
GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, //v方向の設定
const GLfloat * points 
);


― 第1引数:target ―

様々な指定があるが
  • GL_MAP2_VERTEX_3 (x,y,z)
  • GL_MAP2_VERTEX_4 (x,y,z,w)
が頂点座標用としてある。

― 第2、3、6、7引数:u1,u2,v1,v2 ―

パラメータの計算方法。
u1 = 0、u2 = 1とすれば、指定したパラメータがそのまま適用される。
それ以外は、あるパラメータtに対し( t - u1 )/(u2 - u1)がパラメータとして使われる

― 第4、5、8、9引数: ustride、uorder、vstride、vorder―
  • stride → 次の頂点まで何要素とばしなのかを指定
  • order → 制御点の数
  • points → データの格納元を指定

※v方向のstrideにはu方向の(頂点数*1頂点の要素数)を指定する事になる。


― 第10引数: points―

制御点のデータ元。


// 制御点
float CtlPoint[]=
{
	0.0, 0.0, 0.0,  0.2, 0.3, 0.0,  0.4, 0.3, 0.0,  0.6, 0.0, 0.0,
	0.0, 0.2, 0.2,  0.2, 0.5, 0.2,  0.4, 0.5, 0.2,  0.6, 0.2, 0.2,
	0.0, 0.2, 0.4,  0.2, 0.5, 0.4,  0.4, 0.5, 0.4,  0.6, 0.2, 0.4,
	0.0, 0.0, 0.6,  0.2, 0.3, 0.6,  0.4, 0.3, 0.6,  0.6, 0.0, 0.6,
};

... ...

glMap2f(GL_MAP2_VERTEX_3, 0.0, 1.0, 3, 4, 0.0, 1.0, 3*4, 4,CtlPoint);//エバリュエータの設定

... ...

[3]:有効化、描画


有効化はglEnable()
描画は「glEvalCoord2f()」や「glEvalCoord2d()」を使う。

[例]

glEnable(GL_MAP2_VERTEX_3); //有効化(x,y,z)の3次元
... ...
glBegin(GL_QUADS);
	for(float v = 0; v < 1; v += slice){
		for(float u = 0; u < 1; u += slice){
			glEvalCoord2f(u,v);
			glEvalCoord2f(u+slice,v);
			glEvalCoord2f(u+slice,v+slice);
			glEvalCoord2f(u,v+slice);
		}
	}
glEnd();


この他、エバリュエータでは、メッシュを利用した描画方法もある。



サンプルコード >> 曲面::まとめコード1

目次

― その他 ―

Wiki内検索

計測中...(07.10.8〜)

Save The World






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


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

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