(5)添加运动

来源:互联网 发布:古兰经教学软件 编辑:程序博客网 时间:2024/05/13 10:02

在屏幕上绘制是OpenGL的基础能力,但是你也可以用其它的Android图形框架类来做,包括Canvas和Drawable。 但是OpenGL ES提供了额外的能力使得可以在三维空间移动和变换绘制对象,或者以其它独特的方式创建引人注目的用户体验。在本文中,将进行下一步使用OpenGL ES为形状添加旋转功能。

一、转动一个形状

使用OpenGL ES 2.0旋转绘图对象是相对简单的。在你的渲染器,创建另一个变换矩阵(旋转矩阵),然后将它与投影和相机视图变换矩阵合并:

public void onDrawFrame(GL10 unused) {        float[] scratch = new float[16];        // 绘制背景颜色        GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT);        // 设置camera的位置(视图矩阵)        Matrix.setLookAtM(mViewMatrix, 0, 0, 0, -3f, 0f, 0f, 0f, 0f, 1f, 0.0f);        // 计算投影和视图变换        Matrix.multiplyMM(mMVPMatrix, 0, mProjectionMatrix, 0, mViewMatrix, 0);        // 绘制正方形        mSquare.draw(mMVPMatrix);        // 为三角形创建一个旋转        // Use the following code to generate constant rotation.        // Leave this code out when using TouchEvents.        // long time = SystemClock.uptimeMillis() % 4000L;        // float angle = 0.090f * ((int) time);        Matrix.setRotateM(mRotationMatrix, 0, mAngle, 0, 0, 1.0f);        // 把旋转矩阵合并到投影和相机矩阵          Matrix.multiplyMM(scratch, 0, mMVPMatrix, 0, mRotationMatrix, 0);        // 绘制三角形        mTriangle.draw(scratch);    }

(1)OpenGL基础—模型变换

其实在前一章已经提到模型变换了,它主要提供了以下几种变换函数:
1. void glTranslate{fd}(TYPE x,TYPE y,TYPE z);
把当前矩阵与一个表示移动物体的矩阵相乘。这个移动矩阵由x,y和z值指定(或者在局部坐标系系统中移动相同的数量)。
2. void glRotate{fd}(TYPE angle,TYPE x,TYPE y,TYPE z);
把当前矩阵与一个表示移动物体(或物体的局部坐标系统)的矩阵相乘,以逆时针方向绕着从原点到点(x,y,z)的直线进行旋转。angle参数指定了旋转的度数。
3. void glScale{fd}(TYPE x,TYPE y,TYPE z);
把当前矩阵与一个表示沿各个轴对物体进行拉伸、收缩或反射的矩阵相乘。这个物体中的每个点的x、y和z坐标与对应的x、y和z参数相乘。使用局部坐标系统方法,局部坐标系统的轴将由x、y和z因子拉伸、收缩或反射,相关联的物体也根据它们进行变换。

(2)分析代码–模型变换

void setRotateM(float[] rm, int rmOffset,float a, float x, float y, float z);
与OpenGL的glRotate函数类似,差别主要是增加了偏移量 rmOffset,以及将旋转矩阵存储在参数float[] rm里。

(3)四维向量

查看坐标变换的代码时,可以发现所有相关的矩阵乘积都是四维的,而立体空间只有三个维度,主要是因为OpenGL关于颜色,位置的坐标都是四维的。
这里写图片描述
位置的w坐标其实是没有意义的,至于纹理坐标后续图像的绘制会涉及到。

0 0
原创粉丝点击