如何在Unity3d的世界空间中获取盒式对撞机的顶点? (正确的旋转和比例)。只是在对象上做本地世界是行不通的。
obj.transform.localToWorldMatrix.MultiplyPoint3x4(跨越);我尝试过为其他角落做类似的事情。
答案 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。我没有在所述脚本中包含该计算,但从这一点来看,找到整体轮换/比例应该是相当微不足道的。