Skip to content

Latest commit

 

History

History
61 lines (41 loc) · 1.69 KB

24.透视变换.md

File metadata and controls

61 lines (41 loc) · 1.69 KB

GameEngine Java 3D V2.0

24.透视变换

在讲摄像机之前 我们必须先讲到透视变换 将 现在所处的世界坐标系转化到 摄像机坐标系

透视投影

cmd-markdown-logo

cmd-markdown-logo

透视投影公式证明过程

世界坐标系向摄像机坐标系转化 --->摄像机矩阵

cmd-markdown-logo

先在四维矩阵里加入投影变化

    /*
    * 
    * 投影
    * */
    public Matrix4f initProjection(float fov, float width, float height, float zNear, float zFar)
    {
        float ar = width/height;
        float tanHalfFOV = (float)Math.tan(Math.toRadians(fov / 2));
        float zRange = zNear - zFar;

        m[0][0] = 1.0f / (tanHalfFOV * ar);	m[0][1] = 0;					m[0][2] = 0;	m[0][3] = 0;
        m[1][0] = 0;						m[1][1] = 1.0f / tanHalfFOV;	m[1][2] = 0;	m[1][3] = 0;
        m[2][0] = 0;						m[2][1] = 0;					m[2][2] = (-zNear -zFar)/zRange;	m[2][3] = 2 * zFar * zNear / zRange;
        m[3][0] = 0;						m[3][1] = 0;					m[3][2] = 1;	m[3][3] = 0;

        return this;
    }

加入投影变换

    /*
    * 获得变换矩阵
    * */
    public Matrix4f getTransformation()
    {
        Matrix4f translationMatrix = new Matrix4f().initTranslation(translation.getX(), translation.getY(), translation.getZ());
        Matrix4f rotationMatrix = new Matrix4f().initRotation(rotation.getX(), rotation.getY(), rotation.getZ());
        Matrix4f scaleMatrix = new Matrix4f().initScale(scale.getX(), scale.getY(), scale.getZ());
        return translationMatrix.mul(rotationMatrix).mul(scaleMatrix);
    }