4

それを説明する適切な用語がわからないため、Google で見つけることができません。私が望むのは、オブジェクト、具体的には 2D の四角形をスケーリングすることですが、XY 座標を維持することです。

私の現在の解決策はこれです:

glTranslatef(x, y, 0);
glScalef(scaleX, scaleY, 0);
glTranslatef(-x, -y, 0);
drawRect(x, y, width, height, texture);

glScale を glRotate としてその中心で回転させるふりをするだけですが、多少は機能しますが、他の値にスケーリングすると、座標が少し調整されることがわかります。

また、glTranslate を実行するか、頂点に x、y などの変数を適用するのが適切かを判断します。これらの 2 つから切り替えても違いはわかりませんが、「プッシュ マトリックスとポップ マトリックス」を追加すると、シーン上の他のオブジェクトの動作とプログラムのパフォーマンスに影響するのではないかと心配しています。これは、この長方形をたくさん使用するためです。

アップデート:

だからあなたは私が達成したい方法を簡単に視覚化することができます

最高のAdobe Photoshop

4

2 に答える 2

4

< x, y, 0> は、「正規の」座標系 (つまり、最初の座標系) での長方形の左下隅の位置であると思います。

これらの仮定により、スケーリングを行う前に、モデルビュー スタックを ID にリセットし、オブジェクト スペースに移動することで目標を達成できます。したがって、実際にはかなり近いですが、以前にモデルビュー マトリックスで行ったことによっては、結果にばらつきが生じる可能性があります。

次のコードは、あなたが望むことをするはずです:

glPushMatrix();
glLoadIdentity();
glTranslatef(x, y, 0);
// now in "object space"
glScalef(scaleX, scaleY, 0);
drawRect(0, 0, width, height, texture);
glPopMatrix();

関数が何をするのかはわかりませんが、一連のand呼び出しをdraw発行するだけだと思います。それはモデルビューマトリックスに干渉しません。そうしないと、私のコードがそれを壊してしまう可能性があります。glVertexglTexCoord

glPushMatrixすべてのオブジェクト レンダリングをand呼び出しでラップする場合glPopMatrix、その呼び出しは不要であり、非glLoadIdentity生産的でさえあることに注意してください。たとえば、オブジェクト データを階層として編成し、各サブ オブジェクトをそのコンテナーに対して相対的に配置する場合、オブジェクト階層を再帰的にレンダリングする際に、その呼び出しを完全に削除する必要があります。

もう 1 つの懸念事項は、効率性です。行列の保存と復元は、かなりコストのかかる操作です。あなたの質問コードが即時モードを使用していることを考えると、それはあなたの主な関心事ではないと思いました. オブジェクト変換を手動で (つまり、独自の行列ライブラリで計算して) 適用し、opengl モデルビュー操作ルーチンを呼び出さずに opengl に送信する方が確実に高速です。ただし、それは別の(より数学指向の)質問と回答でカバーする必要があります。

于 2013-06-21T05:37:30.600 に答える
0

ポイントを固定phiしたままにする (他のアフィン変換にも適用される)角度による回転の一般的なパターンは次のとおりです。(x,y)

TRANSLATE(-x, -y)
ROTATE(phi)
TRANSLATE(x, y)

変換は上から順に適用されます。つまり、ポイント(x,y)を の原点に移動しています(0,0)。したがって、実際の回転の影響を受けません。完了したら、2 番目の翻訳は最初の効果を逆にします。

これは OpenGL に限定されるものではなく、(行列または四元数による) アフィン変換をサポートするあらゆるタイプのグラフィックス処理に適用されます。

于 2013-06-21T08:25:20.473 に答える