我正在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,它应该为我连接点。对吧?
编辑: 一张照片可能很棒!
答案 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();
}
输入的第一个点如下公式,第二个点移动α角度的单步(从下一个并行)。