Android openGL ES2.0 Matrix.frustumM和Matrix.setLookAtM解析

来源:互联网 发布:阿里巴巴国际站优化 编辑:程序博客网 时间:2024/05/21 06:33

Android使用OpenGL ES2.0绘制3D图像或者加载3D模型时,为了达到立体效果往往需要设置视见转换矩阵和投影转换矩阵即Matrix.setLookAtM(mVMatrix, 0, cx, cy, cz, tx, ty, tz, upx, upy, upz) 和 Matrix.frustumM(mProjMatrix, 0, left, right, bottom, top, near, far)。学习这两个方法需要先了解openGL的3D坐标系,可以自行百度。
Matrix.setLookAtM
需要填充的参数
float cx, //摄像机位置x
float cy, //摄像机位置y
float cz, //摄像机位置z
float tx, //摄像机目标点x
float ty, //摄像机目标点y
float tz, //摄像机目标点z
float upx, //摄像机UP向量X分量
float upy, //摄像机UP向量Y分量
float upz //摄像机UP向量Z分量
这个方法看起来很抽象,设几组参数对比一下效果,摄像机目标点,即绘制的3D图像,tx,ty, tz,为图像的中心位置设置到原点即 tx = 0,ty = 0, tz = 0; 摄像机的位置,即观察者眼睛的位置 我们设置在目标点的正前方(位置z轴正方向),cx = 0, cy = 0, cz = 10; 接着是摄像机顶部的方向了,如下图,很显然相机旋转,up的方向就会改变,这样就会会影响到绘制图像的角度。


拍摄的相机位置,即观察者的眼睛

例如设置up方向为y轴正方向,upx = 0,upy = 1,upz = 0。这是相机正对着目标图像,则绘制出来的效果如下图所示


如果设置up方向为x轴正方向,upx = 1,upy = 0,upz = 0,绘制的图像就会如下图所示


显然如果设置在z轴方向,图像就会看不见。Matrix.setLookAtM,的作用大体就是这样。

Matrix.frustumM
需要填充的参数有
float left, //near面的left
float right, //near面的right
float bottom, //near面的bottom
float top, //near面的top
float near, //near面距离
float far //far面距离
设置这些参数能起到的作用:先是left,right和bottom,top,这4个参数会影响图像左右和上下缩放比,所以往往会设置的值分别-(float) width / height和(float) width / height,top和bottom和top会影响上下缩放比,如果left和right已经设置好缩放,则bottom只需要设置为-1,top设置为1,这样就能保持图像不变形。也可以将left,right 与bottom,top交换比例,即bottom和top设置为 -height/width 和 height/width, left和right设置为-1和1。
near和far参数稍抽象一点,就是一个立方体的前面和后面,near和far需要结合拍摄相机即观察者眼睛的位置来设置,例如setLookAtM中设置cx = 0, cy = 0, cz = 10,near设置的范围需要是小于10才可以看得到绘制的图像,如果大于10,图像就会处于了观察这眼睛的后面,这样绘制的图像就会消失在镜头前,far参数,far参数影响的是立体图形的背面,far一定比near大,一般会设置得比较大,如果设置的比较小,一旦3D图形尺寸很大,这时候由于far太小,这个投影矩阵没法容纳图形全部的背面,这样3D图形的背面会有部分隐藏掉的。



作者:android_opengl
链接:http://www.jianshu.com/p/f24f7e35a1ab
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。