1

Unity3d のワールド空間でボックス コライダーの頂点を取得するにはどうすればよいですか? (正しい回転とスケールで)。オブジェクトに対して local-world を実行するだけでは機能しません。

obj.transform.localToWorldMatrix.MultiplyPoint3x4(extents); 他のコーナーでも同様のことを試してみました。

4

1 に答える 1

3

BoxCollider の中心範囲を簡単に取得できるため、中心から範囲を加算または減算することでローカルの頂点位置を簡単に取得できます。その後、 Vector3.TransformPoint()などのメソッドを使用してグローバル ワールド空間に変換します。

次のスクリプトは、Update() 呼び出しごとに、スクリプトと同じゲームオブジェクトにアタッチされた 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 のサイズは、アタッチされているゲームオブジェクトの transform.scale で乗算されることに注意してください。上記のスクリプトにはその計算を含めていませんが、全体的な回転/スケールを見つけることは、この時点からかなり簡単です。

于 2012-07-22T12:36:33.110 に答える