OpenglでのRotation(glRotatef)について
Openglで回転を行うとき、glRotatef()を使っているのですが、
表示画面の縦横の比が1でない場合、たとえばx-y平面に描画した正方形をz軸を中心に90度回転すると
形が正方形になりません。(X-Y平面をまっすぐに見ているので、2Dになっています。)
おそらく、頂点情報は、あくまで画面の縦や横の長さを1とした小数点比で
記載するため、回転をすると、基準の長さが変わってしまって変形するのだと思います。
90度であれば、glScalefなどで、縦横のスケールを変えて正方形に戻すことは出来るのですが、
任意の角度にした場合は、Scalefなどでの補正がうまくいきません。
正方形を正方形のまま回転するにはどうすればよいのでしょうか?
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();
とすると正しく回転できる。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(動画サービス) VLCメディアプレーヤーについて 1 2022/11/29 14:19
- 数学 正八面体の8面を、7色A~Gで塗り分ける方法は何通りあるか(隣り合う面は同じ色でもいいが、回転して一 1 2022/08/04 23:06
- Android(アンドロイド) Googleレンズ ドキュメントをスキャン 1 2022/10/31 12:11
- ホームページ作成・プログラミング グリッドレイアウトHTMLとCSS 1 2023/02/22 02:36
- 数学 数学の問題を教えて下さい。 画像が問題です。 〈解説〉 平行四辺形は常に2本の縦線と2本の横線によっ 3 2023/05/01 19:21
- C言語・C++・C# ある線が円の範囲に入っているかの計算 1 2022/12/07 16:14
- その他(プログラミング・Web制作) 監視カメラを水平につないでパノラマの映像を作りたい 1 2022/09/06 15:26
- 建築士 建築士製図試験での縦距離の数値の書き方を教えて下さい 3 2023/07/16 11:36
- その他(プログラミング・Web制作) GASでガントチャートを作りたいです 1 2022/09/05 17:26
- 数学 数学教えて下さい 中1レベルです。三角柱の側面の形は長方形と回答にありました。この場合、正方形は、長 8 2022/04/13 15:30
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
CSSを一部無効にしたい
-
<input type="file"> の幅
-
リストの前後の行間をなくす方...
-
アンダーラインのカラー
-
ブラウザによって異なるフォン...
-
上付き文字と下付き文字を同時...
-
全角半角含めて等幅で表示したい
-
DreamWeaverで</head>の前のス...
-
Notepad++で日本語文字が化ける。
-
リンク文字
-
background-color: #ddd;の意味...
-
VB6でWebBrowserへスタイルシー...
-
Format 関数 表示書式指定文字...
-
■(四角)の記述
-
CSSのid名class名の重複回避方...
-
テキストファイルの行を指定し...
-
CSSでfont-size、pxの絶対値、...
-
fontサイズ指定の ”-(マイナ...
-
API Sleep関数について
-
PC版のサイトをスマホに対応さ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
CSSについて教えてください。 ...
-
文字の位置、上下のマージンが...
-
リストの前後の行間をなくす方...
-
Format 関数 表示書式指定文字...
-
HTMLで特定の文字だけ色を変え...
-
全角半角含めて等幅で表示したい
-
特定の文字のみcssを適用するに...
-
ホームページビルダー作成HPがi...
-
テキストファイルの行を指定し...
-
リンク文字
-
アコーディオンメニューが思う...
-
テキストエリア内の文字の装飾
-
API Sleep関数について
-
Excel VBA メール作成について ...
-
<pre>のフォントサイズを指定す...
-
上付き文字と下付き文字を同時...
-
指定の文字だけ色を変える
-
background-color: #ddd;の意味...
-
CSSを一部無効にしたい
-
h1タグのパンくずリストへの設置
おすすめ情報