質問

I am working with OpenGL ES 2.0 on an Android device.

I am trying to get a sphere up and running and drawing. Currentley, I almost have a sphere, but clearly it's being done very, very wrong.

In my app, I hold a list of Vector3's, which I convert to a ByteBuffer along the way, and pass to OpenGL. I know my code is okay, since I have a Cube and Tetrahedron drawing nicley. What two parts I changed were: Determing the vertices Drawing the vertices.

Here are the code snippits in question. What am I doing wrong? Determining the polar coordinates:

private void ConstructPositionVertices()
{
    for (float latitutde = 0.0f; latitutde < (float)(Math.PI * 2.0f); latitutde += 0.1f)
    {
        for (float longitude = 0.0f; longitude < (float)(2.0f * Math.PI); longitude += 0.1f)
        {
            mPositionVertices.add(ConvertFromSphericalToCartesian(1.0f, latitutde, longitude));
        }
    }
}

Converting from Polar to Cartesian:

public static Vector3 ConvertFromSphericalToCartesian(float inLength, float inPhi, float inTheta)
{
    float x = inLength * (float)(Math.sin(inPhi) * Math.cos(inTheta));
    float y = inLength * (float)(Math.sin(inPhi) * Math.sin(inTheta));
    float z = inLength * (float)Math.cos(inTheta);
    Vector3 convertedVector = new Vector3(x, y, z);
    return convertedVector;
}

Drawing the circle:

inGL.glDrawArrays(GL10.GL_TRIANGLES, 0, numVertices);

Obviously I omitted some code, but I am positive my mistake lies in these snippits somewhere. I do nothing more with the points than pass them to OpenGL, then call Triangles, which should connect the points for me.. right?

EDIT: A picture might be nice!

SphereFail

役に立ちましたか?

解決

your z must be calculated using phi. float z = inLength * (float)Math.cos(inPhi);

Also,the points generated are not triangles so it would be better to use GL_LINE_STRIP

他のヒント

Using triangle strip on Polar sphere is as easy as drawing points in pairs, for example:

const float GL_PI = 3.141592f;

GLfloat x, y, z, alpha, beta; // Storage for coordinates and angles        
GLfloat radius = 60.0f;
const int gradation = 20;

for (alpha = 0.0; alpha < GL_PI; alpha += GL_PI/gradation)
{        
    glBegin(GL_TRIANGLE_STRIP);
    for (beta = 0.0; beta < 2.01*GL_PI; beta += GL_PI/gradation)            
    {            
        x = radius*cos(beta)*sin(alpha);
        y = radius*sin(beta)*sin(alpha);
        z = radius*cos(alpha);
        glVertex3f(x, y, z);
        x = radius*cos(beta)*sin(alpha + GL_PI/gradation);
        y = radius*sin(beta)*sin(alpha + GL_PI/gradation);
        z = radius*cos(alpha + GL_PI/gradation);            
        glVertex3f(x, y, z);            
    }        
    glEnd();
}

First point entered is as follows the formula, and the second one is shifted by the single step of alpha angle (from the next parallel).

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top