0

私はプログラムを開発し、このモジュールには多くの形状クラスがあります。ここにある四角形などの形状クラスとdraw、クラスから継続的に呼び出される関数を考えてみましょう。

virtual void draw()
{
if(State == HOVERING || State == CLOSED){                   
rec.draw(playerContainer);
gluLookAt(lookAtPoint);
}
else if(State == OPENING)
{
glPushMatrix();         
glTranslatef(Tweenable3D::pos.x,Tweenable3D::pos.y,Tweenable3D::pos.z);
glRotatef(Tweenable3D::xRotation,-1,0,0);                        
glTranslatef(-Tweenable3D::pos.y,-Tweenable3D::pos.y,-Tweenable3D::pos.z);
rectShape.draw(Tweenable3D::pos.x, Tweenable3D::pos.y, Tweenable3D::width, Tweenable3D::height);
glTranslatef(ofGetWidth()/2, ofGetHeight()/2,0);
glPopMatrix();
}
else
{
setPosition(vidPlayerFinalPosition);
rectShape.draw(vidPlayerFinalPosition, vidPlayerFinalWidth, vidPlayerFinalHeight);
ofCircle(vidPlayerFinalPosition, 30);
ofVec3f looks(0,0,0);
lookAt(looks);
}
}

2Tweenable3D番目に使用される は、アニメーション用に補間された値に他なりません。そんな感じで回転や平行移動などのアニメーションをやっています。

ここでの問題は、最初は私の形がカメラの中にあるということです。2 番目の if 条件では、上で書いたようにいくつかのアニメーションを実行する必要があります。ただし、プログラムにカメラを含めると、めちゃくちゃになり、座標が画面の中央に変換されます (最初の座標は左上にあります)。

このカメラの変換を修正するために独自の変換を行うか、ワールドからスクリーン/スクリーンからワールドなどを試す必要があります。
このオブジェクトをカメラから取り出し、アニメーションなどを実行し、後で行う方法があるかどうか疑問に思っていましたその他の場合は、必要に応じてカメラに戻すこともできます。オブジェクトがカメラの外にあると言うのは正しくないかもしれません (おそらく、既にそこにある数学関数がその効果を得るのに役立つでしょう)

4

1 に答える 1

0

あなたが話しているそのカメラは何ですか?OpenGL には「カメラ」がありません。何が「カメラ」で何がそうでないかは、完全にあなた次第であり、あなたのコードが実装するセマンティクス次第です。

あなたの間違いは、OpenGLをシーングラフと混同していることだと思いますが、そうではありません。固定関数モードでは、多数のマトリックスがあり、入力した数値に基づいて個々の点、線、三角形を画面に表示し、それらのマトリックスを処理します。シーンもオブジェクトもオブジェクト階層もありません。


また、「オブジェクトがカメラにある」とはどういう意味ですか?

于 2013-01-18T11:11:04.610 に答える