我正在使用jmonkeyengine 3而且我一直在努力实现与其他空间的移动平面/盒子的碰撞检测。最后,我在collision_and_intersection教程(jme hub)中读到了BoundingBox没有旋转,并且还不支持Oriented bounding box。
我搜索了jme论坛,但我发现了在JME3中不存在的OBB类非常老的帖子。
我如何解决这个问题,我的选择是什么?
在此先感谢,非常感谢任何帮助。
答案 0 :(得分:2)
许多人显然不知道您可以将“轴对齐的边界框”用作“定向边界框”。数学计算出完全相同的结果。唯一的区别是您需要首先使用旋转和平移矩阵来变换角。这是一些示例代码:
public static BoundingBox CreateOrientedBoundingBox(Vector3 min, Vector3 max, Matrix transform)
{
Vector3[] corners = new Vector3[]
{
Vector3.TransformCoordinate(new Vector3(min.X, max.Y, max.Z), transform),
Vector3.TransformCoordinate(new Vector3(max.X, max.Y, max.Z), transform),
Vector3.TransformCoordinate(new Vector3(max.X, min.Y, max.Z), transform),
Vector3.TransformCoordinate(new Vector3(min.X, min.Y, max.Z), transform),
Vector3.TransformCoordinate(new Vector3(min.X, max.Y, min.Z), transform),
Vector3.TransformCoordinate(new Vector3(max.X, max.Y, min.Z), transform),
Vector3.TransformCoordinate(new Vector3(max.X, min.Y, min.Z), transform),
Vector3.TransformCoordinate(new Vector3(min.X, min.Y, min.Z), transform)
};
return BoundingBox.FromPoints(corners);
}
其中的转换矩阵定义为:
Matrix transform = VoidwalkerMath.CreateRotationMatrix(this.Rotation) * Matrix.Translation(this.Location);
此外,为了清楚起见,我创建了一个旋转矩阵,如下所示:
/// <summary>
/// Converts degrees to radians.
/// </summary>
/// <param name="degrees">The angle in degrees.</param>
public static float ToRadians(float degrees)
{
return degrees / 360.0f * TwoPi;
}
/// <summary>
/// Creates a rotation matrix using degrees.
/// </summary>
/// <param name="xDegrees"></param>
/// <param name="yDegrees"></param>
/// <param name="zDegrees"></param>
/// <returns></returns>
public static Matrix CreateRotationMatrix(float xDegrees, float yDegrees, float zDegrees)
{
return
Matrix.RotationX(ToRadians(xDegrees)) *
Matrix.RotationY(ToRadians(yDegrees)) *
Matrix.RotationZ(ToRadians(zDegrees));
}
然后,将其与传统AABB进行相同的碰撞测试。我目前在我的游戏中进行了“平截锥体”剔除的工作。因此,要缓解/消除这个神话:是的。 AABB可以用作OBB;唯一的区别是如何变换点。
更新:这是一个直观的示例。两个板条箱。左一个旋转,右一个不旋转。两者都是AABBS。
答案 1 :(得分:0)
为什么不使用普通的Box网格? BoundingBox是面向轴的,因此它实际上无法旋转。您可以在课程文档中查看: http://hub.jmonkeyengine.org/javadoc/com/jme3/bounding/BoundingBox.html
BoundingBox定义了一个轴对齐的立方体,该立方体为特定几何体的一组顶点定义了一个容器。
您应该使用Box网格使其正常工作。如果有某些理由特别使用BoundingBox - 请告诉我们 - 可能会有一些不同的解决方案。