如何在OpenGL中绘制的边界框的高度获得高度?
Posted
技术标签:
【中文标题】如何在OpenGL中绘制的边界框的高度获得高度?【英文标题】:How to get altitude at the height of a bounding box drawn in OpenGL? 【发布时间】:2017-05-21 20:02:21 【问题描述】:我在 WorldWind 中使用 OpenGL/JOGL 绘制了一个框。此框是 3D 对象的边界框。所有这些代码都基于this forum here 中的代码。我的代码是从那里改编而来的,并且正在按照我想要的方式工作。我可以将模型及其框放在 WorldWINd 画布上,并在选择模型时检索原点的位置和高度。我的改编将原点放在盒子的“底”面和该面的中心,如下所示:
我需要知道的是边界框的最高高度是多少?可以使用 glRotate 调用在三个轴中的任何一个上旋转模型和相关框;它们也可以缩放。所有这些值都是由我的应用程序的用户任意选择的,但在程序中对我来说是可见的。因此,虽然我无法提前为它们做好计划,但我仍然可以使用这些值。与盒子内的模型相关的位置和高度在旋转/缩放期间不会改变,模型+盒子在绘制时旋转。这个例子在一个轴上旋转它:
如果没有旋转的可能性,我可以将框的缩放高度(Y 高度)添加到原点位置的高度,以获得顶部的高度。 旋转,难度更大。如果只能在一个轴上进行旋转,那么答案将来自以下问题中的数学:
Calculate Bounding box coordinates from a rotated rectangle AABB of rotated sprite?这很容易解释如何在 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 度之间,则会出现问题。即使它确实让我得到了正确的边长,它也不会有这些边中的哪一个指向“向上”。
【问题讨论】:
我认为this 是你想要的。 @NicoSchertler 链接失效:( 应该的。我刚刚检查过了。 可能是我的工作关系?即使我通过谷歌访问该网站,我也无法访问该网站。我回家后试试。谢谢。 【参考方案1】:您进行线性变换的方式非常不自然,而且效率也不高。
你应该有一个Rotations-Translation Matrix 并且只使用盒子的顶点。还要在要保留的盒子底部创建一个点。
现在很容易知道底部的地面在哪里:
请注意,每个旋转和/或平移的顶点都必须经过矩阵向量乘法。
这是要走的路。不要使用角、余弦、正弦和其他不方便的东西。一旦你弄清楚它是如何工作的,它实际上非常简单。
【讨论】:
我一直在尝试这样做,我有“bookkept”职位,但我无法获得旋转/平移矩阵。 JOGL 处理所有这些,如果我尝试检索它们,我只会得到恒等矩阵。 如果您使用 Java 或 C++(例如 GLM Library ),您可以实例化此类矩阵。无论如何,拥有它们绝对是至关重要的。如果你对顶点有写权限,那么你已经可以使用它们了。以上是关于如何在OpenGL中绘制的边界框的高度获得高度?的主要内容,如果未能解决你的问题,请参考以下文章