1

私はOpenGLでジェットコースターシミュレーターを作成しようとしてきました。このシミュレーターは、一連のgluLookAt呼び出しを使用して、カメラをジェットコースターに「乗せ」ます。コースター自体は、座標配列に制御点があるbスプライン曲線に基づいています。b0(u)、b1(u)などはb-スプライン曲線のブレンド関数であり、bprime0(u)などはそれらの導関数です。これが私のコードの関連部分です:

for (int i = 0; i <= 10; i++){
        for (float u = 0; u <= 1.1; u+=0.1){

            x = (b0(u)*coords[(i)%10].x + b1(u)*coords[(i+1)%10].x
                + b2(u)*coords[(i+2)%10].x + b3(u)*coords[(i+3)%10].x)*2.0f;
            y = (b0(u)*coords[(i)%10].y + b1(u)*coords[(i+1)%10].y
                + b2(u)*coords[(i+2)%10].y + b3(u)*coords[(i+3)%10].y)*2.0f;
            z = (b0(u)*coords[(i)%10].z + b1(u)*coords[(i+1)%10].z
                + b2(u)*coords[(i+2)%10].z + b3(u)*coords[(i+3)%10].z)*2.0f;

            xprime = (bprime0(u)*coords[(i)%10].x + bprime1(u)*coords[(i+1)%10].x
                    + bprime2(u)*coords[(i+2)%10].x + bprime3(u)*coords[(i+3)%10].x)*-2.0f;
            yprime = (b0(u)*coords[(i)%10].y + bprime1(u)*coords[(i+1)%10].y
                    + bprime2(u)*coords[(i+2)%10].y + bprime3(u)*coords[(i+3)%10].y)*-2.0f;
            zprime = (b0(u)*coords[(i)%10].z + bprime1(u)*coords[(i+1)%10].z
                    + bprime2(u)*coords[(i+2)%10].z + bprime3(u)*coords[(i+3)%10].z)*-2.0f;

            Coords nvector = {xprime,yprime,zprime};
            float magn = sqrt(nvector.x*nvector.x+nvector.y*nvector.y+nvector.z*nvector.z);
            nvector.x= nvector.x/magn;
            nvector.y= nvector.y/magn;
            nvector.z= nvector.z/magn;

            glLoadIdentity();
            if (rotateCam == 1){
                theta+=0.0001;
                if (theta > 360) {
                    theta = 0;
                }
                gluLookAt(20*cos(theta),15,20*sin(theta),0,0,0,0,1,0);
                }//if
            else{
                printf("%f\t%f\t%f\n", x+xprime,y+yprime,z+zprime);
                gluLookAt(x,y+1,z,x+xprime,y+yprime,z+zprime,0,1,0);
            }//else

        }//for
}//for

スペースバーは、2つの表示モードを切り替えることになっている「rotateCam」変数を切り替えます。1つはコースターの周りでカメラを一周し(「if」ステートメント)、もう1つはコースターに乗る(「else」ステートメント)。

これが重要です。旋回モードは正常に機能し、モード間の切り替えは正常に機能しますが、カメラは常に「ライド」モードで静止しています。printfステートメントは、x、xprime、y、yprimeなどがすべてタイマーティックごとに変化することを示していますが、カメラは移動しません。

さらにコードが必要な場合はお知らせください。

4

1 に答える 1

0

gluLookAtセメラを配置するのではなく、正しい角度に回転させるだけです。この後、それを翻訳するのもあなた次第です。したがって、これでうまくいくはずです:

gluLookAt(x,y+1,z,x+xprime,y+yprime,z+zprime,0,1,0);
gluTranslated(x,y+1,z);
于 2012-11-21T03:04:59.920 に答える