2011-05-20 101 views
9

我一直在試圖創建使用OpenGL ES我自己的球,我跟這裏描述http://www.math.montana.edu/frankw/ccp/multiworld/multipleIVP/spherical/learn.htm問題在OpenGL繪圖球體ES

然而,當我繪製球體(只是頂點)數學,只是一半該球體已被繪製。能否請你指出我什麼是代碼,我給下面的具體問題:

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

}

我真的感謝一些幫助。

P.S:我試圖改變順時針改爲逆時針仍然沒有運氣 感謝

+2

你可以發佈你正在獲得的球體的屏幕截圖嗎?我相信這個問題與撲殺有關。 – andijcr 2011-05-20 14:32:08

+0

對不起,我不能在這裏發佈圖片(它不允許我)這裏是rapidshare鏈接https://rapidshare.com/files/1813958102/question.png – Ali 2011-05-20 17:53:38

+0

你的活動類樂怎麼樣? – 2012-07-09 12:53:16

回答

12

更改此

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

這個

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

修復它。謝謝 – Ali 2011-05-22 08:11:02

3

其實,改變

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

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

就夠了。使用從(Math.PI)到+(Math.PI)的phi,您可以360度旋轉並計算每個點兩次。你也可以這樣做:

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

避免計數兩次。