2011-11-25 21 views
0

我正在绘制一个圆,即使我在android中使用java opengl ES绘制了一个基本形状(eg.square,diamond)。在Android的早期版本中,OpenGL ES对象形状未能正确绘制。

如果我在蜂窝中运行应用程序的形状会很好,但如果我运行它的形状更少不必要的点在绘制(它分散),如果我继续执行它很少它没有那些点。

我的渲​​染器类,

public void onDrawFrame(GL10 gl) { 
    gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); 
    gl.glMatrixMode(GL10.GL_MODELVIEW); 
gl.glLoadIdentity(); 
gl.glTranslatef(0, 0, -5.0f); 
gl.glRotatef(-100, 1.0f, 0.0f, 0.0f); 
gl.glRotatef(40, 1.0f, 0.0f, 0.0f); 

mCircle= new Circle(); 
    Circle.setCirclePoints(1.5f,4, 1, 360); 
Circle.draw(gl); 

} 

public void onSurfaceChanged(GL10 gl, int width, int height) { 
gl.glViewport(0, 0, width, height);   
    float ratio = (float) width/height; 
gl.glMatrixMode(GL10.GL_PROJECTION); 
gl.glLoadIdentity(); 
gl.glOrthof(-6.5f, +6.5f, -6.5f, 6.5f, 6.5f, -6.5f); 

    } 
      public void onSurfaceCreated(GL10 gl, EGLConfig config) { 
     gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST); 
gl.glClearColor(0,0,0,0); 
gl.glEnable(GL10.GL_CULL_FACE); 
gl.glShadeModel(GL10.GL_SMOOTH); 
gl.glEnable(GL10.GL_DEPTH_TEST); 
    } 

在我的圈子里类

public void setCirclePoints(float radius, int slices, int stacks, 
     float angle) 
    ByteBuffer vbb = ByteBuffer.allocateDirect(((slices+2)* 3 * 4)); 
    vbb.order(ByteOrder.nativeOrder()); 
    mSliceVertexBuffer = vbb.asFloatBuffer(); 

    mSliceVertexBuffer.put(0.0f); 
    mSliceVertexBuffer.put(0.0f); 
    mSliceVertexBuffer.put(nsign * radius); 

    for (int j = 0; j <= slices; j++) { 
     theta = j * dtheta; 
     x = (float) 1.25f * (float) (Math.cos(theta + dupTheta)); 
     y = (float) Math.sin(theta + dupTheta); 
     z = nsign; 
     mSliceVertexBuffer.put(x * radius); 
     mSliceVertexBuffer.put(y * radius); 
     mSliceVertexBuffer.put(z * radius); 
     } 

       } 
public void draw(GL10 gl){ 
    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); 
    gl.glVertexPointer(3, GL10.GL_FLOAT, 0, mSliceVertexBuffer); 
    gl.glColor4f(212,21,54,34); 
    gl.glDrawArrays(GL10.GL_TRIANGLE_FAN, 0,sliceCount); 
    gl.glDisableClientState(GL10.GL_VERTEX_ARRAY); 
} 

我真的线索少。我不知道为什么它没有Android版本< 3.0正确绘制。我试图解决它,我发现,当我试图绘制点时,很少的顶点会出现在视口(可能是无穷大,我不知道)在Android 2.3.3,但对于在android 3.0中的相同点,它绘制正确的形状。

帮帮我。

回答

0

我犯了一个大错错 的问题是在

gl.glDrawArrays(GL10.GL_TRIANGLE_FAN, 0,sliceCount); 

其中sliceCount是点X,Y,Z的总数。我分一个由3

 gl.glDrawArrays(GL10.GL_TRIANGLE_FAN, 0,sliceCount/3); 
2
x = (float) 1.25f * (float) (Math.cos(theta + dupTheta)); 

什么假设1.25倍意思?如果你的圆圈以椭圆形出现,那是因为你的投影矩阵不考虑窗口方面。

+0

的确,我想画一个椭圆形不完全是一个圆圈..很少在姜饼版本,它吸取正确的时候我一直在运行的应用程序,其余的时候,它是越来越扭曲,但在蜂窝它正确绘制椭圆。如何解决它?提前致谢。 – srinivasan

+0

嗨,我试图通过改变投影矩阵和模型视图矩阵,但我面临的问题,如圆不平滑,点绘制出视口,但同样的点,它绘制平滑和适当的有时在2.3和3.0它总是来好......帮我解决...... – srinivasan

相关问题