Unity3d のワールド空間でボックス コライダーの頂点を取得するにはどうすればよいですか? (正しい回転とスケールで)。オブジェクトに対して local-world を実行するだけでは機能しません。
obj.transform.localToWorldMatrix.MultiplyPoint3x4(extents); 他のコーナーでも同様のことを試してみました。
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 で乗算されることに注意してください。上記のスクリプトにはその計算を含めていませんが、全体的な回転/スケールを見つけることは、この時点からかなり簡単です。