画面にオブジェクトが見える条件

最終更新日16 Mar 2018 04:19

正投影行列の場合

vec4 clip_coord=projection*view*model*position;

モデルビュー投影行列を掛け算した後の頂点の値の範囲が±1.0だと画面に入ることができる。
つまり正規化デバイス座標で±1.0だったら画面内ということ。
そこで、シーン全体のバウンディングボックスから正投影行列を求めると、画面ぴったりに収まる行列を求めることができる
vec3 scene_range = scene_max_vertex - scene_min_vertex;
float ortho_size = (scene_range.x)*0.5f;
mat4 ortho_proj = glm::ortho(-ortho_size, ortho_size, -ortho_size, ortho_size, 0.0, scene_range.z+1.0f);
mat4 view_matrix_from_z = glm::lookAt(vec3(0, 0, scene_range.z), vec3(0, 0, 0), vec3(0, 1, 0));

必須条件

  • glViewPort(0,0,ウィンドウ幅,ウィンドウ高さ);は不動(いつ、いかなるときも同じ)
  • fovy(field of view)は正の値1
  • nearとfarは正の値
    • かつ、near<farである。

必須ではないが、間違えるとマウス入力と3次元空間での辻褄が合わなくなる条件

  • gluLookAt(カメラX,カメラY,カメラZ…);のカメラZが正
  • あるいはglTranslatef(0,0,負)

gluLookAtでカメラ位置を渡すときはでglTranslateでカメラ位置のつもりをするときはになる、のが注意。

困ったときのお助けコード

これなら絶対に原点にあるものは見える!!
かつ、マウス入力と画面が感覚的に一致。
glCullFace(GL_BACK);でカリングされるものにも納得

void reshape(){
glViewPort(0,0,w,h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(35.0,w/h,1.0.20.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0,0,2.0,0,0,0,0.0f,1.0f,0.0f);
}

camera


ファイル

サポートサイト Wikidot.com camera