大家好,接下来将为大家介绍OpenGL ES 3. 坐标系及坐标变换。
一、坐标系、坐标空间:
OpenGL使用的是笛卡尔右手坐标系。X轴向右为正,Y向上为正,Z垂直屏幕朝外为正。如下图所示。
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 。