4

遠近法のFOVがありますが、回転すると「見た目」が正しくありません。遠くのオブジェクトは、近くのオブジェクトよりも速く移動し、画面の中央を通過します。

だから:これは正しいですか?それが重要な場合は、右手座標を使用しますか?

    public static Matrix4x4 PerspectiveFOV(float fov, float aspect, float near, float far)
    {
        float yScale = 1.0F / (float)Math.Tan(fov / 2);
        float xScale = yScale / aspect;
        float farmnear = far - near;
        return new Matrix4x4(
            xScale, 0, 0, 0,
            0, yScale, 0, 0,
            0, 0, far / (farmnear), 1,
            0, 0, -near * (far / (farmnear)), 1
            );
    }

ありがとう。

4

2 に答える 2

8

いくつかの問題があります。まず、tan()の引数を度からラジアンに変換する必要があります。

次に、OpenGLでの透視投影の式は、実際の式とは少し異なります。ここで指定されているように、分母には「far-near」ではなく「near--far」が使用されます。分子の用語も異なります。関数を少し変更し、JavaからCに変換して、gluPerspective()で指定されたものと同じ射影行列を次のように作成しました。

static void my_PerspectiveFOV(double fov、doubleアスペクト、double near、double far、double * mret){
    ダブルD2R=M_PI / 180.0;
    double yScale = 1.0 / tan(D2R * fov / 2);
    double xScale =yScale/アスペクト;
    double nearmfar = near --far;
    ダブルm[]= {
        xScale、0、0、0、
        0、yScale、0、0、
        0、0、(遠い+近い)/近いmfar、-1
        0、0、2 * far * near / nearmfar、0
    };
    geom_matrix4_copy(m、mret);
}
于 2012-05-25T17:15:27.317 に答える
3

このような質問については、優れたリソースを提案します: https ://www.scratchapixel.com/lessons/3d-basic-rendering/perspective-and-orthographic-projection-matrix それは実際に射影行列の詳細に入ります。これらは、カメラ、カメラ光線の構築などのトピックに関するより多くのレッスンです。いくつかの掘り下げを行う必要があります。

于 2013-09-22T22:50:55.820 に答える