1

私が抱えている問題は、OpenGL で「視線」ベクトルを取得できないことです。いくつかの調査を行ったところ、変換後に Z ベクトルである必要があることがわかりましたが、機能したくありません。ブロックの速度を取得するためのこのコードがあります(「カメラ」から前方に移動したい)が、常にカメラとは無関係に移動しますが、レンダリングされた世界と比較して常に同じ方法で移動します:

GLfloat matrix[16]; 
    glGetFloatv (GL_MODELVIEW_MATRIX, matrix);
    GLfloat d = sqrt( matrix[8]*matrix[8] + matrix[9]*matrix[9] + matrix[10]*matrix[10]);
    xmov = matrix[8]/d;
    ymov = matrix[9]/d;
    zmov = matrix[10]/d;

私が間違ったことをしましたか?

4

1 に答える 1

2

さて、あなたが本当にやりたいことを明確にした後、これが正しい答えだと確信しています:

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 ユニットを着陸させます。

とにかく、おそらくそれについての素晴らしいチュートリアルを使用できます

于 2013-01-11T17:21:02.637 に答える