嘿,我搜索了一下,找到了一个功能强大的库,基本上可以直接提供您所需的支持,并且还积极支持Unity类型:
geometry3Sharp
将其实现到Unity项目中就像这样简单:
您可以通过以下方式计算给定一组 Vector3
点的有向边框:
using UnityEngine;
using g3;
public class Example : MonoBehaviour
{
public Transform[] transforms;
private void OnDrawGizmos()
{
var points3d = new Vector3d[transforms.Length];
for (var i = 0; i < transforms.Length; i++)
{
points3d[i] = transforms[i].position;
}
var orientedBoundingBox = new ContOrientedBox3(points3d);
var center = (Vector3)orientedBoundingBox.Box.Center;
var axisX = (Vector3)orientedBoundingBox.Box.AxisX;
var axisY = (Vector3)orientedBoundingBox.Box.AxisY;
var axisZ = (Vector3)orientedBoundingBox.Box.AxisZ;
var extends = (Vector3)orientedBoundingBox.Box.Extent;
var A = center - extends.z * axisZ - extends.x * axisX - axisY * extends.y;
var B = center - extends.z * axisZ + extends.x * axisX - axisY * extends.y;
var C = center - extends.z * axisZ + extends.x * axisX + axisY * extends.y;
var D = center - extends.z * axisZ - extends.x * axisX + axisY * extends.y;
var E = center + extends.z * axisZ - extends.x * axisX - axisY * extends.y;
var F = center + extends.z * axisZ + extends.x * axisX - axisY * extends.y;
var G = center + extends.z * axisZ + extends.x * axisX + axisY * extends.y;
var H = center + extends.z * axisZ - extends.x * axisX + axisY * extends.y;
Gizmos.DrawLine(A, B);
Gizmos.DrawLine(B, C);
Gizmos.DrawLine(C, D);
Gizmos.DrawLine(D, A);
Gizmos.DrawLine(E, F);
Gizmos.DrawLine(F, G);
Gizmos.DrawLine(G, H);
Gizmos.DrawLine(H, E);
Gizmos.DrawLine(A, E);
Gizmos.DrawLine(B, F);
Gizmos.DrawLine(D, H);
Gizmos.DrawLine(C, G);
}
}
![在此输入图片描述](https://istack.dev59.com/lHJ8J.gif)
当然,还有一些类似的东西。
orientedBoundingBox.Box.Contains(Vector3d)
用于确定给定点是否位于该框内。
仅因为Ruzihm问了:
当然,您可以稍微更改上面的脚本,以简单地使用实际的网格顶点:
public MeshFilter[] meshFilters;
private void OnDrawGizmos()
{
var vertices = new List<Vector3>();
foreach (var meshFilter in meshFilters)
{
vertices.AddRange(meshFilter.sharedMesh.vertices.Select(vertex => meshFilter.transform.position + Vector3.Scale(vertex, meshFilter.transform.lossyScale)));
}
var points3d = new Vector3d[vertices.Count];
for (var i = 0; i < vertices.Count; i++)
{
points3d[i] = vertices[i];
}
这看起来基本相同
![在此输入图片描述](https://istack.dev59.com/JgqLb.gif)
Joseph O'Rourke minimal volume algorithm
.. 这里提到了一些替代方案 here。 - derHugo