プロが教えるわが家の防犯対策術!

OpenglでのRotation(glRotatef)について
Openglで回転を行うとき、glRotatef()を使っているのですが、
表示画面の縦横の比が1でない場合、たとえばx-y平面に描画した正方形をz軸を中心に90度回転すると
形が正方形になりません。(X-Y平面をまっすぐに見ているので、2Dになっています。)
おそらく、頂点情報は、あくまで画面の縦や横の長さを1とした小数点比で
記載するため、回転をすると、基準の長さが変わってしまって変形するのだと思います。
90度であれば、glScalefなどで、縦横のスケールを変えて正方形に戻すことは出来るのですが、
任意の角度にした場合は、Scalefなどでの補正がうまくいきません。
正方形を正方形のまま回転するにはどうすればよいのでしょうか?

A 回答 (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();

とすると正しく回転できる。
    • good
    • 0
この回答へのお礼

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

お礼日時:2010/03/09 10:24

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!