我正在编写一个小型视频游戏原型,我有一个将由对象遍历的高度图(2D浮点数组)。我希望能够在对象下获取高度图数据,以便在游戏中使用。
我目前使用AABB(轴对齐的边界框)在我的对象下获得高度图的子区域(黄色),因为我将处理它们周围和周围的数据。那部分是微不足道的。
但是我无法弄清楚如何在给定旋转边界框(不是轴对齐)的对象下找到样本(红色)。我怎么能这样做?
答案 0 :(得分:1)
我可能会建议以下方案:
为了做第3部分,你需要做一些数学运算。假设您知道车轮的单位方向向量D
,其中心位置C
,半长l
和半厚度w
。对于点P
,您可以检查以下条件:
abs( dot(P - C, D)) <= l
abs(cross(P - C, D)) <= w
这是解决问题的一种更复杂的方法,但效率更高。仅枚举通过AABB检查获得的子网格的行。对于每一行,您可以使用 O(1)时间中的显式公式确定车轮内的点范围。然后,您只能枚举轮内的点。总时间复杂度为 O(R + A),其中 R 是车轮AABB中子网格中行的nubmer, A 是车轮内的总点数。
C#中的示例实现:
if (Mathf.Abs(Vector3.Dot (hfSampleGlobalPos - wheelPosePos, wheelPoseRot * Vector3.forward)) <= wheelRadius &&
Mathf.Abs(Vector3.Cross(hfSampleGlobalPos - wheelPosePos, wheelPoseRot * Vector3.forward).y) <= wheelHalfWidth)
{
// Do something with the sample under the wheel here
}
答案 1 :(得分:0)
在栅格上填充多边形是计算几何中的标准问题。您可以查找单词“even-odd rule”以开始使用。但是,这里是你所做的大致概述:
此外,对于简单的多边形,这个奇怪的规则会减少到point-in-polygon个问题。