OpenGLでカメラっぽいことを考えた
よく考えたらOpenGLでカメラが動くような場合にどうするんだろう?ってふと思ってさ。
ネットで調べてもどこもたいして重要な項目としては扱ってないんだ。カメラを動かそうがオブジェクトを動かそうが同じだ、modelViewMatrixでいいでしょ、みたいなことらしいんだけどさ。
とりあえず試してみたのよ。
あるオブジェクトのmodelViewMatrixを作ったとするよ。今までならGPUにこいつを渡すだけなんだけど、ここでカメラを考慮した行列(cameraViewMatirxとでもしておくよ)をかけあわせる。
各オブジェクトのmodelViewMatrixは当然位置や角度などが違うだろうからオブジェクトごとにあるけど、このcameraViewMatirxは当然全オブジェクトに対して同一のモノね。
こんな感じでmodelViewMatrixを"修正”すれば今までのコードはほとんど修正しなくてもいいよね。
最初はカメラ用の行列をGPUに渡せるようにしないといけないのかなと思っていたし。
ちなみに平行移動の部分と回転の部分を前後入れ替えると見え方が変わる。
↑平行移動→回転の場合
↑回転→平行移動の場合
どちらもカメラが動いているようなものなので回転による遠心力なんかは当然ないよ。
とりあえずこんな感じで見た目の調整(全体を大きくするとか下にずらすとか)を行えるということがわかったよ。
ネットで調べてもどこもたいして重要な項目としては扱ってないんだ。カメラを動かそうがオブジェクトを動かそうが同じだ、modelViewMatrixでいいでしょ、みたいなことらしいんだけどさ。
とりあえず試してみたのよ。
あるオブジェクトのmodelViewMatrixを作ったとするよ。今までならGPUにこいつを渡すだけなんだけど、ここでカメラを考慮した行列(cameraViewMatirxとでもしておくよ)をかけあわせる。
各オブジェクトのmodelViewMatrixは当然位置や角度などが違うだろうからオブジェクトごとにあるけど、このcameraViewMatirxは当然全オブジェクトに対して同一のモノね。
{ GLKMatrix4 cameraViewMatrix = GLKMatrix4Identity; cameraViewMatrix = GLKMatrix4Translate(cameraViewMatrix, cameraX, cameraY, cameraZ);//平行移動 cameraViewMatrix = GLKMatrix4RotateX(cameraViewMatrix, cameraRotX);//回転 cameraViewMatrix = GLKMatrix4RotateY(cameraViewMatrix, cameraRotY); cameraViewMatrix = GLKMatrix4RotateZ(cameraViewMatrix, cameraRotZ); modelViewMatrix = GLKMatrix4Multiply(cameraViewMatrix,modelViewMatrix); }各パラメータが何を指すかとか厳密なことは置いといて、、、
こんな感じでmodelViewMatrixを"修正”すれば今までのコードはほとんど修正しなくてもいいよね。
最初はカメラ用の行列をGPUに渡せるようにしないといけないのかなと思っていたし。
ちなみに平行移動の部分と回転の部分を前後入れ替えると見え方が変わる。
↑平行移動→回転の場合
↑回転→平行移動の場合
どちらもカメラが動いているようなものなので回転による遠心力なんかは当然ないよ。
とりあえずこんな感じで見た目の調整(全体を大きくするとか下にずらすとか)を行えるということがわかったよ。
スポンサーサイト