我使用OpenGL / JOGL在WorldWind中绘制了一个框。此框是3D对象的边界框。所有这些代码都基于this forum here中的代码。我的代码改编自那,并按照我想要的方式工作。我可以在WorldWInd画布上放置模型及其框,并在拾取模型时检索原点的位置和高度。我的改编将原点放在盒子的“底部”面上,并且就像那样:
我需要知道的是边界框的最高海拔?可以使用glRotate调用在三个轴中的任意一个轴上旋转模型和相关的框;它们也可以缩放。所有这些值都是由我的应用程序的用户任意选择的,但在程序中对我来说是可见的。因此,虽然我无法提前计划,但我仍然可以使用这些值。在旋转/缩放期间,与框内模型关联的位置和高度不会改变,模型+框在绘制时旋转。此示例在一个轴上旋转它:
如果没有旋转的可能性,我可以将盒子的缩放高度(Y高度)添加到原点位置的高度,以获得顶部的高度。 旋转时,更难。如果只能在一个轴上进行旋转,那么答案将来自这些问题中的数学:
可以轻松解释如何在2D中完成我想要的操作。在3D中,数学变得更加复杂。
- 在所有3个轴上调用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度之间,则会混乱。即使它确实给我正确的边长,也不会让这些边中的哪一个指向“向上”。
答案 0 :(得分:0)
你进行线性变换的方式非常不自然,而且效率也不高。
你应该有一个Rotations-Translation Matrix并且只能使用该框的顶点。还要在要保留的框的底部创建一个点。
现在知道底部的底部是非常容易的:
请注意,旋转和/或平移的每个顶点都必须经历此矩阵向量乘法。
这是要走的路。不要使用角度,余弦,正弦和其他不方便的东西。一旦你弄清楚它是如何工作的,它实际上就是简单。