立方Bezier曲线相互作用

时间:2013-04-23 19:41:12

标签: c++ c opengl graphics bezier

所以我目前在XZ平面上有一个立方贝塞尔补丁(y = 0,所以它是一个平面补丁)。补丁由16个控制点和400个总网格点组成。我目前正在尝试实现的是选择中间4个控制点中的一个(其中任何一个),并在任何坐标方向上递增。

我认为我遇到问题的部分实际上是用OpenGL绘图功能显示更改。下面是创建补丁和我当前绘图函数的代码,以及我正在使用的增量函数的示例。

网格是所有网格点的二维数组。 控制是16个控制点的2d阵列。 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,它似乎变大了)。

before increment

after 1 click

after 10 clicks

1 个答案:

答案 0 :(得分:2)

radical7为你解决了这个问题。因为在调用CalcBezier之前没有将网格设置为零,所以每次调用CalcBezier时,所有网格值都会递增。更改了OnYInc以单独保留控制点,只有InvalidateRect,您将看到相同的行为