2

私は、基本的にbスプライン曲線を描くための練習であるOpenGLプロジェクトに取り組んできました。私のプログラムはエラーを返しませんが、曲線は表示されません。

'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

printステートメントを実行しようとすると、座標値がめちゃくちゃ大きいか小さいか、または0になってしまいます。

4

2 に答える 2

2

ええと、glBegin/Endブロック内にglVertex3f呼び出しが1つだけあります。つまり、1つのポイントだけを含むラインストリップを描画しようとしていますが、これは実際には実行できません。(OpenGLが実際にこれに関するエラーを報告するかどうかはわかりません。)

お役に立てれば。

于 2012-11-19T01:02:40.987 に答える
0

Bスプライン計算機能もチェックします。私のリファレンス (Advanced Animation and Rendering Techniques、Watt & Watt) には2 つのu 値があります。0 .. n - 2 の範囲の大文字のグローバル U があります。これは小文字の u に対応します。ただし、基底関数 (小文字) の場合、u の範囲は 0 .. 1 でなければなりません。コードでは、それは fmod(u, 1) になります。すべての NoFu return ステートメントでそれを使用すると、より良い答えが得られると思います。

于 2012-11-20T22:28:11.747 に答える