在opengl es android中随机位置绘制多个立方体

使用OpenGL ES我正在渲染一个简单的立方体类,它将它绘制在屏幕的中心。 但是,我希望能够在屏幕上以随机位置绘制多个这样的立方体,但不知道如何操作。 这是我的自定义表面视图,它将多维数据集呈现为私有类。 我没有包含我的主ActivityManager,因为它不关心。

public class TouchSurfaceView extends GLSurfaceView { private final float TRACKBALL_SCALE_FACTOR=52.0f; private final float TOUCH_SCALE_FACTOR=100.0f/320; private MyGLRenderer mRenderer; private float mPreviousX; private float mPreviousY; public TouchSurfaceView(Context context) { super(context); // TODO Auto-generated constructor stub mRenderer=new MyGLRenderer(); setRenderer(mRenderer); setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY); } private class MyGLRenderer implements GLSurfaceView.Renderer{ private MyGLCube mCube; public float mAngleX; public float mAngleY; public MyGLRenderer(){ mCube=new MyGLCube(); } @Override public void onDrawFrame(GL10 gl) { // TODO Auto-generated method stub gl.glDisable(GL10.GL_DITHER); gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); gl.glMatrixMode(GL10.GL_MODELVIEW); gl.glLoadIdentity(); gl.glClientActiveTexture(DRAWING_CACHE_QUALITY_HIGH); // gl.glTranslatef(0, 0, -3.0f); gl.glTranslatef(0, 0, -3.0f); gl.glRotatef(mAngleX, 0, 1, 0); gl.glRotatef(mAngleY, 1, 0, 0); mCube.draw(gl); } @Override public void onSurfaceChanged(GL10 gl, int width, int height) { // TODO Auto-generated method stub 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, 10); } @Override public void onSurfaceCreated(GL10 gl, EGLConfig config) { // TODO Auto-generated method stub gl.glDisable(GL10.GL_DITHER); gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST); gl.glClearColor(0.5f, 2, 0.63f, 0.2f); } } } 

这是MYGLCube ,它包含用于构造立方体的顶点,索引和其他内容

  public class MyGLCube { private float vertices[]={ 0.3f,0.3f,-0.3f, // topFront Right 0.3f,-0.3f,-0.3f, //BottomFront Right -0.3f,-0.3f,-0.3f, //BottomFront Left -0.3f,0.3f,-0.3f, //topFront Left 0.3f,0.3f,0.3f, // topBack Right 0.3f,-0.3f,0.3f, //BottomBack Right -0.3f,-0.3f,0.3f, //BottomBack Left -0.3f,0.3f,0.3f, //topBack Left }; private float rgbaVals[]={ 1,1,0,.5f, // topFront Right color 0.25f,0, 0.8f,1, //BottomFront Right color 0,1,1,1, //BottomFront Left color 0.35f,0.26f,1,0.5f, //topFront Left color 0.23f,0.62f,3,0.2f, // topBack Right color 0.3f,0.43f,1,0.2f, //BottomBack Right color 0.2f, 0.3f, 0.73f,0.6f, //BottomBack Left color 0.6f, 0.9f, 0.65f, 0.2f //topBack Left color }; private short pIndex[]={ 3,4,0, 0,4,1, 3,0,1, 3,7,4, 7,6,4, 7,3,6, 3,1,2, 1,6,2, 6,3,2, 1,4,5, 5,6,1, 6,5,4 }; private FloatBuffer vertBuff, cBuff; private ShortBuffer pBuff; public MyGLCube(){ ByteBuffer bBuff=ByteBuffer.allocateDirect(vertices.length*4); bBuff.order(ByteOrder.nativeOrder()); vertBuff=bBuff.asFloatBuffer(); vertBuff.put(vertices); vertBuff.position(0); ByteBuffer pbBuff=ByteBuffer.allocateDirect(pIndex.length*2); pbBuff.order(ByteOrder.nativeOrder()); pBuff=pbBuff.asShortBuffer(); pBuff.put(pIndex); pBuff.position(0); ByteBuffer colorBuff=ByteBuffer.allocateDirect(rgbaVals.length*4); colorBuff.order(ByteOrder.nativeOrder()); cBuff=colorBuff.asFloatBuffer(); cBuff.put(rgbaVals); cBuff.position(0); } public void draw(GL10 gl){ gl.glFrontFace(GL10.GL_CW); gl.glEnable(GL10.GL_CULL_FACE); gl.glEnable(GL10.GL_SMOOTH); gl.glEnable(GL10.GL_DEPTH_TEST); gl.glCullFace(GL10.GL_BACK); gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); gl.glEnableClientState(GL10.GL_COLOR_ARRAY); gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertBuff); gl.glColorPointer(4, GL10.GL_FLOAT, 0, cBuff); gl.glDrawElements(GL10.GL_TRIANGLES, pIndex.length, GL10.GL_UNSIGNED_SHORT, pBuff); gl.glDisableClientState(GL10.GL_COLOR_ARRAY); gl.glDisableClientState(GL10.GL_VERTEX_ARRAY); gl.glDisable(GL10.GL_CULL_FACE); } } 

您必须使用glPushMatrix和glPopMatrix在翻译,旋转后返回到previus的位置…

 @Override public void onDrawFrame(GL10 gl) { // TODO Auto-generated method stub gl.glDisable(GL10.GL_DITHER); gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); gl.glMatrixMode(GL10.GL_MODELVIEW); gl.glLoadIdentity(); gl.glClientActiveTexture(DRAWING_CACHE_QUALITY_HIGH); //Draw cube 1 gl.glPushMatrix(); gl.glTranslatef(-0.5f, 0, -3.0f); gl.glRotatef(mAngleX, 0, 1, 0); gl.glRotatef(mAngleY, 1, 0, 0); mCube.draw(gl); gl.glPopMatrix(); //Draw cube 2 gl.glPushMatrix(); gl.glTranslatef(0, 0, -3.0f); gl.glRotatef(mAngleX, 0, 1, 0); gl.glRotatef(mAngleY, 1, 0, 0); mCube.draw(gl); gl.glPopMatrix(); //Draw cube 3 gl.glPushMatrix(); gl.glTranslatef(0.5f, 0, -3.0f); gl.glRotatef(mAngleX, 0, 1, 0); gl.glRotatef(mAngleY, 1, 0, 0); mCube.draw(gl); gl.glPopMatrix(); } 

实际绘制多维数据集的代码是以下三行:

 gl.glTranslatef(0, 0, -3.0f); gl.glRotatef(mAngleX, 0, 1, 0); gl.glRotatef(mAngleY, 1, 0, 0); mCube.draw(gl); 

它移动了坐标系,然后旋转它然后绘制立方体。 你想做什么把它移到其他地方并在那里画立方体。 喜欢这个:

 gl.glTranslatef(1.0, 0, 0f); mCube.draw(gl);