Вращение четырехугольника вокруг координаты в OpenGL - PullRequest
2 голосов
/ 05 января 2020

В настоящее время я программирую отображение основного полета, используя 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, о которых я пока не знаю.

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


Вопрос: Как можно вращать квад конкретная c координата в ортографической проекции c в OpenGL и Python?

1 Ответ

2 голосов
/ 05 января 2020

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

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 и glRotated определяют новую матрицу и умножают ее на текущую матрицу, эту инструкцию необходимо выполнять в обратном порядке.
Используйте glPushMatrix / 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? )

...