【发布时间】:2013-04-23 19:41:12
【问题描述】:
所以我目前在 XZ 平面上有一个三次贝塞尔补丁(y = 0,所以它是一个平面补丁)。该补丁由 16 个控制点和 400 个总网格点组成。我目前正在尝试实现的是选择中间 4 个控制点中的 1 个(其中任何一个),并在任何坐标方向上递增。
我认为我遇到问题的部分实际上是使用 OpenGL 绘图函数显示更改。下面是创建补丁的代码和我当前的绘图函数以及我当前使用的增量函数的示例。
网格是所有网格点的二维数组。 控制是 16 个控制点的二维数组。 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 递增时。网格中的三角形只是变大了,但似乎根本没有正确绘制它。有点难以描述。
结果如下所示。第一个屏幕截图是在我点击增量之前。第二个屏幕截图和第三个屏幕截图是单击 1 次和单击 10 次后的样子。我也不太清楚为什么当我在 y 方向上递增时,补丁的范围实际上会发生变化(随着我不断递增 y,它似乎变得更大)。
【问题讨论】:
-
如果难以描述,请截图。
-
在每次调用
CalcBezier()之前,是否将grid的元素设置为零? -
没有。 Grid 最初设置为 0,然后除非在 calcbezier 中更改,否则不会更改
-
添加我的 onDraw 函数会提供任何有用的信息吗?我不想在我的帖子中添加不必要的代码。会让人难以阅读。
-
那个开关坏了。它应该类似于
control[(control_point - 1) / 2 + 1][control_point].y += 2;
标签: c++ c opengl graphics bezier