首页 > 解决方案 > 立即从 3D 管道访问 2D 框的 Unity 功能?

问题描述

在 Unity 中,假设您有一个 3D 对象,

在此处输入图像描述

当然,获得 AABB 是微不足道的,Unity 有直接的功能,

在此处输入图像描述

(您可能必须以通常的方式“添加渲染器的所有边界框”,没问题。)

所以 Unity 确实有一个直接的功能,可以立即为您提供 3D AABB 盒子,而不是每帧的内部网格/渲染管道。

现在,对于有问题的相机,按照定位,AABB 确实覆盖了某个 2D 边界框......

在此处输入图像描述

事实上......是否有某种内置的直接方法可以在 Unity 中找到橙色的 2D 框?

问题 - Unity 是否具有立即从管道中提供 2D 截锥体的功能?

(请注意,要手动执行此操作,您只需为 AABB 的 8 个点制作光线(或使用世界到屏幕空间,就像 Draco 提到的那样);将它们封装在 2D 中以制作橙色框。)

我不需要手动解决方案,我在问引擎是否每帧都从管道中以某种方式给出这个?

有电话吗?

(确实,如果有这个会更好......)

在此处输入图像描述

我的感觉是其中一个或所有

肯定会知道橙色框,甚至可能知道管道内的蓝色框,就在显卡旁边,就像它知道给定网格的 AABB 一样。

我们知道 Unity 可以让您在给定网格的每一帧立即点击 AABB 3D 框:事实上,Unity 是否给出了“2D 截锥体边界”,如此处所示?

标签: unity3d3dgame-physicsaabb

解决方案


据我所知,没有内置的

但是,自己找到极端确实非常容易。获取网格的边界框(屏幕截图中显示的长方体)就是这样做的方式,您只是在变换的空间中进行。

  1. 遍历网格的所有顶点,执行以下操作:
  2. 将点从本地空间转换到世界空间(这处理缩放和旋转)
  3. 将点从世界空间转换为屏幕空间
  4. 确定新点的 X 和 Y 是否高于/低于存储的 min/max 值,如果是,则使用新值更新存储的 min/max
  5. 遍历所有顶点后,您将获得 4 个值:min-X、min-Y、max-X 和 max-Y。现在你可以构建你的边界矩形

您可能还希望首先执行模型的礼品包装,并且只处理生成的凸包(因为不属于凸包的任何点都不会超出凸包的边界)。如果您打算在模型在屏幕上移动、缩放或旋转时绘制此屏幕空间矩形,并且必须重新计算边界框,那么您需要执行此操作并缓存结果。

请注意,如果模型具有动画效果(例如,如果您的类人机器人站起来并跳起千斤顶),这将不起作用解决动画案例要困难得多,因为您必须将每个动画的每一帧都视为原始网格的一部分,以便进行凸包求解(以确保您的任何动画都不会移动网格的一部分在凸包之外),以幂增加复杂性。


推荐阅读