在OpenGL中渲染B样条曲线

时间:2012-11-17 22:23:57

标签: opengl 3d rendering curves bspline

我一直致力于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。

2 个答案:

答案 0 :(得分:2)

呃,你只在glBegin / End块中有一个glVertex3f调用。所以你试图绘制一个只有一个点的线条,这是不可能完成的。 (不确定OpenGL是否会实际报告错误。)

希望这有帮助。

答案 1 :(得分:0)

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