我正在尝试检查一个对象当前是否在 directx 的屏幕上。我有对象和相机的视图矩阵和投影矩阵以及 xyz。
这似乎是人们遇到的一个常见问题,但我尝试在谷歌上寻找所有内容,但找不到任何人在 directx 中只谈论 javascript 的东西。
我不确定从哪里开始处理这个问题。我猜它使用了某种复杂的数学运算,涉及视图矩阵和立方体的位置(对象被转换到 gpu 上的世界空间,没有缩放或旋转)。(我也在使用 C++)有人可以帮忙吗?谢谢
我正在尝试检查一个对象当前是否在 directx 的屏幕上。我有对象和相机的视图矩阵和投影矩阵以及 xyz。
这似乎是人们遇到的一个常见问题,但我尝试在谷歌上寻找所有内容,但找不到任何人在 directx 中只谈论 javascript 的东西。
我不确定从哪里开始处理这个问题。我猜它使用了某种复杂的数学运算,涉及视图矩阵和立方体的位置(对象被转换到 gpu 上的世界空间,没有缩放或旋转)。(我也在使用 C++)有人可以帮忙吗?谢谢
对于透视投影,这是一个“平截头体”与“盒子”边界体积相交测试。
对于正交投影,这是一个“盒子”与“盒子”边界体积相交测试。
DirectXMath库(它也在Windows SDK 中)包括在标头中执行这些测试的函数DirectXCollision.h
。BoundingFrustum
使用相机中的投影矩阵创建对象实例:
BoundingFrustum fr(proj);
// use fr(proj, true) if using right-handed instead of left-handed view setup
为您的对象的位置创建一个BoundingBox
或:BoundingOrientedBox
BoundingBox box(position, extents);
然后用fr.Contains(box)
看它是否返回DISJOINT
。
此类计算的参考资料包括:
Akenine-Möller、Haines 和 Hoffman,“实时渲染”,AK Peters/CRC Press(2018 年)
Ericson,“实时碰撞检测”,Morgan Kaufmann (2005)
Glassner,“光线追踪简介”,Morgan Kaufmann (1989)
Schneider 和 Eberly,“计算机图形学的几何工具”,Morgan Kaufmann (2003)