さて、あなたが本当にやりたいことを明確にした後、これが正しい答えだと確信しています:
ModelView
おそらくマトリックスと呼ばれるものに慣れているでしょう。本質的に2つの部分が組み合わされているのは奇妙に思われませんでしたか? まあ、それは私のためでした、そしてしばらく考えた後、それは理にかなっています. 最終的な頂点位置は次のように計算されます。
gl_Position = ProjectionMat * ModelViewMat * VertexPos;
[x,y,z]
おわかりのように、「カメラ」を原点から移動するか、オブジェクトを移動するかにかかわらず、OpenGL には違いはありません[-x,-y,-z]
。同じ結果が得られます。ただし、原点とは異なる可能性があるものとして「カメラ」の位置を区別すると便利です。
gl_Position = ProjectionMat * ViewMat * ModelMat * VertexPos;
私が言ったように、それを行う最も自然な方法は、計算を と の 2 つの行列に分割することだと思いModel
ますView
。シーン上のすべてのオブジェクトはModel
マトリックスを変更する必要があり、カメラの位置はマトリックスを変更することで設定されView
ます。理にかなっていますか?
例を挙げましょう。カメラが[5,0,0]
( に対応するTranslate(-5,0,0)
) にあり、オブジェクトが[-5,0,0]
にある場合、カメラから 10 単位で着陸します。ここで、カメラを原点から遠ざける (最初の移動距離を増やす) と、「カメラ」とオブジェクトの間の距離が長くなります。
オブジェクトの移動はModelで、カメラの移動はViewです。
したがって、カメラの位置を無視したい場合View
は、式からその部分を取り除くだけでよいという結論に達するのは難しくありません。すべてのオブジェクトは、カメラの位置を考慮せずに描画されるようになり、ビューポートに対してのみ相対的になります。
gl_Position = ProjectionMat * ModelMat * VertexPos;
私たちの仮想モデルは、現在「見ている」ものに関係なく、ビューポートから X 軸に沿って 5 ユニットを着陸させます。
とにかく、おそらくそれについての素晴らしいチュートリアルを使用できます