• ベストアンサー

OpenGLの「見える範囲」は何故「-1.0~+1.0」なのか?

OpenGLにおいて、ユーザーが特に指定をしなければ、画面の右向きが+x方向、上向きが+y方向、奥向きが-z方向となり、それぞれ-1.0~1.0までの範囲が「見える」範囲になる、というのがデフォルトらしいですが、その「理由」を教えていただけませんでしょうか? 参考になるサイトのURL等があれば、あわせて教えていただけると助かります。

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

  • ベストアンサー
  • kmb01
  • ベストアンサー率45% (63/138)
回答No.2

1、-1.0から1.0にしておけば、さまざまなウィンドウサイズに対応できるから。 ウィンドウサイズはglViewportで指定します。 2、デフォルトが単位行列だから。 3次元形状がどのように見えるかは、 1,カメラの位置と方向 2,カメラの見える範囲と投影方法(平行投影、透視投影) によって決まります。 1も2もOpenGLでは4x4の行列で表され、描画時にこれらの行列を掛けて全体的な変換行列を求め、それとワールド座標系の3次元座標を掛けることにより、カメラ位置から見た形状が求まるわけです。 1の行列はビュー変換行列、gluLookAtで指定します。 2の行列はプロジェクション変換行列、glOrtho、gluPerspective等で指定します。 何も指定しないとデフォルトの単位行列になり、 ビュー変換行列が単位行列である意味は、 カメラ位置(0,0,0)、 ワールドベクトル(1,0,0) -> カメラ右向きベクトル(1,0,0) ワールドベクトル(0,1,0) -> カメラ上向きベクトル(0,1,0) ワールドベクトル(0,0,1) -> カメラ手前向きベクトル(0,0,1) の変換を行う行列ということであり、 プロジェクション変換行列が単位行列である意味は、 カメラ位置から上下左右前後に-1.0から1.0を-1.0から1.0に変換する行列ということです。 したがってここで変換される-1.0から1.0がGLの見える範囲でないと、さらに変換が必要になりまずいわけです。 実際に手計算で3次元座標がどのように見えるか計算してみると理解しやすいです。

参考URL:
http://www.users.yun.co.jp/~studiowing/etc/index.htm
kunimi923
質問者

お礼

非常にわかりやすい解説ありがとうございました。

その他の回答 (1)

  • terra5
  • ベストアンサー率34% (574/1662)
回答No.1

推測ですので違うかも知れません。 座標系はいろいろありますが、特に指定がなければ数学などで一般的に使う3次元のXYZの座標系を使うのが普通だろう考えます。 で画面ですが、やはり横をX軸、縦をY軸、画面に垂直な方向をZ軸と考えるのがもっとも自然でしょう。 Z=0と考えた時に画面という平面になりますし。 で、さっきの一般的な座標系を回転させて画面のXYZに合わせると、右がX+,上がY+,手前がZ+となります。 範囲はどんな値にしてもかまいませんが、実数であつかなら全体を1と考えるのがもっとも自然でしょう。 特定のコンピュータの画面を考えるとか、整数だけで考えるなら他の値も考えられるでしょうが、 OpenGLは特定の用途に限定したものでなく、一般的な3DCGを扱うことを考えていますから、例えば640とか1024という数に意味を持たせるのは不自然です。 逆の発想なのが例えばWindowsのビットマップで、点を表示装置の都合にすぎない画面の一点とするとか、 ハードウェアの描画順(走査線の移動順)に合わせて左上を原点とし右方向をX+,下をY+とし、二次元を基本とするのでZは存在しないとか。

kunimi923
質問者

お礼

レスが遅れてすみません。 ご回答ありがとうございました。