ホームに戻る
 曲線

図06_00:左下の点が始点 30区切り

ソースコード:glut06_bezier.c
 解説

ベジェ曲線を描きます。

まず要素を n 個用意します。

例えば p 要素(p(0), p(1), p(2), ..., p(n-1))の算出をする場合、

0.0 <= u <= 1.0 での P(u)の値は、

P(u) = B(0) * p(0) + B(1) * p(1) + ... + B(n-1) * p(n-1)

B(i) = (n-1)! / ((n-1-i)! * i!) * u^i * (1.0 - u)^(n-1-i)

以上の式で計算されます。

例えば、

n = 4 で4点(x0 ,x1, x2, x3)があるとき、

u での X(u) の値は、

X(u) = B(0) * x0 + B(1) * x1 + B(2) * x2 + B(3) * x3

B(0) = 3! / (3! * 0!) * u^0 * (1.0 - u)^3 = (1.0 - u)^3
B(1) = 3! / (2! * 1!) * u^1 * (1.0 - u)^2 = 3 * u * (1.0 - u)^2
B(3) = 3! / (1! * 2!) * u^2 * (1.0 - u)^1 = 3 * u^2 * (1.0 - u)
B(4) = 3! / (0! * 3!) * u^3 * (1.0 - u)^0 = u^3

以上の計算となる。

u の値を 0.0 から 1.0 まで変化させたときの、
X(u) の変化する値を利用する。

OpenGL ではこの登録を glMap1 でします。

第1引数はターゲットの定数。
第2引数、第3引数は変化の幅の開始と終点。
第4引数は次の要素データまでのデータ数。
第5引数は要素数。
第6引数はデータのポインタ。

実際に利用する場合は glEvalCoord1 を使います。

例えば、

4点が次のようにあった場合、

GLfloat points[] = {
  -2.0, -2.0, 0.0, -2.0, 2.0, 0.0, 
  2.0, -2.0, 0.0, 2.0, 2.0, 0.0
};

X,Y,Z 座標が4つあるので要素数は4です、
ある点から次の点までは X,Y,Z 3つのデータ数があります。
そして X,Y,Z の3つの情報を持った頂点データなので、
ターゲットには GL_MAP1_VERTEX_3 を選びます。
変化幅は開始を 0.0 、終了を 1.0 とします。

glMap1f(GL_MAP1_VERTEX_3, 0.0, 1.0, 3, 4, points);

この設定の場合、

glEvalCoord1f(t);

としたときの結果は、

開始を u1 とし、終点を u2 とすると、

u = (t - u1) / (u2 - u1)

という計算になるので、

u1 = 0.0、u2 = 1.0 の場合、

u = (t - 0.0) / (1.0 - 0.0) = t

よって、

glVertex3f(X(t), Y(t), Z(t));

という風に置き換わります。

この原理で以下のようにラインを描画することができます。

glBegin(GL_LINE_STRIP);

glEvalCoord1f(0.0f);
glEvalCoord1f(0.2f);
glEvalCoord1f(0.4f);
glEvalCoord1f(0.6f);
glEvalCoord1f(0.8f);
glEvalCoord1f(1.0f);

glEnd();

この方法は頂点以外にも色やテクスチャでも利用できます。

以下がターゲットのリスト、

GL_MAP1_VERTEX_3:glVertex3
GL_MAP1_VERTEX_4:glVertex4
GL_MAP1_INDEX:glIndex
GL_MAP1_COLOR_4:glColor4
GL_MAP1_NORMAL:glNormal
GL_MAP1_TEXTURE_COORD_1:glTexCoord1
GL_MAP1_TEXTURE_COORD_2:glTexCoord2
GL_MAP1_TEXTURE_COORD_3:glTexCoord3
GL_MAP1_TEXTURE_COORD_4:glTexCoord4

inserted by FC2 system