通过极坐标确定球体顶点并渲染它

时间:2013-03-20 18:53:05

标签: geometry rendering opengl-es-2.0 polar-coordinates

我正在Android设备上使用OpenGL ES 2.0。

我正在尝试让球体运行并绘制。 Currentley,我几乎有一个球体,但很明显它是非常非常错误的。

在我的应用程序中,我保存了一个Vector3列表,我将其转换为ByteBuffer,然后传递给OpenGL。 我知道我的代码没问题,因为我有一个Cube和Tetrahedron绘图nicley。 我改变了两个部分: 确定顶点 绘制顶点。

以下是有问题的代码snippits。我究竟做错了什么? 确定极坐标:

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

从Polar转换为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;
}

绘制圆圈:

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

显然我省略了一些代码,但我很肯定我的错误在于某些地方的这些snippits。 我没有对点进行任何操作,而是将它们传递给OpenGL,然后调用Triangles,它应该为我连接点。对吧?

编辑: 一张照片可能很棒!

SphereFail

2 个答案:

答案 0 :(得分:1)

你的z必须用phi计算。 float z = inLength * (float)Math.cos(inPhi);

此外,生成的点不是三角形,因此最好使用GL_LINE_STRIP

答案 1 :(得分:1)

在Polar球体上使用三角形条带就像成对绘制点一样简单,例如:

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

输入的第一个点如下公式,第二个点移动α角度的单步(从下一个并行)。