随笔 - 934, 文章 - 0, 评论 - 249, 阅读 - 345万

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

OpenGL ES 投影变换 Projection

Posted on   蝈蝈俊  阅读(2086)  评论(0编辑  收藏  举报

下面代码设置当前Matrix模式为Projection投影矩阵:

gl.glMatrixMode(GL_PROJECTION);
gl.glLoadIdentity();

后续的坐标变换则针对投影矩阵。

 

OpenGL ES可以使用两种不同的投影变换:透视投影(Perspective Projection)和正侧投影(Orthographic Projection)。

 

正侧投影(Orthographic Projection)

有些地方也翻译成正交投影。

正交却是世界中的物体按照平行的光线投射到一张纸上(你的画布),仿佛被压缩在上面,无论这个物体在世界中多远,投射结果还是原来的大小, 2d 游戏多用此种投影。如下图:

image

正交投影的函数 有 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);

每个参数的意思如下图:

 

image

 

透视投影(Perspective Projection)

 

透视比较接近我们现实的方式了,你的眼睛发出的光形成一个夹角,离你的眼睛越近,东西越大,范围越小;反之离眼睛越远,东西越小,视野越开阔。因此多用于 3D 中。如下图:

tutorial_perspective

OpenGL ES定义透视投影的函数为glFrustum():

public void glFrustumf(float left,float right,float bottom,float top,float near,float far)

20110702003

在实际写代码时,Android OpenGL ES提供了一个辅助方法gluPerspective()可以更简单的来定义一个透视投影变换:

public static void gluPerspective(GL10 gl, float fovy, float aspect, float zNear, float zFar)

fovy: 定义视锥的view angle. 视线角度
aspect:  定义视锥的宽高比。
zNear: 定义裁剪面的近距离。
zFar: 定义创建面的远距离。

image

image

fovy,可以理解成眼睛睁开的角度,即,视角的大小,如果设置为0,相当你闭上眼睛了,所以什么也看不到,如果为180,那么可以认为你的视界很广阔;

 

image

对最佳视角fovy,有
tan(fovy/2) = h/distance;   //h为物体在Y方向上的高度,distance为物体中心离视点的距离
aspect = w/h;                   //w为物体在X方向上宽度,h意义同上

 

http://www.imobilebbs.com/wordpress/?p=2025

编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示
历史上的今天:
2010-04-27 where 命令一个快速定位工具所在的功能
点击右上角即可分享
微信分享提示