1

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

我正在尝试让一个球体启动并运行和绘图。Currentley,我几乎有一个球体,但显然它做得非常非常错误。

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

这是有问题的代码片段。我究竟做错了什么?确定极坐标:

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

从极坐标转换为笛卡尔坐标:

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

显然我省略了一些代码,但我很肯定我的错误在于这些片段的某个地方。我对这些点做的只是将它们传递给 OpenGL,然后调用 Triangles,它应该为我连接这些点.. 对吗?

编辑:图片可能很好!

SphereFail

4

2 回答 2

2

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

另外,生成的点不是三角形,所以最好使用 GL_LINE_STRIP

于 2013-03-21T06:13:26.053 回答
2

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

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

输入的第一个点如下公式,第二个点偏移一个α角(从下一个平行)。

于 2014-11-30T02:46:47.483 回答