Как получить высоту на высоте ограничивающей рамки, нарисованной в OpenGL?

У меня есть коробка, нарисованная в WorldWind с использованием OpenGL/JOGL. Эта рамка является ограничивающей рамкой для 3D-объекта. Весь этот код основан на коде, который можно найти на этом форуме. Мой код адаптирован из этого и работает так, как я хочу. Я могу поместить модель и ее коробку на холст WorldWInd и получить положение и высоту исходной точки при выборе модели. Моя адаптация помещает начало координат в то, что будет «нижней» стороной коробки, и в центр этой грани, например: позиция, указанная на нижней грани

Что мне нужно знать, так это наибольшая высота ограничивающей рамки? Модели и связанные с ними блоки можно вращать по любой из трех осей с помощью вызова glRotate; их также можно масштабировать. Все эти значения произвольно выбираются пользователем моего приложения, но видны мне в программе. Поэтому, хотя я не могу планировать их заранее, я все же могу использовать значения. Положение и высота, связанные с моделью внутри блока, не изменяются во время вращения/масштабирования, модель + блок поворачиваются при рисовании. Этот пример вращает его по одной оси:

позиция не изменилась, но поле в этой точке повернуто на 90 градусов

Без возможности вращения я могу добавить масштабированную высоту коробки (высоту Y) к высоте исходного положения, чтобы получить высоту наверху. С вращением сложнее. Если бы вращение было возможно только по одной оси, ответ был бы получен из математики, используемой в таких вопросах, как эти:

которые легко объясняют, как делать то, что я хочу в 2D. В 3D математика усложняется.

– Как получить высоту блока после вызова glRotate по всем трем осям? Предпочтительно в метрах или в формате, который можно легко преобразовать в метры. Потому что мне действительно нужна высота в самой высокой точке ящика.

– Существует ли вызов gl для получения высоты или это будет чистая математика? Если вызов gl, что это, пожалуйста? Если математика, может кто-нибудь объяснить формулу? Я пробовал математику, но я продолжаю получать отрицательные числа, что неправильно.

Что я делаю до сих пор:

theta1 = вращение по оси Y, theta2 = вращение по оси X, theta3 = вращение по оси Z

XY = (originalYHeight)*cos(theta1) + (originalXWidth)*sin(theta1)
XZ = (originalXWidth)*cos(theta2) + (originalZDepth)*sin(theta2)
YZ = (originalZDepth)*cos(theta3) + (originalYHeight)*sin(theta3)

Это мешает, если углы поворота отрицательные/между 90° и 270°. Даже если он даст мне правильные длины сторон, он не будет знать, какая из этих сторон указывает «вверх».


person Lumos    schedule 06.01.2017    source источник
comment
Я думаю, это то, что вам нужно.   -  person Nico Schertler    schedule 07.01.2017
comment
@NicoSchertler ссылка не работает :(   -  person Lumos    schedule 10.01.2017
comment
Должно. Я только что проверил это.   -  person Nico Schertler    schedule 11.01.2017
comment
Может это моя рабочая связь? Я не могу зайти на сайт, даже если захожу через гугл. Я попробую, когда буду дома. Спасибо.   -  person Lumos    schedule 11.01.2017


Ответы (1)


То, как вы выполняете линейные преобразования, очень неестественно и не очень эффективно.

У вас должна быть матрица вращения-перемещения, и вы должны работать исключительно с вершинами прямоугольника. Также создайте точку на дне коробки, которую вы хотите сохранить.

Теперь смехотворно легко узнать, где находится основание дна:

применение матрицы RT

Обратите внимание, что каждая вершина, которая вращается и/или перемещается, должна пройти это матрично-векторное умножение.

Это путь. Не используйте углы, косинусы, синусы и другие неудобные вещи. На самом деле это довольно просто, как только вы поймете, как это работает.

person Armen Avetisyan    schedule 16.01.2017
comment
Я пытался это сделать, у меня есть позиция «книга», но я не могу получить матрицы поворотов/переводов. JOGL обрабатывает все это, и если я попытаюсь получить их, я получу только идентификационные матрицы. - person Lumos; 18.01.2017
comment
Если вы используете Java или C++ (например, GLM Library), вы может создавать экземпляры таких матриц. Они в любом случае абсолютно необходимы. Если у вас есть доступ на запись к вершинам, то вы уже можете их использовать. - person Armen Avetisyan; 18.01.2017