Mit OpenGL ES Ich Rendern eine einfache Cube-Klasse, die es in der Mitte des Bildschirms zeichnet. Ich möchte jedoch in der Lage sein, mehrere solcher Würfel auf zufälligen Positionen auf dem Bildschirm zu zeichnen, weiß aber nicht wie. Hier ist meine benutzerdefinierte Oberflächenansicht, die den Cube als private Klasse darstellt. Ich habe meinen Haupt-ActivityManager nicht mit aufgenommen, da dies nicht die Ursache ist.Zeichnen mehrerer Würfel an zufälligen Positionen in OpenGL es 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);
}
}
}
ist hier MYGLCube
, die für die Konstruktion des Würfels
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);
}
}
Ich habe nichts gezeichnet. Ich musste die gl.PopMatrix() nach der letzten Würfelzeichnung entfernen. Sollte es funktionieren, ohne auch zu entfernen? –
@ Mitulátbáti, die Anzahl der gl.PopMatrix() Anrufe sollte die gleiche wie glPushMatrix() sein, suchen Sie, wenn irgendwo in Ihrem Code haben Sie eine Pushmatrix ohne seine richtige Popmatrix – SteveL
Generieren von 1000 Cubes und es funktioniert. Aber mit diesen 3 funktioniert es immer noch nicht, wenn es 3-3 Pop/Push-Matrix gibt. Ich verstehe nicht warum ... Danke trotzdem. –