下面代码设置当前Matrix模式为Projection投影矩阵:
gl.glMatrixMode(GL_PROJECTION);
gl.glLoadIdentity();
后续的坐标变换则针对投影矩阵。
OpenGL ES可以使用两种不同的投影变换:透视投影(Perspective Projection)和正侧投影(Orthographic Projection)。
正侧投影(Orthographic Projection)
有些地方也翻译成正交投影。
正交却是世界中的物体按照平行的光线投射到一张纸上(你的画布),仿佛被压缩在上面,无论这个物体在世界中多远,投射结果还是原来的大小, 2d 游戏多用此种投影。如下图:
正交投影的函数 有 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);
每个参数的意思如下图:
透视投影(Perspective Projection)
透视比较接近我们现实的方式了,你的眼睛发出的光形成一个夹角,离你的眼睛越近,东西越大,范围越小;反之离眼睛越远,东西越小,视野越开阔。因此多用于 3D 中。如下图:
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,可以理解成眼睛睁开的角度,即,视角的大小,如果设置为0,相当你闭上眼睛了,所以什么也看不到,如果为180,那么可以认为你的视界很广阔;
对最佳视角fovy,有
tan(fovy/2) = h/distance; //h为物体在Y方向上的高度,distance为物体中心离视点的距离
aspect = w/h; //w为物体在X方向上宽度,h意义同上
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示
2010-04-27 where 命令一个快速定位工具所在的功能