2012-03-26 69 views
1

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

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); 
} 



} 

回答

4

必须使用glPushMatrix和glPopMatrix返回previus possition后平移,旋转...

@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(); 

} 
+0

我没有画任何东西。我必须在最后一个多维数据集绘图之后删除gl.PopMatrix()。它应该工作而不会被删除? – 2016-02-06 18:38:00

+0

@Mitulátbáti,gl.PopMatrix()调用的次数应该与glPushMatrix()相同,如果代码中某处存在pushmatrix而没有正确的popmatrix – SteveL 2016-02-07 10:13:51

+0

生成1000个多维数据集并且它可以工作。但有了这3个,当3-3 pop/pushmatrix时它仍然不起作用。我不明白为什么...谢谢。 – 2016-02-07 18:16:59

1

你有实际绘制立方体的代码是以下三行:

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); 
+0

感谢。把它移到其他地方?喜欢如何?让我们把它简单。我怎样才能在我的代码中与当前不同的位置绘制第二个立方体? – jmishra 2012-03-26 20:33:18

+0

更新了我的回答 – CaseyB 2012-03-26 20:34:25

+0

没有工作。它要么没有在屏幕外的地方画或移动立方体。而且,它还没有解决这个问题的主要关注点。我想能够从同一个类中绘制多个这样的立方体。职位可能是第二个问题。 – jmishra 2012-03-26 20:49:54