这是我在Unity3D上遇到的一个问题,但它实际上是对一般图形算法的帮助请求。 我有一组形成地图的3D对象/网格。为了概括,我们说它们是6个数字的数组:位置和大小。
我需要创建一个包含所有这些对象的框。盒子必须具有尽可能小的体积。为了概括,我们可以说盒子也将结束为9个数字的数组:位置,大小和旋转。
所以最后我说的是一个函数,它接受一组数组[6]并返回一个数组[9]。
根据需要,盒子可以明显地在3个方向上旋转,所以它不仅仅是“取最小和最大的x,y和z值”。
可能这个问题可以通过一些三角函数轻松解决,但我不知道如何做到这一点!我只能创造一些迭代的东西,但这不是我想要的。
此问题的一个特例可能是找到包含一组点的最小框。可能这个问题更容易,有些可以扩展到主要问题。无论如何......我无法解决这个问题! :)
感谢您的帮助。
答案 0 :(得分:1)
你可以找到所有顶点的三维凸包。使用凸包的点可以形成凸包的面。然后逐个倾斜所有平行于x轴的面。然后沿每个面旋转找到最小x / y / z和最大x / y / z。使用min x / y / z和max x / y / z计算体积。找到与最小音量对应的索引。使用您用于相应面的旋转向后旋转此体积。这个问题类似于最小面积矩形的2d问题。对于最小面积矩形,引用为https://gis.stackexchange.com/questions/22895/how-to-find-the-minimum-area-rectangle-for-given-points
答案 1 :(得分:0)
快速轻松地获取新盒子的左下角和右上角。
或者:
List<GameObjects> gameObjects; // <-- your game objects here
List<Bounds> objectsBounds = gameObjects.Select(item => item.GetComponent<MeshRenderer>().bounds);
Vector3 min = objectsBounds.Min(item => item.min);
Vector3 max = objectsBounds.Max(item => item.max);
或者:
List<GameObjects> gameObjects; // <-- your game objects here
List<Bounds> objectsBounds = gameObjects.Select(item => item.GetComponent<MeshRenderer>().bounds);
Vector3 min = Vector3.one * Single.MaxValue;
Vector3 max = Vector3.one * Single.MinValue;
foreach(Bounds bounds in objectsBounds)
if(bounds.min < min) min = bounds.min;
foreach(Bounds bounds in objectsBounds)
if(bounds.max > max) max = bounds.max;