Unity3d Box Collider Vertex

时间:2012-07-20 13:26:51

标签: transform local unity3d

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

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

1 个答案:

答案 0 :(得分:3)

由于您可以轻松获得BoxCollider's centre and extents,因此可以通过从中心添加或减去范围轻松获取本地顶点位置,然后使用Vector3.TransformPoint()等方法将其转换为全局世界空间p>

以下脚本打印每个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。我没有在所述脚本中包含该计算,但从这一点来看,找到整体轮换/比例应该是相当微不足道的。