NURBS 曲線・曲面

2010年1月4日

ファイル

10-nurbs.tar.gz (曲線)

10-nurbs2.tar.gz (曲面)

内容

NURBS 曲線・曲面を描画します。NURBS 曲線を描画する場合、以下のような準備が必要です。

	nurbs = gluNewNurbsRenderer();
	gluNurbsProperty(nurbs, GLU_SAMPLING_METHOD, GLU_PATH_LENGTH);
	gluNurbsProperty(nurbs, GLU_SAMPLING_TOLERANCE, 10.);
	gluNurbsProperty(nurbs, GLU_DISPLAY_MODE, GLU_FILL);
	gluNurbsProperty(nurbs, GLU_CULLING, GL_TRUE);
	gluNurbsProperty(nurbs, GLU_AUTO_LOAD_MATRIX, GL_TRUE);
	gluNurbsCallback(nurbs, GLU_ERROR, (void *)nurbsError);

gluNewNurbsRendere() で struct GLUnurbsObj のポインタを得て、それに対して gluNurbsProperty() によって各種設定を行います。最後の gluNurbsCallback() はエラー時に呼ばれるコールバック関数を設定する関数です。

描画は以下のように行います。

	gluBeginCurve(nurbs);
	gluNurbsCurve(nurbs, knotn, knot, stride, &ctrlPoint[0][0],
	  order, GL_MAP1_VERTEX_4);
	gluEndCurve(nurbs);

knotn は NURBS 曲線の制御点数 + 次数を指定します。knot はサイズ knotn の配列で、通常は 0 から等差 1 で値を入れておけばよいです。stride は配列 ctrlPoint の行を移動するときの移動量で、ここでは配列のサイズが 4x4 なので stride = 4 です。ctrlPoint は NURBS 曲線の制御点です。

static const int order = 3;
static const int n = 4;
static const int knotn = 4 + 3; /* n + order */
static const int stride = 4;
GLfloat knot[7] = {0., 1., 2., 3., 4., 5., 6.};
GLfloat ctrlPoint[4][4] = {
	{-0.5, 0., 0., 1.},
	{-0.25, 0.5, 0., 1.},
	{0.25, -0.5, 0., 1.},
	{0.5, 0., 0., 1.}
};

制御点がそれぞれ 4 つの値を持っていますが、はじめの 3 つが座標、最後の 1 つが重みを表わします。

NURBS 曲面は、曲線の gluBeginCurve() ... gluEndCurve() の代わりに gluBeginSurface() ... gluEndSurface() を、gluNurbsCurve() の代わりに gluNurbsSurface() を、GL_MAP1_VERTEX_4 の代わりに GL_MAP2_VERTEX_4 を使えばb描画できます。

OpenGL プログラミング 目次へ