opengl es 视图与投影

关于android的投影矩阵,一般有两种,一种是矩阵投影,另一种是透视投影。
矩阵投影主要用于2D画面,但指定此投影的方式却有多种方式,而且对于初入门的人来说,也不容易理解,可以使用glOrthof,此方法使用方式大概如下:


GL10 gl = glGraphics.getGL();
gl.glViewport(0, 0, glGraphics.getWidth(), glGraphics.getHeight());
gl.glMatrixMode(GL10.GL_PROJECTION);
gl.glLoadIdentity();

//以左下角为原点
gl.glOrthof(0, //left
width, //right
0, //bottom
height, //top
1, -1);
gl.glMatrixMode(GL10.GL_MODELVIEW);
gl.glLoadIdentity();

上面的glOrthof最后两个参数用于设置Z轴坐标,在2D画面中使用1与-1即可。

除了这种方式外,还可以通过一个叫GLU的工具类来指定投影的显示,用法如下:

gl.glViewport(0, 0, glGraphics.getWidth(), glGraphics.getHeight());
gl.glMatrixMode(GL10.GL_PROJECTION);
gl.glLoadIdentity();
GLU.gluOrtho2D(gl, left, right, bottom, top);
gl.glMatrixMode(GL10.GL_MODELVIEW);
gl.glLoadIdentity();

上面的gluOrtho2D方法相对来说简化了一下。

在3D的画面中,也有两种方式,一种是使用glFrustumf方法,用法如下:

gl.glViewport(0, 0, width, height);
float ratio = (float) width / height;
gl.glMatrixMode(GL10.GL_PROJECTION);
gl.glLoadIdentity();
gl.glFrustumf(-ratio, ratio, -1, 1, 1, 20);

这个ratio表示宽度与高度的比,glFrustumf方法的前两个参数分别代表左右方向,因为高度与宽度不一样,所以这个ratio是为了限制场景宽度而必须存在的。第三四个参数分别代表Y的下上方向,而最后两个参数则代表Z轴的近远方向。这个近与远不是很好理解的话请看下图:

[img]http://dl.iteye.com/upload/attachment/0067/2037/1579c1ef-0c64-3855-93ca-1886e7ebd391.png[/img]
上面这个图也把Viewport与场景区分开了。

除了使用glFrustumf外,也可以使用工具类GLU里面的方法gluPerspective,此方法参数如下:

GLU.gluPerspective(gl, fovy, aspect, zNear, zFar);

其中第二个参数表示角度,即视图的角度。而aspect则表示宽度与高度比,即与上面的ratio一样。但这些参数最好还是配上一个图,下面的图来自最后链接文章,个人觉得很形象的说明了这些参数的意思。
[img]http://dl.iteye.com/upload/attachment/0067/2513/01e25041-0c2c-3e2f-8ece-99625374644b.png[/img]

[quote]
我们观察平面的裁剪窗口的大小和屏幕的大小可以一致,也可以有差别. 但为了使得最终的效果基本一致,所以,一般设置成它们具有相同的 aspect(横纵比 w/h), 从而它们的转换关系就是等比例的放大或者缩小,而不会产生扭曲.
[/quote]
对于3D图形来说,除了设置视图投影以外,还得设置整个游戏模型的浏览角度,这个会涉及到一个很重要的方法GLU.gluLookAt,这个方法的参数形式如下:

void android.opengl.GLU.gluLookAt(GL10 gl, float eyeX, float eyeY, float eyeZ, float centerX, float centerY, float centerZ, float upX, float upY, float upZ)

参数很多,但参数作用主要分为三部分(gl不算)。
eye系列坐标用于设置整个视野所参照的原点坐标。
center系列坐标用于设置浏览游戏角色的方向,这个方向坐标就是相对于eye系统坐标的。
up系列坐标则用于设置浏览者(镜头)相对于原点(eye系列)的坐标。
下图可供参考:
[img]http://dl.iteye.com/upload/attachment/0067/2538/37c94e23-75d8-330f-ad34-d6813ee3c67c.png[/img]
因此在3D环境中,整个游戏的视图设置大概就像下面这样,先设置投影矩阵下整个游戏的面板的显示,再设置为模型矩阵,显示3D模型的轮廓:

public void setMatrices(GL10 gl) {
gl.glMatrixMode(GL10.GL_PROJECTION);
gl.glLoadIdentity();
GLU.gluPerspective(gl, fieldOfView, aspectRatio, near, far);
gl.glMatrixMode(GL10.GL_MODELVIEW);
gl.glLoadIdentity();
GLU.gluLookAt(gl, position.x, position.y, position.z, lookAt.x, lookAt.y, lookAt.z, up.x, up.y, up.z);
}


关于opengl 的视图投影方式大概就是这些,关于这方面的资料网上也比较上,由于本人初学,也可以有些地方理解有误。本人觉得下面这两篇文章讲得还可以,供参考:
[url]http://www.cnblogs.com/shengdoushi/archive/2011/01/02/1923940.html[/url]
[url]http://zhhx.blog.sohu.com/210140121.html[/url]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值