-1

理由はわかりませんが、z軸がバグっているようです(値が2倍になっているようです)

これは立方体のはずです

https://scontent-mad1-1.xx.fbcdn.net/hphotos-xtp1/v/t34.0-12/11998230_879538255460372_61658668_n.jpg?oh=dd08fee0a66e37bf8f3aae2fba107fa1&oe=55F6170C

しかし、間違っているように見えるのは「深さが大きい」ようです

私のpr_Matrix:

    mat4 mat4::prespective(float fov, float aspectRatio, float near, float far){
        mat4 result;

        float yScale = 1.0f / tan(toRadians(fov/2.0f));
        float xScale = yScale / aspectRatio;

        float frustumLength = far - near;

        result.elements[0 + 0 * 4] = xScale;
        result.elements[1 + 1 * 4] = yScale;
        result.elements[2 + 2 * 4] = -(far + near) / frustumLength;
        result.elements[3 + 2 * 4] = -1.0f;
        result.elements[2 + 3 * 4] = -(2.0f * far * near) / frustumLength;

        return result;
    }

私のml_Matrix:

        maths::mat4 &ProjectionMatrix(){

            maths::mat4 m_ProjM = maths::mat4::identity();

            m_ProjM *= maths::mat4::translation(m_Position);

            m_ProjM *= maths::mat4::rotation(m_Rotation.x, maths::vec3(1, 0, 0));
            m_ProjM *= maths::mat4::rotation(m_Rotation.y, maths::vec3(0, 1, 0));
            m_ProjM *= maths::mat4::rotation(m_Rotation.z, maths::vec3(0, 0, 1));

            maths::mat4 scale_matrix = maths::mat4(m_Scale);
            scale_matrix.elements[3 + 3 * 4] = 1.0f;

            m_ProjM *= scale_matrix;
            return m_ProjM;
        }

私の vw_matrix (カメラ)

        void update(){
            maths::mat4 newMatrix = maths::mat4::identity();
            newMatrix *= maths::mat4::rotation(m_Pitch, maths::vec3(1, 0, 0));
            newMatrix *= maths::mat4::rotation(m_Yaw, maths::vec3(0, 1, 0));
            newMatrix *= maths::mat4::translation(maths::vec3(-m_Pos.x, -m_Pos.y, -m_Pos.z));
            m_ViewMatrix = newMatrix;
        }

glsl コードでの私の行列乗算:

vec4 worldPosition = ml_matrix * vec4(position, 1.0);
vec4 positionRelativeToCamera = vw_matrix * worldPosition;
gl_Position = pr_matrix * positionRelativeToCamera;

編集:私はそれを手に入れたと思います!(時間があれば数学を再確認します)ほとんどのチュートリアル(つまり、私のコードのソース)はmat4::prespective(float fov、floatspectRatio、float near、float far)を使用しますが、彼らが言わないことは"fov" は "fovy" (つまり "vertical field of view") を意味し、結果は次の単純な変更で "通常のゲームの fov" を再現しているように見えます:

        float xScale = 1.0f / tan(toRadians(fov/2.0f));
        float yScale = xScale * aspectRatio;

fovの問題として指摘してくれてありがとうHenk De Boer

4

2 に答える 2

1

これは単に FOV の結果であり、提供する FOV によって画像の見え方が大きく変わります。何を選ぶかは個人の好みの問題です。自然な感じのシーンを得るには、45 ~ 60 の値が適していますが、これを強化して、シーンをより即時に感じさせたり、アクションのペースを速めたりすることができます。次の画像にはまったく同じジオメトリが 2 つありますが、右側のドックは 90 度の FOV でビューポート内にはるかに突き出ていることを確認してください。

ここに画像の説明を入力

于 2015-09-13T13:11:05.547 に答える
0

私の推測では、次のように宣言します。

mat4 result;

マトリックスをアイデンティティに初期化するデフォルトのコンストラクターを呼び出しています。

次に、マトリックスを設定する後続のコードで、次の呼び出しが必要です。

result.elements[3 + 3 * 4] = 0.0f;

また、価値があるのは、私のコードでは次の行です。

result.elements[3 + 2 * 4] = -1.0f;
result.elements[2 + 3 * 4] = -(2.0f * far * near) / frustumLength;

否定されません。TBH、心配する必要があるかどうかはわかりません。

于 2015-09-13T04:54:52.303 に答える