Определение вершин сфер через полярные координаты и их рендеринг

Я работаю с OpenGL ES 2.0 на устройстве Android.

Я пытаюсь запустить сферу и рисовать. В настоящее время у меня почти есть сфера, но очевидно, что она делается очень, очень неправильно.

В моем приложении я держу список Vector3, который по пути конвертирую в ByteBuffer и передаю в OpenGL. Я знаю, что мой код в порядке, так как у меня есть рисунок куба и тетраэдра. Какие две части я изменил: Определение вершин Рисование вершин.

Вот фрагменты кода, о которых идет речь. Что я делаю неправильно? Определение полярных координат:

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


person MintyAnt    schedule 20.03.2013    source источник


Ответы (2)


ваш z должен быть рассчитан с использованием фи. float z = inLength * (float)Math.cos(inPhi);

Кроме того, сгенерированные точки не являются треугольниками, поэтому лучше использовать GL_LINE_STRIP.

person DanP    schedule 21.03.2013
comment
Да, мой Z был неправ. Используя рисунок Line Strip, он получается в виде сферы, спасибо! Теперь мне просто нужно выяснить, как индексировать эти вершины как треугольники: x - person MintyAnt; 21.03.2013

Использовать треугольную полосу на полярной сфере так же просто, как рисовать точки попарно, например:

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

Первая точка вводится по формуле, а вторая смещается на один шаг угла альфа (от следующей параллели).

person bloody    schedule 30.11.2014