0

これが取り引きです。私はopengl ESで2Dフレームワーク/ゲームエンジンをプログラミングしています。私は VBO とオルソ プロジェクションを使用して、(テストの一環として) 画面全体にスプライトの配置を描画しています。移動と回転をいじるまでは、すべてがうまくスムーズに進みました。私が抱えている特定の問題は、回転の前に glTranslatef() で変換を適用すると、関数がスプライトだけでなく原点も移動し、変換全体が台無しになることです。glTranslatef() を使用して画面のサイズの半分のスプライトを右と下に移動し (はい、私の原点は左上にあります)、一定の回転を適用するため、このように機能していることは 100% 確信しています。そして、物は画面の中心の周りを円形の経路で動き続けます(実際には回転しますが、期待どおりではありません.

コードが必要な場合は、次のようにします。

gl.glTranslatef(-(x+width/2), -(y+height/2), -layer);
gl.glRotatef(angle, 0.0f, 0.0f, -1.0f);
gl.glTranslatef(x+width/2, y+height/2, layer);

このコードの断片では、x と y はスプライトの位置、高さと幅はスプライトのサイズ、角度は回転角度、レイヤーはスプライトをいくつかのレイヤーに編成する形式です。 ?

繰り返しますが、私の問題は glTranslatef(); です。スプライトとオリジンの両方を動かしています。何か間違ったことをしているのですか、それとも翻訳について何か誤解していますか?

前もって感謝します。

4

2 に答える 2

0

openGL で行列がどのように機能するかを誤解していると思います。glRotatef や glTranslatef などの行列操作を行うと、行列が乗算され、基本ベクトルに影響を与えます。たとえば、(0,0,0) で始まる点のみを描画しているとします。translate(1,0,0) を呼び出すと、ポイントは (1,0,0) になり、その後、rotate(90, 0, 0, 1) を呼び出すと、ポイントは以前と同じ場所になりますが、回転しました。最後の呼び出しは translate(-1,0,0) で、ポイントは (1,-1,0) です (開始した場所ではありません)。

そして、それが「コードの断片」で行ったことです。問題は、あなたが本当にやりたいことを指定していないことと、ベリセスをどのように定義するかが相対的であることです。位置と回転を変更するという意味で制御したい画像を含むビューのようなものが必要な場合は、両方の次元 (または (-width/2, -height/2) から (width/2, height/2)) で -1 から 1 までの値を持つ正方形の頂点バッファーを作成することができます。この場合、オブジェクトのベースセンターは (0,0,0) にあり、おそらく回転させたいポイントです (または、ここで間違っていますか?)。したがって、原点でオブジェクトの位置を定義したい場合は、translatef(x+width/2,y+height/2,..) と記述する必要があります。

この場合の描画プロセス全体について:原点を(x、y、z)に、(幅、高さ)で(角度)回転させたい場合は、次のシーケンスがあります

glTranslatef(x,y,z)
glTranslatef(width/2,height/2,0)
glScalef(width/2,height/2, 1) //only if verices defined at (-1,1)
glRotatef(angle, 0, 0, 1)

この場合、オブジェクトをその中心を中心に回転させるため、原点が (x,y,z) になくなることに注意してください。

一般に、可能であれば、glRotate、glTranslate、および glScale から離れることをお勧めします。彼らは物事を非常に厄介にする傾向があります。別の方法は、基本ベクトルから直接マトリックスを構築することです。ほとんど数学を使用せずに、原点、幅、高さ、回転などのパラメーターに基づいて、「正方形ビュー」の 4 つのポイントすべてを計算できます。4 つのポイントは (A-origin )、(B-左下の点)、(C-右下の点)、(D-右上の点) 基本ベクトルは (BA)、(DA) および正規化された(dotProduct((BA), (DA)))この 3 つのベクトルは、GL マトリックスの左上の 3x3 マトリックス (ウィッチは 4x4 または float[16]) に挿入でき、回転とスケールの両方を表すため、追加する必要があるのは変換部分だけです (ちょっとググってみてください)。このアプローチ)。

于 2012-12-04T14:14:13.690 に答える
0

glPushMatrix と glPopMatrix を使用する必要があるかもしれません。これらの変換と回転の後に行うことはすべてそれらの影響を受けるためです。

しかし、あなたが説明しているのは実際にそれがどのように機能するかです。翻訳を使用すると、それが新しい原点になります。翻訳を行うと、その後のすべてがその翻訳の影響を受けるため、プッシュとポップが必要な理由です。プッシュ -> オブジェクトの移動および/または回転 -> ポップを実行すると、以前の移動が他のすべてに影響を与えることなく、必要な他の移動を行うことができます。

最初は少し混乱しますが、グーグルで検索すると、それらを適切に使用する方法がわかります

http://www.khronos.org/opengles/sdk/1.1/docs/man/glPushMatrix.xml

于 2012-12-04T09:15:16.807 に答える