Проблема рисования сферы в OPENGL ES

Я пытаюсь создать свою собственную сферу с помощью OpenGL ES, и я следовал математике, описанной здесь. Http://www.math.montana.edu/frankw/ccp/multiworld/multipleIVP/spherical/learn.htm

Однако, когда я рисую сферу (только вершины), нарисована только половина сферы. Не могли бы вы указать мне, какая именно проблема в коде, который я даю ниже:

public class Sphere { static private FloatBuffer sphereVertex; static private FloatBuffer sphereNormal; static float sphere_parms[]=new float[3]; double mRaduis; double mStep; float mVertices[]; private static double DEG = Math.PI/180; int mPoints; /** * The value of step will define the size of each facet as well as the number of facets * * @param radius * @param step */ public Sphere( float radius, double step) { this.mRaduis = radius; this.mStep = step; sphereVertex = FloatBuffer.allocate(40000); mPoints = build(); Log.d("ALIS CHECK!!!!!!", " COUNT:" + mPoints); } public void draw(GL10 gl) { gl.glFrontFace(GL10.GL_CW); gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); gl.glVertexPointer(3, GL10.GL_FLOAT, 0, sphereVertex); gl.glColor4f(1.0f, 0.0f, 0.0f, 1.0f); gl.glDrawArrays(GL10.GL_POINTS, 0, mPoints); gl.glDisableClientState(GL10.GL_VERTEX_ARRAY); } private int build() { /** * x = p * sin(phi) * cos(theta) * y = p * sin(phi) * sin(theta) * z = p * cos(phi) */ double dTheta = mStep * DEG; double dPhi = dTheta; int points = 0; for(double phi = -(Math.PI/2); phi <= Math.PI/2; phi+=dPhi) { //for each stage calculating the slices for(double theta = 0.0; theta <= (Math.PI * 2); theta+=dTheta) { sphereVertex.put((float) (mRaduis * Math.sin(phi) * Math.cos(theta)) ); sphereVertex.put((float) (mRaduis * Math.sin(phi) * Math.sin(theta)) ); sphereVertex.put((float) (mRaduis * Math.cos(phi)) ); points++; } } sphereVertex.position(0); return points; } } 

Также здесь мой класс рендеринга:

 /** * These values are used to rotate the image by a certain value */ private float xRot; private float yRot; public void setxRot(float xRot) { this.xRot += xRot; } public void setyRot(float yRot) { this.yRot += yRot; } public GLViewRenderer(Context ctx) { //initialize our 3D triangle here mSphere = new Sphere(1, 25); //Initializing the rate counter object //This will help us in calculating the frames per second fpsCalculator = new RateCounter(TAG); fpsCalculator.start(); } public void onSurfaceCreated(GL10 gl, EGLConfig config) { //initialize all the things required for openGL configurations gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f); gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST); } public void onDrawFrame(GL10 gl) { if(fpsCalculator != null) fpsCalculator.countOnce(); //write the drawing code needed gl.glClear(GL10.GL_COLOR_BUFFER_BIT); gl.glLoadIdentity(); /** * Change this value in z if you want to see the image zoomed in */ gl.glTranslatef(0.0f, 0.0f, -5.0f); gl.glRotatef(xRot, 0.0f, 1.0f, 0.0f); gl.glRotatef(yRot, 1.0f, 0.0f, 0.0f); mSphere.draw(gl); } public void onSurfaceChanged(GL10 gl, int width, int height) { if(height == 0) { height = 1; } gl.glViewport(0, 0, width, height); gl.glMatrixMode(GL10.GL_PROJECTION); gl.glLoadIdentity(); //Calculate The Aspect Ratio Of The Window GLU.gluPerspective(gl, 45.0f, (float)width / (float)height, 0.1f, 100.0f); gl.glMatrixMode(GL10.GL_MODELVIEW); //Select The Modelview Matrix gl.glLoadIdentity(); //Reset The Modelview Matrix } /** * Used to stop the FPS counter */ public void pause() { if(fpsCalculator != null) fpsCalculator.stop(); } 

}

Я бы очень признателен за помощь в этом.

PS: Я пробовал менять CW на CCW до сих пор не повезло Спасибо

Solutions Collecting From Web of "Проблема рисования сферы в OPENGL ES"

Изменить это

 for(double phi = -(Math.PI/2); phi <= Math.PI/2; phi+=dPhi) 

к этому

 for(double phi = -(Math.PI); phi <= Math.PI; phi+=dPhi) 

Собственно, меняя

 for(double phi = -(Math.PI/2); phi <= Math.PI/2; phi+=dPhi) 

в

 for(double phi = -(Math.PI); phi <= 0; phi+=dPhi) 

достаточно. С phi от – (Math.PI) до + (Math.PI) вы делаете поворот на 360 градусов и считаете каждую точку дважды. Вы также можете сделать:

 for(double phi = -(Math.PI); phi <= Math.PI; phi+=dPhi) { for(double theta = 0.0; theta <= (Math.PI); theta+=dTheta) { ... } } 

Чтобы избежать счета дважды.