1

如何在 Unity3d 的世界空间中获取盒子对撞机的顶点?(具有正确的旋转和比例)。仅仅在对象上做本地世界是行不通的。

obj.transform.localToWorldMatrix.MultiplyPoint3x4(范围);我尝试过为其他角落做类似的事情。

4

1 回答 1

3

由于您可以轻松获得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。我没有在所述脚本中包含该计算,但从这一点来看,找到整体旋转/比例应该是相当微不足道的。

于 2012-07-22T12:36:33.110 回答