【问题标题】:C++ How to calculate an arc between two 3D pointsC ++如何计算两个3D点之间的弧
【发布时间】:2017-08-08 16:56:38
【问题描述】:
我通读了论坛,我确信以前有人问过这个问题,但我真的找不到我要找的东西。
我的问题如下:
我有一个沿着样条线移动的 AI 角色。如果该路径被阻挡,角色应围绕它沿弧线移动,然后继续沿其路径前进。
为了论证,假设样条线的长度为 7000 个单位。
因此,我有两个 3D (x,y,z) 向量。第一个向量是 AI-bot 的当前位置,第二个向量是经过障碍物的位置。暂时让我们说:当前样条位置 + 400 个单位;稍后我可以做一条线追踪来获得障碍物的尺寸等,但现在我不在乎它。
现在我想计算一条替代路径以避免上述障碍 - 因此计算这两点之间的弧 - 我该怎么做?
我的数学真的很糟糕,但我看了弹道,因为我认为它会是一样的,只是无法真正理解它:
【问题讨论】:
标签:
c++
3d
trigonometry
unreal-engine4
unreal-blueprint
【解决方案1】:
它不一定是弧线。您可以通过一种非常简单的方式递归地解决这个问题。
假设你在位置 A,障碍物在位置 B。你可以做以下动作:
- 从当前位置到
A+V(B[x]+height(B),0,0)
- 从当前位置到
A+V(0,B[y]+width(B),0)
- 从当前位置到
A+V(B[x]-height(B),0,0)
其中 V 是包含 V(x,y,z) 分量的向量,width(B) 是障碍物的宽度,B[x] 是 B 位置的 x 分量。这样你就可以绕着它移动沿着一个矩形。您现在可以通过将该矩形分成两半来平滑路径。 3个细分足以使这个足够平滑。要细分,取第一条路径的中间点,并在第二条路径的中间画一条线。从第二条路径到第三条路径的操作相同,现在您的矩形变成了八边形。如果这还不够顺畅,请再执行几个步骤。这将创建一个您可以使用的新样条线。
【解决方案2】:
我会研究样条曲线和 EQS 系统的组合。样条曲线定义了要遵循的理想路径。 EQS 系统会在路径附近或路径上找到位置,同时仍会进行避障。 EQS 可以返回所有有效的目的地,因此您可以按自定义标准手动订购它们。
设置在样条线上的 Actor 确实可以工作,但是当让它们停止跟随样条、在正确的点创建新的、将 Actor 附加到新的样条等时,会出现一大堆混乱。
【解决方案3】:
在完全采用添加样条点等的混乱方式后,我昨天得出了这个结论。我看到的唯一问题是我发现 EQS 系统非常难以理解。不遵循这些示例,而是以我需要的方式对其进行修改。让我们看看,我会及时通知你。