GLUT GL 3/4 сфера что-то не так - PullRequest
0 голосов
/ 16 января 2019

У меня есть задача сделать уроки графики. Я должен построить 3/4 с использованием только GL_TRIANGLE_STRIP. Я уже закончил это, но есть одна серьезная ошибка, которую я не могу принять.

GLfloat radius = 3, alpha, beta, PI = 3.14314159;


//lHorizontal and lVertical im changing using keyboard it says how many 
 sphere divisions are 

for (alpha = 0.0; alpha < PI; alpha += PI / lVertical)
{

    glBegin(GL_TRIANGLE_STRIP);


    for (beta = 0.0; beta < 1.5075*PI; beta += PI / lHorizontal)
    {

        glColor3f(1, 1, 0);
        x = radius * cos(beta)*sin(alpha);
        y = radius * sin(beta)*sin(alpha);
        z = radius * cos(alpha);

        glNormal3f(x, y, z);
        glVertex3f(x, y, z);

        glColor3f(0, 1, 1);
        x = radius * cos(beta)*sin(alpha + PI / lVertical);
        y = radius * sin(beta)*sin(alpha + PI / lVertical);
        z = radius * cos(alpha + PI / lVertical);

        glNormal3f(x, y, z);
        glVertex3f(x, y, z);



    }
    glEnd();
}


glColor3f(1, 1, 0);
glBegin(GL_TRIANGLE_STRIP);

for (alpha = PI; alpha < 2.01*PI; alpha += PI / lVertical) {
    x = -radius * sin(alpha);
    y = 0;
    z = radius * cos(alpha);
    glNormal3f(x, y, z);
    glVertex3f(x, y, z);
    glNormal3f(0, 0, 0);
    glVertex3f(0, 0, 0);
}
glEnd();


glBegin(GL_TRIANGLE_STRIP);

for (alpha = PI; alpha < 2.01*PI; alpha += PI / lVertical) {
    x = 0;
    y = radius * sin(alpha);
    z = -radius * cos(alpha);
    glNormal3f(x, y, z);
    glVertex3f(x, y, z);
    glNormal3f(0, 0, 0);
    glVertex3f(0, 0, 0);
}
glEnd();

Результат этого кода:

Correct one (pic)

По мере того, как я меняюсь, появляются горизонтальные фигуры, которых там быть не должно (см. Рис.). Что я могу изменить в коде, чтобы избежать этой проблемы?

Bugged one (pic)

1 Ответ

0 голосов
/ 18 января 2019

Значение PI неверно:

..., PI = 3.14314159; // 3.14159... ?

После исправления давайте проверим значения alpha во внешнем цикле для lVertical = 8:

int lVertical = 8;
GLfloat radius = 3, alpha, beta, PI = 3.141592654;

for (alpha = 0.0; alpha < PI; alpha += PI / lVertical)
{
    printf("%f, %f\n", alpha, alpha + PI / lVertical);
}

Выход:

0.000000, 0.392699
0.392699, 0.785398
0.785398, 1.178097
1.178097, 1.570796
1.570796, 1.963495
1.963495, 2.356194
2.356194, 2.748893
2.748893, 3.141593
3.141593, 3.534292 <<

3.534292 больше PI, что означает, что это недопустимое значение для alpha. Эффект заключается в том, что последнее многоугольное кольцо «складывается» вокруг, создавая часть, которой там быть не должно.

Лучше рассчитать углы напрямую из целочисленного индекса:

for (int i = 0; int i < lVertical; i++)
{
    GLfloat alpha1 = (PI / lVertical) * i;
    GLfloat alpha2 = (PI / lVertical) * (i + 1);

    glBegin(GL_TRIANGLE_STRIP);

    for (int j = 0; j < lHorizontal; j++)
    {
        GLfloat beta1 = (PI / lHorizontal) * j;
        GLfloat beta2 = (PI / lHorizontal) * (j + 1);

        glColor3f(1, 1, 0);
        x = radius * cos(beta1)*sin(alpha1);
        y = radius * sin(beta1)*sin(alpha1);
        z = radius * cos(alpha1);

        glNormal3f(x, y, z);
        glVertex3f(x, y, z);

        glColor3f(0, 1, 1);
        x = radius * cos(beta2)*sin(alpha2);
        y = radius * sin(beta2)*sin(alpha2);
        z = radius * cos(alpha2);

        glNormal3f(x, y, z);
        glVertex3f(x, y, z);
    }

    glEnd();
}
...