Android开发 之 OpenGL ES系列(3--坐标系)
来源:互联网 发布:传奇h5修改数据库教程 编辑:程序博客网 时间:2024/06/05 03:32
OpenGL ES 坐标系
Coordinate System坐标系
OpenGL使用了右手坐标系统,右手坐标系判断方法:在空间直角坐标系中,让右手拇指指向x轴的正方向,食指指向y轴的正方向,如果中指能指向z轴的正方向,则称这个坐标系为右手直角坐标系。
Translate平移变换
方法public abstract void glTranslatef (float x, float y, float z) 用于坐标平移变换。
在上个例子中我们把需要显示的正方形后移了4个单位,就是使用的坐标的平移变换,可以进行多次平移变换,其结果为多个平移矩阵的累计结果,矩阵的顺序不重要,可以互换。
Rotate旋转
方法public abstract void glRotatef(float angle, float x, float y, float z)用来实现选择坐标变换,单位为角度。 (x,y,z)定义旋转的参照矢量方向。多次旋转的顺序非常重要。
比如你选择一个骰子,首先按下列顺序选择3次:
1
gl.glRotatef(90f,
1
.0f,
0
.0f,
0
.0f);
2
gl.glRotatef(90f,
0
.0f,
1
.0f,
0
.0f);
3
gl.glRotatef(90f,
0
.0f,
0
.0f,
1
.0f);
然后打算逆向旋转回原先的初始状态,需要有如下旋转:
1
gl.glRotatef(90f, -
1
.0f,
0
.0f,
0
.0f);
2
gl.glRotatef(90f,
0
.0f, -
1
.0f,
0
.0f);
3
gl.glRotatef(90f,
0
.0f,
0
.0f, -
1
.0f);
或者如下旋转:
1
gl.glRotatef(90f,
0
.0f,
0
.0f, -
1
.0f);
2
gl.glRotatef(90f,
0
.0f, -
1
.0f,
0
.0f);
3
gl.glRotatef(90f, -
1
.0f,
0
.0f,
0
.0f);
旋转变换glRotatef(angle, -x, -y, -z) 和glRotatef(-angle, x, y, z)是等价的,但选择变换的顺序直接影响最终坐标变换的结果。 角度为正时表示逆时针方向。
Translate & Rotate (平移和旋转组合变换)
在对Mesh(网格,构成三维形体的基本单位)同时进行平移和选择变换时,坐标变换的顺序也直接影响最终的结果。
比如:先平移后旋转, 旋转的中心为平移后的坐标。
先选择后平移: 平移在则相对于旋转后的坐标系:
一个基本原则是,坐标变换都是相对于变换的Mesh本身的坐标系而进行的。
Scale(缩放)
方法public abstract void glScalef (float x, float y, float z)用于缩放变换。
下图为使用gl.glScalef(2f, 2f, 2f) 变换后的基本,相当于把每个坐标值都乘以2.
Translate & Scale(平移和缩放组合变换)
同样当需要平移和缩放时,变换的顺序也会影响最终结果。
比如先平移后缩放:
1
gl.glTranslatef(
2
,
0
,
0
);
2
gl.glScalef(
0
.5f,
0
.5f,
0
.5f);
如果调换一下顺序:
1
gl.glScalef(
0
.5f,
0
.5f,
0
.5f);
2
gl.glTranslatef(
2
,
0
,
0
);
结果就有所不同:
矩阵操作,单位矩阵
在进行平移,旋转,缩放变换时,所有的变换都是针对当前的矩阵(与当前矩阵相乘),如果需要将当前矩阵回复最初的无变换的矩阵,可以使用单位矩阵(无平移,缩放,旋转)。
public abstract void glLoadIdentity()。
在栈中保存当前矩阵和从栈中恢复所存矩阵,可以使用
public abstract void glPushMatrix()
和
public abstract void glPopMatrix()。
在进行坐标变换的一个好习惯是在变换前使用glPushMatrix保存当前矩阵,完成坐标变换操作后,再调用glPopMatrix恢复原先的矩阵设置。
- Android开发 之 OpenGL ES系列(3--坐标系)
- Android开发 之 OpenGL ES系列(2--基本概念)
- Android开发 之 OpenGL ES系列(4--添加颜色)
- Android开发 之 OpenGL ES系列(5--3D立体图形)
- Android开发 之 OpenGL ES系列(1--创建显示环境)
- OpenGL ES之Android 3D系列基本概念
- Android OpenGL ES 开发教程(3):OpenGL ES管道(Pipeline)
- Android OpenGL ES 开发教程(3):OpenGL ES管道(Pipeline)
- Android OpenGL ES 开发教程(3):OpenGL ES管道(Pipeline)
- Android OpenGL ES 开发(二): OpenGL ES 环境搭建
- Android开发之OpenGL+ES教程
- Android开发之OpenGL+ES教程
- Android OpenGL ES 2.0之开发流程
- android OpenGL ES开发之前世今生
- android OpenGL ES开发之shader
- OpenGL ES系列 之 提高-3:光照
- Android基础系列-----------OpenGL ES(一)
- Android OpenGL ES2.0编程教程系列之创建OpenGL ES环境(一)
- 企业做网站该用什么程序呢?实用最实在
- SQL语句基础
- 2017.9.5 能量采集 思考记录
- c++继承
- HDOJ HDU 1024 Max Sum Plus Plus
- Android开发 之 OpenGL ES系列(3--坐标系)
- 深入理解TCP(2)TCP的断开一定是四次挥手吗?FIN_WAIT_2和CLOSE_WAIT,TIME_WAIT以及LAST_ACK的细节
- PostgreSQL创建索引例子
- Redis分布式锁详解
- (作业)Swift类的属性与方法
- flask email service学习笔记
- 多线程第一章知识点
- HDU_2089_不要62
- TCP 的三次握手