• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:OpenglでのRotation(glRotatef)について)

OpenglでのRotation(glRotatef)について

このQ&Aのポイント
  • OpenglのglRotatef()を使用して回転を行う際、表示画面の縦横の比が1でない場合、正方形が変形する問題が発生します。
  • 回転をすると頂点情報の基準の長さが変わるため、正方形が崩れてしまいます。90度であればglScalefで補正できますが、任意の角度ではうまくいきません。
  • 正方形を正方形のまま回転させるためには、縦横のスケールを適切に変える必要があります。

質問者が選んだベストアンサー

  • ベストアンサー
  • qwertfk
  • ベストアンサー率67% (55/81)
回答No.1

> 表示画面の縦横の比が1でない場合、たとえばx-y平面に描画した正方形をz軸を中心に90度回転すると > 形が正方形になりません。(X-Y平面をまっすぐに見ているので、2Dになっています。) というのがよくわからなかったのですが、頂点座標を設定する場合にビューのアスペクト比を考慮しているということでしょうか? 予想ですが、 int w , h ; // ビューのたてとよこの幅が入っているとする float aspect = (float)w/(float)h; float size = 0.8f; float sx = size; float sy = size * aspect; glBegin(GL_QUAD); glVertex2f( sx , sy ); glVertex2f( -sx , sy ); glVertex2f( -sx , -sy ); glVertex2f( sx , -sy ); glEnd(); こんな感じでしょうか。 これで、回転させれば形状の長いほうと短いほうが交換されて正方形でなくなる、ということになっている、ということかと思ったのですが、違うでしょうか。 もしそうであれば、という前提で対策を書きますと、基本的には、画面のアスペクト比は投影行列を使って補正するのが一般的です。すなわち、 int w , h ; // ビューのたてとよこの幅が入っているとする float aspect = (float)w/(float)h; float vx = 1.0f; float vy = 1.0f * aspect; glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho( -vx , vx , -vy , vy , -1.0f , 1.0f ); // ↑引数の順序忘れたので適当です... glMatrixMode(GL_MODELVIEW); float size = 0.8f; glBegin(GL_QUAD); glVertex2f( size , size ); glVertex2f( -size , size ); glVertex2f( -size , -size ); glVertex2f( size , -size ); glEnd(); こんな感じ。回転する場合は、 glMatrixMode(GL_MODELVIEW); glRotated(...); float size = 0.8f; glBegin(GL_QUAD); glVertex2f( size , size ); glVertex2f( -size , size ); glVertex2f( -size , -size ); glVertex2f( size , -size ); glEnd(); とすると正しく回転できる。

maldive
質問者

お礼

>qwertfkさん まさに私が知りたかったのがこのことです。 的確なアドバイス誠にありがとうございました。

関連するQ&A