我一直致力于OpenGL项目,该项目主要用于绘制b样条曲线。我的程序没有返回错误,但曲线不会显示。
给定长度为13的控制点数组'coords'(控制点本身在屏幕上都可见),这是我的代码:
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。
答案 0 :(得分:2)
呃,你只在glBegin / End块中有一个glVertex3f调用。所以你试图绘制一个只有一个点的线条,这是不可能完成的。 (不确定OpenGL是否会实际报告错误。)
希望这有帮助。
答案 1 :(得分:0)
我还会检查你的B样条计算函数。我的参考(高级动画和渲染技术,Watt&amp; Watt)具有两个 u值。有大写的全局U,范围从0 .. n - 2.这对应于你的小写u。但是对于基函数(小写),你必须在0的范围内.1。在你的代码中,那将是fmod(u,1)。我认为如果你在所有NoFu返回语句中使用它,你会得到更好的答案。