そのため、現在、XZ 平面に 3 次ベジエ パッチがあります (y = 0 なので、フラット パッチです)。パッチは、16 のコントロール ポイントと合計 400 のグリッド ポイントで構成されます。私が現在実装しようとしているのは、中央の 4 つの制御点 (それらのいずれか) の 1 つを選択し、任意の座標方向にインクリメントすることです。
私が苦労している部分は、実際にOpenGLの描画関数で変更を表示していると思います。以下は、パッチを作成するためのコードと現在の描画関数、および現在使用しているインクリメント関数のサンプルです。
Grid は、すべてのグリッド ポイントの 2 次元配列です。コントロールは、16 個のコントロール ポイントの 2 次元配列です。control_point は、ユーザーが選択するメニュー機能 (オプション 1 ~ 4) によって変更され、1 に初期化されます。
編集: switch ステートメントの最後の 2 つの制御点を修正しました。
void bezier_plane()
{
CalcBezier();
for (int i = 0; i < 19; i++) {
for (int j = 0; j < 19; j++) {
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
glBegin(GL_TRIANGLE_STRIP);
glVertex3f(grid[i][j].x, grid[i][j].y, grid[i][j].z);
glVertex3f(grid[i][j+1].x, grid[i][j+1].y, grid[i][j+1].z);
glVertex3f(grid[i+1][j].x, grid[i+1][j].y, grid[i+1][j].z);
glVertex3f(grid[i+1][j+1].x, grid[i+1][j+1].y, grid[i+1][j+1].z);
glEnd();
}
}
}
void CalcBezier()
{
float u;
float v;
u = 0;
for (int i = 0; i < 20; i++) {
v = 0;
for (int j = 0; j < 20; j++) {
for (int x = 0; x < 4; x++) {
for (int y = 0; y < 4; y++) {
grid[i][j].x += control[x][y].x * Bezier3(x, u) * Bezier3(y, v);
grid[i][j].y += control[x][y].y * Bezier3(x, u) * Bezier3(y, v);
grid[i][j].z += control[x][y].z * Bezier3(x, u) * Bezier3(y, v);
}
}
v+=.05;
}
u+=.05;
}
}
/*Is called when a menu button is hit, indicating that the control point is incremented in the y direction*/
void OnYInc()
{
switch(control_point) {
case 1:
control[1][1].y += 2;
break;
case 2:
control[1][2].y += 2;
break;
case 3:
control[2][3].y += 2;
break;
case 4:
control[2][4].y += 2;
break;
}
InvalidateRect(NULL, FALSE);
}
私の onDraw 関数は単純に bezier_plane() も呼び出します。今、上記のコードで、y に関してインクリメントしようとすると。メッシュ内の三角形は単純に大きくなりますが、まったく正しく描画されていないようです。説明するのは少し難しいです。
結果はこんな感じ。最初のスクリーンショットは、増分をヒットする前です。2 番目のスクリーンショットと 3 番目のスクリーンショットは、1 回クリックした後と 10 回クリックした後の様子です。また、y 方向にインクリメントするとパッチの範囲が実際に変化する理由もよくわかりません (y をインクリメントし続けると大きくなるようです)。