opengl es 三大变换:模型变换、视图变换、投影变换
模型变换: mMMatrix[16], [4*4]矩阵, 包括平移、比例缩放、旋转
平移:
Matrix.translateM(
mMMatrix,
0,//偏移量
x, y, z//平移量
)
比例缩放:
Matrix.scaleM(
mMMatrix,
sx,sy, sz//缩放因子
)
旋转:
Matrix.rotateM(
mMMatrix,
0,//偏移量
angle,//旋转角度
x, y, z//需要旋转的轴
)
视图变换: mVMatrix[16], [4*4]矩阵
Matrix.setLookAtM(mVMatrix,
0,//偏移量
cx, cy, cz,//相机位置,
tx, ty, tz,//观察点位置
upx, upy, upz//顶部朝向
)
投影变换:mPMatrix[16], [4*4]矩阵, 包括透视投影、正交投影
透视投影:
Matrix.frustumM(
mPMatrix,
0,//偏移量
left,
right,
buttom,top,
near,
far//near>0
)
opengl es定义透视投影的函数为glFrustum():
public void glFrustumf(float left,float right,float bottom,float top,float near,float far)
实际使用android opengl es提供了一个辅助方法gluPerspective()定义透视投影变换:
public static void gluPerspective(GL10 gl, float fovy, float aspect, float zNear, float zFar)
fovy: 定义视锥的view angle. 视线角度
aspect: 定义视锥的宽高比。
zNear: 定义裁剪面的近距离。
zFar: 定义创建面的远距离。
最佳视角fovy:
tan(fovy/2) = h/distance; //h为物体在Y方向上的高度,distance为物体中心离视点的距离
aspect = w/h; //w为物体在X方向上宽度,h意义同上
正交投影:
Matrix.orthoM(
mPMatrix,
0,//偏移量
left,
right,
buttom,
top,
near,
far//near>0
)
正交投影的函数 有glOrtho()和glu库的 gluOrth2D():
glOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble near, GLdouble far);
gluOrth2D(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top);
变换: 可通过与变换矩阵相乘:
Matrix.multiplyMM(
mMVPMatrix, /总变换矩阵
0, //结果矩阵偏移量
mMatrixLeft,
0, //阵偏移量
mMtrixRight,
0 //阵偏移量
);
利用栈存储变换矩阵的算法, 可实现复杂场景的图形变换和提高渲染效率。
矩阵相乘讲究顺序: 先平移再缩放 和 先缩放再平移的效果是不同的。