1次元エバリュエータ
![]()
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();f`はfloat, dはdouble、での計算です。精度の違いです。
リアルタイムで変化させる場合など、コントロールポイントを変更したら、その度に glMap1f で再計算すること。
blab_evaluator1.zip (プロジェクトフォルダはblabExamples直下に配置してください )
2次元エバリュエータ
![]()
項数がひとつ増えるだけです。
エバリュータを有効にしておく →
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();
}リアルタイムで変化させる場合など、コントロールポイントを変更したら、その度に glMap1f で再計算すること。
blab_evaluator2.zip (プロジェクトフォルダはblabExamples直下に配置してください )
さらにコントロールポイントを増やす場合
blab_evaluator3.zip (プロジェクトフォルダはblabExamples直下に配置してください )
blab_evaluator4.zip (プロジェクトフォルダはblabExamples直下に配置してください )