У меня есть коробка, нарисованная в WorldWind с использованием OpenGL/JOGL. Эта рамка является ограничивающей рамкой для 3D-объекта. Весь этот код основан на коде, который можно найти на этом форуме. Мой код адаптирован из этого и работает так, как я хочу. Я могу поместить модель и ее коробку на холст WorldWInd и получить положение и высоту исходной точки при выборе модели. Моя адаптация помещает начало координат в то, что будет «нижней» стороной коробки, и в центр этой грани, например:
Что мне нужно знать, так это наибольшая высота ограничивающей рамки? Модели и связанные с ними блоки можно вращать по любой из трех осей с помощью вызова glRotate; их также можно масштабировать. Все эти значения произвольно выбираются пользователем моего приложения, но видны мне в программе. Поэтому, хотя я не могу планировать их заранее, я все же могу использовать значения. Положение и высота, связанные с моделью внутри блока, не изменяются во время вращения/масштабирования, модель + блок поворачиваются при рисовании. Этот пример вращает его по одной оси:
Без возможности вращения я могу добавить масштабированную высоту коробки (высоту 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°. Даже если он даст мне правильные длины сторон, он не будет знать, какая из этих сторон указывает «вверх».