射影変換とモデリング変換

1.変換行列(Matrix)の設定

 glMatrixModeを設定する >> 使用する行列を設定する.

    射影変換をする場合
        glMatrixMode GL_PROJECTION
    モデリング変換をする場合
        glMatrixMode GL_MODELVIEW

2.射影変換

 平行投影(正射影)

        glOrtho left, right, bottom, top, near, far
        2次元の場合:glOrtho2D left, right,bottom, top

    例)glOrtho -2,2,-2,2,-1,1

 透視投影

        glFrustum left, right, bottom, top, near, far 
             left,right,bottom,topはクリッピング面の座標
            near,farは遠近クリッピング面の視点からの距離
      gluPerspective fovy, aspect,zNear,zFar
             fovy:視界角度0〜180°
             aspect: w/h
             zNear, zFarはクリッピング面の負のz軸に沿った距離

 ビューポートの設定
        定義されたウィンドウに対するビューポートの大きさを定義する.
         glViewport x, y, width, height

        例)glViewport 0,0,Picture1.Scalewidth, Picture1.ScaleHeight
              但し,Picture1.Scalemode = vbPixels
            これを以下のようにすれば縦に縮小された画面が表示される.
 

3.モデリング変換

 移動  glTranslate{fd} x, y, z
             例) glTranslatef 0.0, 0.5, 0.5
 回転    glRotate{fd} angle, x, y, z
             例) glRotatef 45.0, 0.0, 1.0, 0.0    'Y軸まわりに45度回転する場合
 拡大・縮小 glScale{fd} x, y, z
             例) glScalef 2.0, -0.5, 1.0

   注意)移動・回転・縮小の順序により,描画される図形は異なるので要注意

 視界変換
    視点位置の設定と回転は,すべての物体の移動・回転と考えればよい.

(注意)
   VB上で,
    THETA=30
    glRotatef THETA, 0,1,0
 等とすると,「変数の型が一致しません」等のエラーが生じる場合があります.
 このようなエラーが生じる場合,変数を()でくくるとエラーが回避できます.
 ()でくくることにより,変数はアドレスではなく値として引き渡されます.
  glRotatef (THETA), 0, 1, 0
 
 
問題
1)perse2.frmのサブプロシージャDrawの中のglLoadIdentityを削除した場合,Command1ボタンを押すことによる効果の違いを確認するとともに,それがどうして行なわれるのかを考えなさい.
2)Z軸の負の方向に対して,立方体の中心の間隔0.6として10個の立方体を描くよう,perse2.frmを改変しなさい.
 (For ..Nextを用いる)
3) 2)に加え,yの正の方向に対してそれぞれの間隔0.2となるようプログラムを改変しなさい.
4) 2)をもとに,glRotatefを用いて,立方体が円周上に配置されるようプログラムを改変しなさい.