GLUT GL 3/4 сфера что-то не так

Это наилучшее решение , которое я нашел до сих пор.

Предположим, что у нас есть пакет с именем org.mypackage, содержащий классы:

  • HelloWorld (основной класс)
  • SupportClass
  • UtilClass

и файлы, определяющие этот пакет, хранятся физически в каталоге D:\myprogram (в Windows ) или /home/user/myprogram (в Linux).

Структура файла будет выглядеть так:

Когда мы вызываем Java, мы указываем имя приложение для запуска: org.mypackage.HelloWorld. Однако мы также должны сказать Java, где искать файлы и каталоги, определяющие наш пакет. Поэтому, чтобы запустить программу, мы должны использовать следующую команду:

-1
задан Spektre 17 January 2019 в 04:32
поделиться

1 ответ

Значение 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();
}
0
ответ дан meowgoesthedog 17 January 2019 в 04:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: