2

我一直在研究一个 OpenGL 项目,该项目本质上是绘制 b 样条曲线的练习。我的程序没有返回错误,但曲线不会显示。

给定一个名为“coords”的长度为 13 的控制点数组(控制点本身都在屏幕上可见),这是我的代码:

glBegin(GL_LINE_STRIP);

float x=0;
float y=0;
float z=0;
for (double u = 3; u <= 14; u+=0.1){

    for (int i = 1; i <=13; i++){
        x += NofU(u,i)*coords[i].x;
        y += NofU(u,i)*coords[i].y;
        z += NofU(u,i)*coords[i].z;
    }//for

}//for

glVertex3f(x, y, z);

glEnd();

其中“NofU”代表混合函数:

double NofU(double u, int i){

if (u < i)
    return 0;
else if (u < i+1)
    return (1/6)*pow(u,3);
else if (u < i+2)
    return (1/6)*((-3)*pow(u,3)+3*pow(u,2)+3*u+1);
else if (u < i+3)
    return (1/6)*(3*pow(u,3)-6*pow(u,2)+4);
else if (u < i+4)
    return (1/6)*pow((1-u),3);
else
    return 0;

}//NofU

当我尝试打印语句时,我会得到非常大或非常小的坐标值,或者只是 0。

4

2 回答 2

2

呃,glBegin/End 块内只有一个 glVertex3f 调用。所以你试图画一条只有一个点的线带,这实际上是做不到的。(不确定 OpenGL 是否真的会为此报告错误。)

希望这可以帮助。

于 2012-11-19T01:02:40.987 回答
0

我还要检查你的 B 样条计算函数。我的参考资料(Advanced Animation and Rendering Techniques, Watt & Watt)有两个u 值。有大写的全局 U,范围从 0 .. n - 2。这对应于您的小写 u。但是对于基函数(小写),u 必须在 0 .. 1 范围内。在您的代码中,这将是 fmod(u, 1)。我认为如果你在所有 NoFu 返回语句中使用它,你会得到更好的答案。

于 2012-11-20T22:28:11.747 回答