大多数教程都是画三角锥、立方体,而我的需求是以画一个坐标系为基础,类似图一
首先,要确定想画顶点
//定义XYZ坐标
float xyzVertices[] = new float[]{
-0.6f, 0f, 0f,//x轴起点
0.6f, 0f, 0f,//X轴的终点
0.5f,0.1f,0f,//X轴箭头1
0.5f,-0.1f,0f,//X轴箭头2
0f, -0.6f, 0f,//Y轴起点
0f, 0.6f, 0f,//Y轴终点
0.1f ,0.5f ,0f,//Y轴箭头1
-0.1f ,0.5f ,0f,//Y轴箭头2
0f, 0f, -0.6f,//Z轴起点
0f, 0f, 0.6f,//Z轴终点
0f ,0.1f ,0.5f,//Z轴箭头1
0f ,-0.1f ,0.5f,//Z轴箭头2
};
把Java从内存复制到本地堆:
xyzVertexData = ByteBuffer
.allocateDirect(xyzVertices.length * BYTES_PER_FLOAT)
.order(ByteOrder.nativeOrder())
.asFloatBuffer();
xyzVertexData.put(xyzVertices);
这里也可以定义一个工具方法,将float[]数组转换为OpenGL ES所需的FloatBuffer
private FloatBuffer floatBufferUtil(float[] arr)
{
FloatBuffer mBuffer;
// 初始化ByteBuffer,长度为arr数组的长度*4,因为一个int占4个字节
ByteBuffer qbb = ByteBuffer.allocateDirect(arr.length * 4);
// 数组排列用nativeOrder
qbb.order(ByteOrder.nativeOrder());
mBuffer = qbb.asFloatBuffer();
mBuffer.put(arr);
mBuffer.position(0);
return mBuffer;
}
绘制:
glLineWidth(3.0f);//直线宽度
glVertexPointer(3, GL10.GL_FLOAT, 0, xyzVertexData);//设置XYZ的顶点
// 设置顶点的颜色数据
glColor4f(0.0f, 1.0f, 0.0f, 1.0f);//设置绘笔颜色
glDrawElements(GL10.GL_LINES, XFacetsBuffer.remaining(),
GL10.GL_UNSIGNED_BYTE, XFacetsBuffer);//X
glColor4f(1.0f, 1.0f, 0.0f, 1.0f);
glDrawElements(GL10.GL_LINES, YFacetsBuffer.remaining(),
GL10.GL_UNSIGNED_BYTE, YFacetsBuffer);//Y
glColor4f(1.0f, 0.0f, 1.0f, 1.0f);
glDrawElements(GL10.GL_LINES, ZFacetsBuffer.remaining(),
GL10.GL_UNSIGNED_BYTE, ZFacetsBuffer);//Z
}
GitHub:https://github.com/ziigea/Coordinate.git