如何获取Unity中经变换的Plane四角Vector3坐标?
Unity 获取变换后Plane四角的世界坐标
核心思路
Unity中Transform.TransformPoint()方法会自动将本地空间坐标转换为世界空间坐标,同时自动应用物体的移动、旋转、缩放变换,这是最便捷的实现方式。
步骤与代码实现
默认Unity Plane的初始状态是:中心在原点,XZ平面上,尺寸为10×10(中心到各边缘的距离为5)。以下是适配任意变换(移动/旋转/非均匀缩放)的代码:
using UnityEngine; public class PlaneCornerGetter : MonoBehaviour { // 拖拽你的Plane对象到这里 public Transform targetPlane; // 存储四个角的世界坐标 private Vector3[] worldSpaceCorners = new Vector3[4]; void Update() { // 1. 计算本地空间下的四角坐标(已适配缩放) float halfWidth = 5f * targetPlane.localScale.x; float halfLength = 5f * targetPlane.localScale.z; float yPos = 0f * targetPlane.localScale.y; // Plane默认Y轴无厚度,可根据需求调整 Vector3 localTopLeft = new Vector3(-halfWidth, yPos, halfLength); Vector3 localTopRight = new Vector3(halfWidth, yPos, halfLength); Vector3 localBottomRight = new Vector3(halfWidth, yPos, -halfLength); Vector3 localBottomLeft = new Vector3(-halfWidth, yPos, -halfLength); // 2. 转换为世界空间坐标 worldSpaceCorners[0] = targetPlane.TransformPoint(localTopLeft); worldSpaceCorners[1] = targetPlane.TransformPoint(localTopRight); worldSpaceCorners[2] = targetPlane.TransformPoint(localBottomRight); worldSpaceCorners[3] = targetPlane.TransformPoint(localBottomLeft); // 可选:打印结果 if (Input.GetKeyDown(KeyCode.Space)) { for (int i = 0; i < 4; i++) { Debug.Log($"角{i+1}世界坐标:{worldSpaceCorners[i]}"); } } } }
补充说明
- 若使用自定义Mesh的Plane,需先通过
MeshFilter.mesh.vertices获取原始本地顶点,再用Transform.TransformPoint()转换,逻辑一致。 TransformPoint会完整叠加物体的所有变换,无需手动计算旋转矩阵或缩放系数,避免出错。- 可根据需求调整顶点顺序(顺时针/逆时针)或Y轴坐标(若Plane有厚度)。
内容的提问来源于stack exchange,提问作者NKRVVI
相关产品推荐
相关产品推荐

