私は現在、自分の2D Mathsライブラリを使って、基礎となる行列演算の理解を深めています。 これまで私はGLMのようなライブラリを使っていましたが、学習経験として検討する価値があるように感じました。カスタムビューマトリックスでのストレッチ問題
これのほとんどはわかりやすく、数学クラスの大半はOpenGLと統合されていますが、私のビューマトリックスはウィンドウの端に四辺を伸ばしているようです。
これは遠近法の問題ではないことに注意してください。私は正書法マトリックスを使用していますが、MVPの代わりにビューマトリックスを使用してこれをMVPから分離しました。 (私が正しく理解していれば)行列が主要な柱です
Matrix4x4 GenerateView(const Vector2f &cameraPosition)
{
Matrix4x4 mat;
//Right
mat.elements[0][0] = 1;
mat.elements[0][1] = 0;
mat.elements[0][2] = 0;
mat.elements[0][3] = -Dot(cameraPosition.x, cameraPosition.y, 10, 1, 0, 0);
//Up
mat.elements[1][0] = 0;
mat.elements[1][1] = 1;
mat.elements[1][2] = 0;
mat.elements[1][3] = -Dot(cameraPosition.x, cameraPosition.y, 10, 0, 1, 0);
//Look
mat.elements[2][0] = cameraPosition.x;
mat.elements[2][1] = cameraPosition.y;
mat.elements[2][2] = -1;
mat.elements[2][3] = -Dot(cameraPosition.x, cameraPosition.y, 10, cameraPosition.x, cameraPosition.y, -1);
//Last Column
mat.elements[3][0] = 0;
mat.elements[3][1] = 0;
mat.elements[3][2] = 0;
mat.elements[3][3] = 1;
return mat;
}
:
は、以下の私のビュー行列生成コードです。 「ルック」がフォワードユニットベクタを参照しているかどうかはわかりませんでしたので、「センター」と同様にそれを試みましたが、問題は解決しません。
//Look
mat.elements[2][0] = 0;
mat.elements[2][1] = 0;
mat.elements[2][2] = -1;
mat.elements[2][3] = -Dot(cameraPosition.x, cameraPosition.y, 10, 0, 0, -1);
最後に、ケースには誰もが内積が正しく実装されていることを疑う:
float Dot(float x1, float y1, float z1, float x2, float y2, float z2)
{
return x1 * x2 + y1 * y2 + z1 * z2;
}