2012-11-17 84 views
2

我一直在研究OpenGL项目,这本质上是绘制B样条曲线的练习。我的程序没有返回错误,但曲线不会显示。在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

回答

2

呃,你只有一个glVertex3f在glBegin/End块内调用。所以你试图画一条只有一个点的线条,这是不可能完成的。 (不知道OpenGL是否会为此报告错误。)

希望这会有所帮助。

+0

是的,事实证明,这对我来说很愚蠢。我将顶点移动到循环内部,现在它可以工作 - 有点。我现在有另外一个问题,但这需要等待另一个问题。感谢你的回答。 – JMcMinn

0

我还会检查你的B样条计算函数。我的参考(高级动画和渲染技术,瓦特& Watt)具有两个 u值。有大写的全局U,范围从0 .. n - 2。这对应于你的小写字母u。但是对于基函数(小写),u必须在0 .. 1的范围内。在你的代码中,这将是fmod(u,1)。我认为如果你在所有的NoFu回报声明中使用它,你会得到更好的答案。

+0

感谢您的支持,自从我发布这个问题以来,我的代码经历了一些更改,现在我的格式更接近您提到的格式。 – JMcMinn