|
这个系列的第二部分将展示如何添加一个三角形以及如何旋转它。
第一件事情就是我们要初始化一个我们打算显示的三角形。我们必须在VortexRenderer类中创建一个函数名为initTriangle()。
java代码:
// new object variables we need
// 保存索引的缓冲区
private ShortBuffer _indexBuffer;
// 保存顶点的缓冲区
private FloatBuffer _vertexBuffer;
private short[] _indicesArray = {0, 1, 2};
private int _nrOfVertices = 3;
// code snipped
private void initTriangle() {
// float has 4 bytes
ByteBuffer vbb = ByteBuffer.allocateDirect(_nrOfVertices * 3 * 4);
vbb.order(ByteOrder.nativeOrder());
_vertexBuffer = vbb.asFloatBuffer();
// short has 2 bytes
ByteBuffer ibb = ByteBuffer.allocateDirect(_nrOfVertices * 2);
ibb.order(ByteOrder.nativeOrder());
_indexBuffer = ibb.aSSHortBuffer();
float[] coords = {
-0.5f, -0.5f, 0f, // (x1, y1, z1)
0.5f, -0.5f, 0f, // (x2, y2, z2)
0f, 0.5f, 0f // (x3, y3, z3)
};
_vertexBuffer.put(coords);
_indexBuffer.put(_indicesArray);
_vertexBuffer.position(0);
_indexBuffer.position(0);
}
复制代码
首先添加一下新的成员变量._vertexBuffer用来保存我们三角形的顶点._indexBuffer存储索引._nrOfVertices定义我们需要多少顶点.对于三角形来说我们需要三个顶点.
在14到22行中分配两个buffer所需要的空间.之后在24到28行我们定义一些顶点,其后的注释会帮助你理解这些坐标.
在30行我们向_vertexBuffer中填入坐标阵列.31行向_indexBuffer中填入索引数组.最后我们把两个缓冲区设置到原点处.
为了避免每一帧三角形都要初始化,我们只需要在调用onDrawFrame()前的函数中初始化一次.一个可能方案就是在onSurfaceCreated()中执行.
glEnableClientState()设置OpenGL利用顶点阵列来绘图.这个函数是重要的否则OpenGL不知道如何处理数据.
为什么我们必须使用不同的缓冲区呢?下面是更改过的onDrawFrame()函数,里面我们会加入新的OpenGL调用.
java代码:
@Override
public void onDrawFrame(GL10 gl) {
// 定义我们要在"clipping wall"显示的颜色
gl.glClearColor(_red, _green, _blue, 1.0f);
// clear the color buffer to show the ClearColor we called above...
gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
// 设置我们元件的颜色
gl.glColor4f(0.5f, 0f, 0f, 0.5f);
// 定义我们要绘制的顶点
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, _vertexBuffer);
// 最终画顶点
gl.glDrawElements(GL10.GL_TRIANGLES, _nrOfVertices, GL10.GL_UNSIGNED_SHORT, _indexBuffer);
}
复制代码
glClearColor() and glClear() 应该在第一部分中已经了解了。在第10行我们使用函数glColor4f(red, green, blue, alpha)来设置三角形的颜色为深红。
在13行我们使用glVertexPointer()初始化顶点指针。第一个参数是大小,也就是我们顶点的维度。我们使用三个维度。第二个参数GL_FLOAT,代表我们在缓冲区中使用的数据类型。第三个参数是0,因为我们的坐标整齐地封装在数组中,不用偏置。最后第四个参数是我们利用的缓冲区。
最后一个调用,glDrawElements(),将会绘制元件。第一个参数代表要绘制的基本元件。第二个参数是元件的数量,第三个是代表作为索引的数值类型,最后是用来绘制顶点的索引矩阵缓冲区。
当你最后测试这个程序时,你会在屏幕中央看到一个静止的三角形,当你触碰屏幕,背景颜色仍然会变化。
下面我们加入一些旋转。下面代码要加入我们的VortexRenderer类。
java代码:
private float _angle;
public void setAngle(float angle) {
_angle = angle;
}
复制代码
glRotatef() 方法会在我们的onDrawFrame()函数中的glColor4f()上方被调用。
java代码:
@Override
public void onDrawFrame(GL10 gl) {
// 设置旋转
gl.glRotatef(_angle, 0f, 1f, 0f);
gl.glColor4f(0.5f, 0f, 0f, 0.5f);
// code snipped
}
复制代码
我们会环绕y轴进行旋转。如果你打算更改的话,只需简单的改变glRotatef()中的0f参量。这一系列的参数值代表了我们打算使三角形旋转要围绕的坐标轴。
我们还需要调用onTouchEvent()来使程序工作。
java代码:
public boolean onTouchEvent(final MotionEvent event) {
queueEvent(new Runnable() {
public void run() {
_renderer.setColor(event.getX() / getWidth(), event.getY() / getHeight(), 1.0f);
_renderer.setAngle(event.getX() / 10);
}
});
return true;
}
复制代码
除以10为了减小旋转的速度。
现在编译并且运行这个程序,如果你触碰屏幕的左边,你会看到三角形缓慢地旋转。如果你向右边移动手指,旋转的速度会动态增加。
系列之Android 游戏教程(一)的帖子链接http://www.eoeandroid.com/thread-102096-1-1.html
系列之Android 游戏教程(三)的帖子链接http://www.eoeandroid.com/thread-102100-1-1.html
系列之Android 游戏教程(四)的帖子链接http://www.eoeandroid.com/thread-103115-1-1.html
系列之Android 游戏教程(五)的帖子链接http://www.eoeandroid.com/thread-103118-1-1.html
系列之Android 游戏教程(六)的帖子链接http://www.eoeandroid.com/thread-103121-1-1.html
系列之Android 游戏教程(七)的帖子链接http://www.eoeandroid.com/thread-103125-1-1.html |
|