我有一个对象,它的 Transform 的位置、旋转和缩放表示一个盒子/立方体的位置、旋转和缩放。
我想知道
Vector3
给出的世界点是否在这个盒子表示内。
我可以通过附加一个具有默认比例的立方体作为它的子项,或者使用以下 gizmo 来判断这个虚拟框在哪里:
private void OnDrawGizmos()
{
Gizmos.color = Color.blue;
Gizmos.matrix = Matrix4x4.TRS(transform.position, transform.rotation, transform.localScale);
Gizmos.DrawWireCube(Vector3.zero, Vector3.one);
}
我想说如果一个世界位置(例如:
new Vector3(0.98f, 3.2f, 1.26f)
在gizmo将绘制的区域内部或外部。
BoxCollider.ClosestPoint
,但在我的场景中,我将在运行时创建大量 GameObject 来表示“labirynth”地图,并且它们不应该有碰撞器,因为地图中没有物理意义,它可能会干扰游戏的其他部分.thatObjectWithGizmo.InverseTransformPoint(myWorldPoint)
期望它会从世界转换为本地,并以这种方式进行测试:public class ScriptToTestPoint : MonoBehaviour
{
public Transform thatObjectWithGizmo;
public Vector3 myWorldPoint;
public void OnDrawGizmos()
{
Vector3 resultingPosition = thatObjectWithGizmo.InverseTransformPoint(myWorldPoint);
bool isInside = new Bounds(thatObjectWithGizmo.position, thatObjectWithGizmo.lossyScale).Contains(resultingPosition);
Gizmos.color = isInside ? Color.red : Color.white;
Gizmos.DrawSphere(transform.position, 1f);
}
}
但它给了我错误的结果。
我怎样才能做这个测试?
真丢脸!经过一些尝试和错误,试图了解为什么当盒子处于默认位置时结果有效,但在移动和旋转时却不起作用,事实证明一切正常,但我针对对象的世界位置和比例测试了该点(奖励:我忽略了它的旋转)。
好像是行:
Vector3 resultingPosition = thatObjectWithGizmo.InverseTransformPoint(myWorldPoint);
正确地将世界点转换为本地点,但我误解了我应该如何通过对世界位置进行测试来检查它:
// Wrong
bool isInside = new Bounds(thatObjectWithGizmo.position, thatObjectWithGizmo.lossyScale).Contains(resultingPosition);
修复很简单,我需要针对本地边界进行测试:
// Correct
bool isInside = new Bounds(Vector3.zero, Vector3.one).Contains(resultingPosition);
这样它会准确地给出我想要的信息。