我一直在做一个OpenGL项目,它本质上是绘制b样条曲线的实践。我的程序没有返回任何错误,但曲线不会显示。
给定一个名为"坐标"的长度为 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。
呃,在 glBegin/End 块中只有一个 glVertex3f 调用。所以你试图画一个只有一个点的线条,这真的做不到。(不确定OpenGL是否真的会为此报告错误。
希望这有帮助。
我还会检查你的 B 样条计算函数。我的参考(高级动画和渲染技术,瓦特和瓦特)有两个u值。大写的全局 U 范围从 0 ..n - 2.这对应于您的小写 u。但是对于基函数(小写),u 必须在 0 范围内。1. 在您的代码中,这将是 fmod(u, 1)。我认为,如果你在所有 NoFu 返回语句中使用它,你会得到更好的答案。