如何在 Unity3d 的世界空间中获取盒子对撞机的顶点?(具有正确的旋转和比例)。仅仅在对象上做本地世界是行不通的。
obj.transform.localToWorldMatrix.MultiplyPoint3x4(范围);我尝试过为其他角落做类似的事情。
由于您可以轻松获得BoxCollider 的中心和范围,您可以通过从中心添加或减去范围轻松获得局部顶点位置,然后使用Vector3.TransformPoint() 之类的方法将其转换为全局世界空间
以下脚本打印每个 Update() 调用附加到与脚本相同的 GameObject 的 BoxCollider 的每个顶点的全局位置。
using System.Collections;
public class DebugPrintColliderVertices : MonoBehaviour
{
const uint NUM_VERTICES = 8;
private BoxCollider boxCollider;
private Transform[] vertices;
void Awake()
{
boxCollider = (BoxCollider)this.gameObject.GetComponent(typeof(BoxCollider));
if (boxCollider == null)
{
Debug.Log ("Collider not found on " + this.gameObject.name + ". Ending script.");
this.enabled = false;
}
vertices = new Transform[NUM_VERTICES];
}
void Update()
{
Vector3 colliderCentre = boxCollider.center;
Vector3 colliderExtents = boxCollider.extents;
for (int i = 0; i != NUM_VERTICES ; ++i)
{
Vector3 extents = colliderExtents;
extents.Scale (new Vector3((i & 1) == 0 ? 1 : -1, (i & 2) == 0 ? 1 : -1, (i & 4) == 0 ? 1 : -1));
Vector3 vertexPosLocal = colliderCentre + extents;
Vector3 vertexPosGlobal = boxCollider.transform.TransformPoint(vertexPosLocal);
// display vector3 to six decimal places
Debug.Log ("Vertex " + i + " @ " + vertexPosGlobal.ToString("F6"));
}
}
}
请注意,BoxCollider 的大小乘以它所附加的 GameObject 的 transform.scale。我没有在所述脚本中包含该计算,但从这一点来看,找到整体旋转/比例应该是相当微不足道的。