0

我正在尝试创建一个三次贝塞尔补丁,并且在弄清楚我在哪里弄乱了计算时遇到了一些麻烦。我在二维数组中有 16 个控制点,我希望让网格有 400 个点,每个点以 0.05 的增量分隔。

控制点以 20 为增量(因此 P0,0 在 (0,0,0) 处,P3,3 在 (60, 0, 60) 处。网格将在 xz 平面上,y 坐标全为 0 .

现在我有以下内容,它在每个点上为 x 和 z 提供相同的值:

float Bezier3(int j, float k)
{
    switch(j) {
        case 0:
            return (1 - k) * (1 - k) * (1 - k);
            break;
        case 1:
            return 3*k*((1 - k) * (1 - k));
            break;
        case 2:
            return 3 * (k * k) * (1 - k);
            break;
        case 3:
            return k * k * k;
            break;
    }
}

void CalcBezier()
{
    float u;
    float v;
    for (int i = 0; i < 20; i++) {
        u = 0;
        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);
                }
            }
            u+=.05;
            v+=.05;
        }
    }
}

我不确定我哪里出错了。我试图在网格中按列行走并计算每个贝塞尔点。

我还尝试将生成的网格绘制为三角形网格:

void bezier_plane()
{
    CalcBezier();
    for (int i = 0; i < 19; i++) {
        for (int j = 0; j < 19; j++) {
            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();
        }
    }
}
4

1 回答 1

2

看起来您正在增加内部循环内的 u 和 v 。

尝试改变

        u+=.05;
        v+=.05;
    }

        v+=.05;
    }
    u+=.05;

并将复位移到循环外为零。

for (int i = 0; i < 20; i++) {
    u = 0;
    v = 0;

 u = 0;
 for (int i = 0; i < 20; i++) {
    v = 0;
于 2013-04-23T19:00:30.323 回答