verticalline 1次元エバリュエータ
undeline

http://glprogramming.com/red/chapter12.html

曲線を描画する手順:

エバリュータを有効にしておく →

glEnable(GL_MAP1_VERTEX_3);

コントロールポイントを配列で定義して用意しておき →

例(4つの3次元座標): GLfloat controlPoints[4][3];

controlPoints[0][0] = -4.0;
controlPoints[0][1] =-4.0;
controlPoints[0][2] = 0.0;

controlPoints[1][0] = -2.0;
controlPoints[1][1] = 4.0;
controlPoints[1][2] = 0.0;

controlPoints[2][0] = 2.0;
controlPoints[2][1] = -4.0;
controlPoints[2][2] = 0.0;

controlPoints[3][0] = 4.0;
controlPoints[3][1] = 4.0;
controlPoints[3][2] = 0.0;

glMap1fで1次元エバリュータを計算し →

glMap1f(GL_MAP1_VERTEX_3, 0.0, 1.0, 3, 4, &controlPoints[0][0]);

好みの分割精度でエバリュータの結果を描画する →

例: 30分割で描画

glBegin(GL_LINE_STRIP);
for (i = 0; i <= 30; i++)
{
 glEvalCoord1f((GLfloat) i/30.0);
}
glEnd();

glMap1f
glMap1d

f`はfloat, dはdouble、での計算です。精度の違いです。

リアルタイムで変化させる場合など、コントロールポイントを変更したら、その度に glMap1f で再計算すること。

blab_evaluator1.zip  (プロジェクトフォルダはblabExamples直下に配置してください )

verticalline 2次元エバリュエータ
undeline

項数がひとつ増えるだけです。

エバリュータを有効にしておく →

glEnable(GL_MAP2_VERTEX_3);

コントロールポイントを配列で定義して用意しておき →

例(4 x4 の3次元座標): GLfloat controlPoints[4][4][3];

controlPoints[0][0][0] =-1.5;
controlPoints[0][0][1] =-1.5;
controlPoints[0][0][2] =4.0;

controlPoints[1][0][0] =-0.5;
controlPoints[1][0][1] =-1.5;
controlPoints[1][0][2] = 2.0;

controlPoints[2][0][0] = 0.5;
controlPoints[2][0][1] =-1.5;
controlPoints[2][0][2] =-1.0;

controlPoints[3][0][0] =1.5;
controlPoints[3][0][1] =-1.5;
controlPoints[3][0][2] = 2.0;

controlPoints[0][1][0] =-1.5;
controlPoints[0][1][1] = -0.5;
controlPoints[0][1][2] = 1.0;

controlPoints[1][1][0] =-0.5;
controlPoints[1][1][1] =-0.5;
controlPoints[1][1][2] = 3.0;

controlPoints[2][1][0] = 0.5;
controlPoints[2][1][1] = -0.5;
controlPoints[2][1][2] = 0.0;

controlPoints[3][1][0] =1.5;
controlPoints[3][1][1] = -0.5;
controlPoints[3][1][2] =-1.0;

controlPoints[0][2][0] =-1.5;
controlPoints[0][2][1] = 0.5;
controlPoints[0][2][2] = 4.0;

controlPoints[1][2][0] =-0.5;
controlPoints[1][2][1] =0.5;
controlPoints[1][2][2] = 0.0;

controlPoints[2][2][0] =0.5;
controlPoints[2][2][1] = 0.5;
controlPoints[2][2][2] = 3.0;

controlPoints[3][2][0] =1.5;
controlPoints[3][2][1] = 0.5;
controlPoints[3][2][2] = 4.0;

controlPoints[0][3][0] =-1.5;
controlPoints[0][3][1] = 1.5;
controlPoints[0][3][2] = -2.0;

controlPoints[1][3][0] =-0.5;
controlPoints[1][3][1] = 1.5;
controlPoints[1][3][2] = -2.0;

controlPoints[2][3][0] =0.5;
controlPoints[2][3][1] = 1.5;
controlPoints[2][3][2] = 0.0;

controlPoints[3][3][0] =1.5;
controlPoints[3][3][1] = 1.5;
controlPoints[3][3][2] = -1.0;

glMap2fで2次元エバリュータを計算し →

glMap2f(GL_MAP2_VERTEX_3, 0, 1, 3, 4,  0, 1, 12, 4, &controlPoints[0][0][0]);

好みの分割精度でエバリュータの結果を描画する →

例: 30分割で描画

for (j = 0; j <= 8; j++)
{
 glBegin(GL_LINE_STRIP);
 for (i = 0; i <= 30; i++)
{
 glEvalCoord2f((GLfloat)i/30.0, (GLfloat)j/8.0);
}
 glEnd();

 glBegin(GL_LINE_STRIP);
 for (i = 0; i <= 30; i++)
{
 glEvalCoord2f((GLfloat)j/8.0, (GLfloat)i/30.0);
}
 glEnd();
}

glMap2f
glMap2d

リアルタイムで変化させる場合など、コントロールポイントを変更したら、その度に glMap1f で再計算すること。

blab_evaluator2.zip (プロジェクトフォルダはblabExamples直下に配置してください )

さらにコントロールポイントを増やす場合

blab_evaluator3.zip (プロジェクトフォルダはblabExamples直下に配置してください )

blab_evaluator4.zip (プロジェクトフォルダはblabExamples直下に配置してください )