jmonkeyengine - 定向边界框

标签 jmonkeyengine

我正在使用 jmonkeyengine 3 并且我已经努力了好几天来实现对移动平面/盒子与其他空间的碰撞检测。最后,我在 collision_and_intersection 教程 (jme hub) 中读到 BoundingBox 不会旋转,而且还不支持 Oriented 边界框。

我搜索了 jme 论坛,但我发现了 JME3 中不存在的 OBB 类的非常旧的帖子。

我该如何解决这个问题,我有哪些选择?

提前致谢,非常感谢任何帮助。

最佳答案

显然,很多人不知道您可以使用轴对齐边界框作为定向边界框。数学计算结果完全相同。唯一的区别是您需要先使用旋转和平移矩阵对角进行变换。下面是一些示例代码:

        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 进行相同的碰撞测试。我目前在我的 Frustum 剔除游戏中使用此功能。所以为了减轻/打破这个神话:是的。 AABB 可以用作 OBB;唯一的区别是点的转换方式。

更新:这是一个直观的例子。两个 crate 。左边的是旋转的,右边的不是。两者都是 AABBS。

enter image description here

关于jmonkeyengine - 定向边界框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27756405/

相关文章:

java - 将 .3ds 模型导入 JMonkeyEngine 3

physics - jMonkeyEngine:BetterCharacterControl 总是弹跳

java - assetManager.loadModel 导致 AssetNotFound 异常

java - 如何在 Gradle 项目中包含 JMonkey 测试数据 jar?

java - 如何刷新jMonkey中的所有输入事件

java - JOGL 和 JMonkeyEngine 的好书和网络资源?

java - 使用 java 的 2D 模拟器的合适平台

java - Jmonkey碰撞检测

java - "Lambda expressions are not supported in -source 7, use -source 8 to enable lambda expressions"