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描画できます。 | |
| PENGUINITIS | |