Вращение четырехугольника вокруг координаты в OpenGL

В настоящее время я программирую основной дисплей полета с использованием Python и OpenGL. Поскольку у меня нулевой опыт работы с OpenGL (и небольшой опыт программирования в целом), мне сложно реализовать простейшую реализацию функций, но до сих пор я дошел до этого:

Pi2Fly

Моя проблема сейчас состоит в том, чтобы повернуть искусственный горизонт вокруг центральной точки области просмотра (400x240) в соответствии с данными поворота. Мое окно просмотра имеет размер 800x480 с квадратом, представляющим искусственный горизонт размером 1000x2880.

Отображение данных шага легко, потому что 1 градус равен 8 пикселям на текстуре окна просмотра / горизонта.

Numbers.p_offset = -Data.pitch*8, который я могу просто добавить ко всем четырем y-координатам четырехугольника.

def horizon():

    glBindTexture(GL_TEXTURE_2D, horizontexture)

    glEnable(GL_BLEND)
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)
    glEnable(GL_TEXTURE_2D)
    glColor4f(1, 1, 1, 1)

    glBegin(GL_QUADS)
    glTexCoord2f(0, 1); glVertex2f(-100, -1200+Numbers.p_offset)
    glTexCoord2f(1, 1); glVertex2f(900, -1200+Numbers.p_offset)
    glTexCoord2f(1, 0); glVertex2f(900, 1680+Numbers.p_offset)
    glTexCoord2f(0, 0); glVertex2f(-100, 1680+Numbers.p_offset)
    glEnd()

    glDisable(GL_TEXTURE_2D)

Что непросто, так это отобразить данные поворота (от -180 ° до 180 °), поскольку изменение поворота изменит координаты x- и y четырехъядерный. Сначала необходимо применить смещение шага (чтобы вертикальная центральная линия квадрата находилась в центре окна просмотра), а затем вращение, соответствующее вращению. Я не могу понять математику того, как вычислить смещение, которое может вызвать рулон, поэтому я ищу решение, как это сделать с помощью некоторых функций OpenGL, о которых я еще не знаю.

Все уроки и вопросы / ответы, которые я нашел, были конкретно о том, как вращать четырехугольник вокруг его собственной центральной точки, а не другой координаты.


Вопрос: Как можно повернуть четырехугольник вокруг определенной координаты в ортогональной проекции в OpenGL и Python?


person GittingGud    schedule 05.01.2020    source источник


Ответы (1)


Сначала вам нужно определить точку поворота:

pivot_x = (900 + (-100)) / 2
pivot_y = (-1200 + 1680) / 2

Если вы хотите повернуть объект вокруг точки поворота, вам необходимо:

  • Переведите объект таким образом, чтобы точка поворота находилась в начале координат (0, 0, 0): glTranslatef(-pivot_x, -pivot_y, 0)

  • Поверните объект в плоскости xy вида: glRotate(angle, 0, 0, 1)

  • Переведите прямоугольник так, чтобы точка поворота вернулась в исходное положение: glTranslatef(pivot_x, pivot_y, 0)

Поскольку такие операции, как glTranslated и _ 6_ определить новую матрицу и умножить ее на текущую матрицу, эти инструкции необходимо выполнять в обратном порядке.
Используйте _ 7_ / glPopMatrix для сохранения и восстановления текущей матрицы до и после операций. например.:

def horizon():

    pivot_x = (900 + (-100)) / 2
    pivot_y = (-1200 + 1680) / 2
    glPushMatrix()

    # rotate around pivot (roll)
    glTranslatef(pivot_x, pivot_y, 0)
    glRotatef(angle, 0, 0, 1)
    glTranslatef(-pivot_x, -pivot_y, 0)

    # apply pitch
    glTranslatef(0, Numbers.p_offset, 0)

    glBindTexture(GL_TEXTURE_2D, horizontexture)

    glEnable(GL_BLEND)
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)
    glEnable(GL_TEXTURE_2D)
    glColor4f(1, 1, 1, 1)

    glBegin(GL_QUADS)
    glTexCoord2f(0, 1); glVertex2f(-100, -1200)
    glTexCoord2f(1, 1); glVertex2f(900, -1200)
    glTexCoord2f(1, 0); glVertex2f(900, 1680)
    glTexCoord2f(0, 0); glVertex2f(-100, 1680)
    glEnd()

    glDisable(GL_TEXTURE_2D)

    glPopMatrix()

(См. Также Как использовать точку поворота в преобразованиях и Как повернуть 2D-линию в PyOpenGL? )

person Rabbid76    schedule 05.01.2020
comment
Высота звука применяется с Numbers.p_offset в glVertex2f() в horizon. Можно ли переводить и вращать квад после применения шага? Я попытался вставить новый код после создания четырехугольника и наложения текстуры, но это просто игнорирует код. Если крен (вращение) применяется до horizon, возникнет та же проблема, потому что если вы примените вращение до смещения в плоскости y (тангаж), вертикальная центральная линия четырехугольника больше не будет центрирована. - person GittingGud; 05.01.2020
comment
@GittingGud Так что, вероятно, точка опоры неверна. Попробуйте pivot_y = (-1200 + 1680) / 2 - person Rabbid76; 05.01.2020
comment
Это исправляет это, и, оглядываясь назад, это тоже логично. Y-сдвиг (p_offset) не влияет на размер квадрата и, следовательно, на точку поворота. Спасибо за вашу помощь! - person GittingGud; 05.01.2020
comment
@GittingGud Обратите внимание, pich может применяться glTranslatef(0, Numbers.p_offset, 0). Я изменил это в ответе. - person Rabbid76; 05.01.2020