Unity3d 2D Raycast 调用有时会通过 PolygonCollider2D 的点
Unity3d 2D Raycast calls sometime passing through PolygonCollider2D's points
我是Unity新手!
我的 Raycast2D 调用发出的光线有时会穿过我的 PolygonCollider2D 的点,我不知道为什么。
下图中用一条黄色的小水平线标记了命中。
预期行为:
穿过的光线:
这是我的代码:
(path
是 PolygonCollider2D 的红点)
Debug.DrawLine(origin, new Vector3(path[i].x, path[i].y, 0), Color.yellow, 0, false);
float angle = Mathf.Atan2(path[i].y - origin.y, path[i].x - origin.x);
Vector2 direction = new Vector2(Mathf.Cos(angle), Mathf.Sin(angle));
RaycastHit2D hit = Physics2D.Raycast(origin, direction);
Debug.DrawLine(new Vector3(hit.point.x, hit.point.y, 0), new Vector3(hit.point.x - .2f, hit.point.y, 0), Color.yellow);
Debug.DrawRay(new Vector3(origin.x, origin.y, 0), new Vector3(direction.x, direction.y));
是因为四舍五入不好吗?
如果是这样,我该如何解决?
问题源于浮点精度。当涉及浮点数时,您无法进行精确比较。如果您使用的是在世界范围内移动的普通对撞机,这通常没问题,因为人眼无法注意到非常微小的偏移。问题是:
您需要击中多边形角的非常精确的位置吗?
如果没有:
很酷,您的解决方案似乎有效!
如果是:
您必须通过添加 skin 来增加对撞机的大小。这是一种增加对撞机被击中可能性的技术。如果它被命中,您可能需要验证命中点以确定命中是否真的命中。您仍然会 运行 陷入浮动错误,您可能必须配置可接受的错误距离(皮肤宽度)。我希望下面的图片能说明我的观点。
第一张图片是您的光线投射未命中对撞机的示例。
请注意,我的图像中的尺寸已关闭以说明我的观点。
这里我们仍然只使用 1 个对撞机,但我们增加了它的大小。
请记住,浮点运算不可能是精确的。如果你想做精确的数学运算,你需要以某种方式解决这个问题。在这种情况下,解决方案是添加一个 skin。这对你来说可能不是很容易,因为你正在使用多边形碰撞器。
我是Unity新手!
我的 Raycast2D 调用发出的光线有时会穿过我的 PolygonCollider2D 的点,我不知道为什么。
下图中用一条黄色的小水平线标记了命中。
预期行为:
穿过的光线:
这是我的代码:
(path
是 PolygonCollider2D 的红点)
Debug.DrawLine(origin, new Vector3(path[i].x, path[i].y, 0), Color.yellow, 0, false);
float angle = Mathf.Atan2(path[i].y - origin.y, path[i].x - origin.x);
Vector2 direction = new Vector2(Mathf.Cos(angle), Mathf.Sin(angle));
RaycastHit2D hit = Physics2D.Raycast(origin, direction);
Debug.DrawLine(new Vector3(hit.point.x, hit.point.y, 0), new Vector3(hit.point.x - .2f, hit.point.y, 0), Color.yellow);
Debug.DrawRay(new Vector3(origin.x, origin.y, 0), new Vector3(direction.x, direction.y));
是因为四舍五入不好吗?
如果是这样,我该如何解决?
问题源于浮点精度。当涉及浮点数时,您无法进行精确比较。如果您使用的是在世界范围内移动的普通对撞机,这通常没问题,因为人眼无法注意到非常微小的偏移。问题是:
您需要击中多边形角的非常精确的位置吗?
如果没有:
很酷,您的解决方案似乎有效!
如果是:
您必须通过添加 skin 来增加对撞机的大小。这是一种增加对撞机被击中可能性的技术。如果它被命中,您可能需要验证命中点以确定命中是否真的命中。您仍然会 运行 陷入浮动错误,您可能必须配置可接受的错误距离(皮肤宽度)。我希望下面的图片能说明我的观点。
第一张图片是您的光线投射未命中对撞机的示例。
请注意,我的图像中的尺寸已关闭以说明我的观点。
这里我们仍然只使用 1 个对撞机,但我们增加了它的大小。
请记住,浮点运算不可能是精确的。如果你想做精确的数学运算,你需要以某种方式解决这个问题。在这种情况下,解决方案是添加一个 skin。这对你来说可能不是很容易,因为你正在使用多边形碰撞器。