3D应用开发中,一项很重要的工作 就是对场景中的物体进行各种投影与变换。
在OpenGL ES2.0之后变换方面采取开放模式,API不会提供完成各种变换的方法,变换矩阵都是由开发人员直接提供给渲染管线。所以今天给大家推荐本书3D数学基础,建议大家都去学一下!
3D数学下载传送门:点击下载
今天我们讲投影与变换,在讲之前我们先研究下,使用相机是拍照决定图片效果的的因素有哪些!
上图我们可以看到由于上图相机的 位置 、方向、距离 不同拍出来的效果也是不一样的!所以决定照片效果的 就是 距离、方向 和 相机位置,带着这三个答案我们来学习投影!
一、投影
在OpenGLES中投影分正交投影和透视投影,这里我们先来看透视投影吧!
- 正交投影
视点:对应相机位置
近平面:可以理解为 相机拍摄清楚的最近距离
远平面:可以理解为 相机能拍摄清楚的最远距离
视景体:我们要拍摄的空间
场景中 处于视景体内的物体会被投影到近平面上(超出视景体会被剪切掉),垂直方向向量的平面为近平面,距离视点远的叫远平面。
远平面和近平面组成的长方体叫做视景体
视景体中心轴线与四个平面(除去远近的上下左右四个面)的距离分别为top、bottom、left、right。
总结:
正交投影是平行投影的一种,特点是投影线是平行的,视景体是长方体;投影到近平面上的图形不会产生真实世界中近大远小的效果。
Matrix.orthoM(float[] m, //存储生成矩阵元素的数组
int mOffset,//填充起始偏移量
float left, //near面的left
float right, //near面的right
float bottom, //near面的bottom
float top,//near面的top
float near, //near面与视点的距离
float far) //far面与视点的距离
orthoM的功能是根据六个正交投影相关参数产生正交投影,并将矩阵元素添加到指定的数组中。
参数 left right 为近平面上下侧边 对应的X坐标
参数 bottm、top为近平面上下侧边 对应的Y坐标
这四个参数分别来确定 左右上下 平面的位置
参数near 、far分别为视景体近平面与远平面到视点的距离。
场景中的物体投影到近平面后,最终会映射到显示屏上的视口。
名词解释:视口就是显示屏上指定的区域。
设置视口可以用 GLES20.glViewport(x,y,with,height)
参数解释:xy为视口矩形左上侧点在屏幕坐标,
width ,height,为视口的宽高。
注意:
从近平面倒是口的映射是有渲染管线自动完成的,
一般情况下,我们需要满足近平面的宽高与视口的宽高比相同
也就是{ (left+right)/(top+bottom)==width/height 不满足图像就会拉伸 }
- 透视投影
我们用眼睛观察物体时会有近大远小的效果,那我们的透视投影就是来实现这种效果的。大部分3D游戏采用的都是透视投影。
Matrix.frustumM(float[] m, //存储生成矩阵元素的数组
int mOffset,//填充起始偏移量
float left, //near面的left
float right, //near面的right
float bottom, //near面的bottom
float top,//near面的top
float near, //near面与视点的距离
float far) //far面与视点的距离
二、变换
3D里面最典型的案例就是坐标变换,像我们的平移,旋转,缩放,其实就是在做坐标变换。
那这里我们举个典型 :在二维平面上旋转 ( 三维旋转的复杂点但都差不多! )(个人讲课笔记不喜勿喷)