You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

获取PolygonCollider2D点世界空间位置时出现偏差的问题

问题原因与解决方案

你当前的错误在于局部坐标转世界空间的方式完全不对:PolygonCollider2D的points是相对于碰撞体所属Transform的局部坐标,需要考虑物体的位移、旋转、缩放,而你用bounds.center或者直接加transform.position的方式,都没正确处理这些变换。

正确的转换方式

直接使用Transform的TransformPoint方法,它会自动处理所有变换参数(位移、旋转、缩放),得到准确的世界空间坐标:

Vector2 p1 = polygon.transform.TransformPoint(polygon.points[i]);

修正后的完整调试脚本

List<Vector2> debugPositions = new();

public void OnSceneGUI()
{
    for (int i = 0; i < debugPositions.Count; i++)
        Handles.DrawSolidRectangleWithOutline(new Rect(debugPositions[i].x, debugPositions[i].y, 0.2f, 0.2f), Color.cyan, Color.black);
}

void GetPolygonPointsWorldPos(PolygonCollider2D polygon)
{
    debugPositions.Clear();
    for (int i = 0; i < polygon.points.Length; i++)
    {
        // 正确转换局部点到世界空间
        Vector2 p1 = polygon.transform.TransformPoint(polygon.points[i]);
        Vector2 p2 = polygon.transform.TransformPoint(polygon.points[(i + 1) % polygon.points.Length]);
        debugPositions.Add(p1);
        debugPositions.Add(p2);
    }
}

为什么之前的方法会出错

  1. bounds.center不是转换基准:bounds.center是多边形所有点包围盒的世界空间中心,和Transform的原点(物体的position)完全是两个概念。当多边形不对称、物体有缩放时,这个中心会和Transform原点偏移,直接加局部点自然会错位,而且碰撞体越大(缩放越大),偏移越明显。
  2. 直接加transform.position忽略了旋转和缩放:polygon.points是局部坐标,当物体有旋转或非等比缩放时,局部坐标不能直接和世界空间的position相加,必须通过TransformPoint完成坐标空间的转换。

内容的提问来源于stack exchange,提问作者sandsalamand

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 22:46:22