OpenGL ES 3. 坐标系及坐标变换

大家好,接下来将为大家介绍OpenGL ES 3. 坐标系及坐标变换。

一、坐标系、坐标空间:

OpenGL使用的是笛卡尔右手坐标系。

OpenGL共有5个比较重要的坐标空间:

a:局部空间(Local Space,或者称为物体空间(Object Space))。

b:世界空间(World Space)。

c:观察空间(View Space,或者称为视觉空间(Eye Space))。

d:裁剪空间(Clip Space)。

e:屏幕空间(Screen Space)。

       为了将坐标从一个坐标系变换到另一个坐标系,我们需要用到几个变换矩阵,最重要的几个分别是模型(Model)、观察(View)、投影(Projection)三个矩阵。

       物体顶点的起始坐标再局部空间(Local Space),这里称它为局部坐标(Local Coordinate),它在之后会变成世界坐标(world Coordinate),观测坐标(View Coordinate),裁剪坐标(Clip Coordinate),并最后以屏幕坐标(Screen Corrdinate)的形式结束。下面这张图阐释了流程以及各个变换在做什么:

二、矩阵操作示例:

public class MatrixState {
    private static float[] mProjMatrix = new float[16]; //投影矩阵
    private static float[] mVMatrix = new float[16]; //视图矩阵
    private static float[] currMatrix; //模型矩阵

    private static float[] mMVPMatrix;
    public static void setCamera(
        float cx, float cy, float cz,
        float tx, float ty, float tz,
        float upx, float upy, float upz
    ){
        Matrix.setLookAtM(mVMatrix, 0, cx, cy, cz, tx, ty, tz, upx, upy, upz);
    }
 
    public static void setProjectOrtho(
        float left, float right,
        float bottom, float top,
        float near, float far
    ){
        Matrix.orthoM(mProjMatrix, 0, left, right, bottom, top, near, far);
    }
 
    public static void setProjectFrustum( 
        float left, float right,
        float bottom, float top,
        float near, float far 
    ){
        Matrix.frustumM(mProjMatrix, 0, left, right, bottom, top, near, far);
    }

    public static void translate(float x, float y, float z)
    {
        Matrix.translateM(currMatrix, 0, x, y, z); 
    }

    public static float[] getFinalMatrix() { //计算产生总变换矩阵的方法
        //摄像机矩阵乘以变换矩阵
        Matrix.multiplyMM(mMVPMatrix, 0, mVMatrix, 0, currMatrix, 0);         
        //投影矩阵乘以上一步的结果矩阵
        Matrix.multiplyMM(mMVPMatrix, 0, mProjMatrix, 0, mMVPMatrix,
                          0); 
        return mMVPMatrix;
    }

 
}

三、坐标变换过程如下:

模型变换对应的矩阵是:currMatrix 。

视图变换对应的矩阵是:mVMatrix 。

投影变换对应的矩阵是:mProjMatrix 。

四、shader使用示例:

#version 330

layout(location = 0) in vec3 position;
layout(location = 1) in vec3 color;
layout(location = 2) in vec2 textCoord;

out vec3 VertColor;
out vec2 TextCoord;

uniform mat4 mvpMatrix;

void main()
{
    gl_Position = mvpMatrix * vec4(position, 1.0);
    VertColor = color;
    TextCoord = textCoord;
}
glUniformMatrix4fv(glGetUniformLocation(shader.programId, "mvpMatrix"),
                     1, GL_FALSE, MatrixState.getFinalMatrix()); // 传递总的变换矩阵

最后,欢迎大家一起交流学习:微信:liaosy666 ; QQ:2209115372 。

发布了20 篇原创文章 · 获赞 30 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/u010281924/article/details/105300431