Matrix.setLookAtM(
mVMatrix, //存储生成矩阵元素的float[]类型数组
0, //填充起始偏移量
cx, cy, cz, //摄像机位置X,Y,Z坐标
tx, ty, tz, //观察目标X,Y,Z坐标
upx,upy,upz //up向量在X,Y,Z上的分量
);
Matrix.orthoM(
mProjMatrix, //存储生成矩阵元素的float[]类型数组
0, //填充起始偏移量
left, right, //near面的left,right
bottom, top, //near面的bottom,top
near, far //near面,far面与视点的距离
);
//设置视口
GLES20.glViewport(x, y, width, height);
视口理解图
提示:尽量保持,近平面与视口的宽高比相同.即
((left + right) / (top + bottom)) == (width / height),否则显示在屏幕上的图像会拉伸变形
private static float[] mMVPMatrix; //最后起作用的总变换矩阵
private static float[] mVMatrix = new float[16]; //Camera位置朝向9参数矩阵
private static float[] mProjMatrix = new float[16];//4x4矩阵 投影用
/**
*绘制图像绕轴旋转 重要代码
*/
public void drawSelf()
{
Matrix.setRotateM(mMMatrix, 0, 0, 0, 1, 0);//初始化变换矩阵
Matrix.translateM(mMMatrix, 0, 0, 0, 1);//设置沿Z轴正向移动1
Matrix.rotateM(mMMatrix, 0, yAngle, 0, 1, 0);//设置绕Y轴旋转yAngle度
Matrix.rotateM(mMMatrix, 0, xAngle, 1, 0, 0);//设置绕X轴旋转xAngle度
//合成最终旋转矩阵
mMVPMatrix = new float[16];
//整合(矩阵相乘)旋转的矩阵
Matrix.multiplyMM(
mMVPMatrix,//存放结果的矩阵
0,//结果矩阵偏移量
mVMatrix,//Camera位置朝向9参数矩阵,左矩阵
0,//偏移量
mMMatrix,//乘法右矩阵
0//偏移量
);
//整合(矩阵相乘)投影与旋转到最终矩阵
Matrix.multiplyMM(mMVPMatrix, 0, mProjMatrix, 0, mMVPMatrix, 0);
//最终将矩阵传到OpenGL
GLES20.glUniformMatrix4fv(muMVPMatrixHandle, 1, false, mMVPMatrix, 0);
}
Matrix.frustumM(
mProjMatrix, //要填充矩阵元素的float[]类型数组
0, //填充起始偏移量
left, right, //near面的left,right
bottom, top, //near面的bottom, top
near, far //near面,far面与视点的距离
);
数学上,向量可以有两种选择:行向量与列向量.OpenGL ES中使用的是列向量.列向量和矩阵相乘实现变换时,只能在列向量前面乘以矩阵,而行向量则反之.反则乘法没有意义.
OpenGL ES 中的基本变换都是通过变换矩阵完成.变换矩阵的基本格式如下:
OpenGL ES 中,旋转角度的正负可以用右手螺旋定则来确定.
旋转矩阵M的基本格式
public static void rotate(float angle, float x, float y, float z) {
Matrix.rotateM(currMatrix, 0, angle, x, y, z);
}
OpenGL ES 中的基本变换都是通过变换矩阵完成的,缩放变换矩阵的基本格式.