2

この投稿に従って、GluLookAt タイプ マトリックスを作成しました。

LookAt マトリックスの計算

            Method calculateLookAtMatrix(glm::vec3 eye, glm::vec3 center, glm::vec3 up)

    glm::vec3 zaxis = glm::normalize(center - eye);
    glm::vec3 xaxis = glm::normalize(glm::cross(up, zaxis));
    glm::vec3 yaxis = glm::cross(zaxis, xaxis);

    lookAtMatrix[0][0] = xaxis.x;
    lookAtMatrix[0][1] = yaxis.x;
    lookAtMatrix[0][2] = zaxis.x;

    lookAtMatrix[1][0] = xaxis.y;
    lookAtMatrix[1][1] = yaxis.y;
    lookAtMatrix[1][2] = zaxis.y;

    lookAtMatrix[2][0] = xaxis.z;
    lookAtMatrix[2][1] = yaxis.z;
    lookAtMatrix[2][2] = zaxis.z;

    lookAtMatrix[3][0] = glm::dot(xaxis, -eye);
    lookAtMatrix[3][1] = glm::dot(yaxis, -eye);
    lookAtMatrix[3][2] = glm::dot(zaxis, -eye);

    lookAtMatrix[3][3] = 1;

そのCPU側を計算して、透視行列と同じようにユニフォームとしてシェーダーに渡します。

シェーダーはこんな感じ。

 gl_Position =   lookAtMatrix * position * perspectiveMatrix;

単位行列として lookAtMatrix を渡すと、シーンは正しくレンダリングされますが、上記のコードを使用して行列を次のように設定します ...

    eye(0.0f,0.0f,10.0f);
center(0.0f,0.0f,0.0f);
up(0.0f,0.0f,1.0f);

空白のシーンになります。シーンは X/Y に描画された 10x10 のグリッドであるため、ズームアウトされたシーンのビューを期待していました。

(行と列で遊んでみましたが、パースペクティブ マトリックスは問題ないので、99.9% は問題ないと確信しています)

4

2 に答える 2

6
gl_Position =   lookAtMatrix * position * perspectiveMatrix;

これは正しくありません。lookAtMatrix で位置を変換し、その結果を perspectiveMatrix で変換します。

列ベクトル/列主ベクトルおよび行列を使用する場合、ベクトルを行列の右側に配置して、行列とベクトルを乗算します。

したがって、乗算は最終的に次のようになります。

gl_Position =   perspectiveMatrix * lookAtMatrix * position;

そうは言っても、そもそもなぜあなたが左の位置にあったのかわからないので、パイプラインのどこかで行列の転置を行っているのだろうか. この解決策が機能しない場合は、さらにコードを表示する必要がある場合があります。

于 2012-09-19T04:44:46.800 に答える
3
eye(0.0f,0.0f,10.0f);
center(0.0f,0.0f,0.0f);
up(0.0f,0.0f,1.0f);

upベクトル方向は視線方向に平行です。これは許可されていません。

覚えておいてください: 上方向は、ビューの「上」が何を意味するかを定義します。視線方向を中心とした回転を定義します。上方向視線方向である場合、計算は機能しなくなります。

于 2012-09-18T23:29:56.850 に答える