如何知道世界点是否在由位置(Vector3)、比例(Vector3)和旋转(四元数)给出的盒子内?

问题描述 投票:0回答:1

我有一个对象,它的 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);
    }
}

但它给了我错误的结果。

我怎样才能做这个测试?

unity3d
1个回答
0
投票

真丢脸!经过一些尝试和错误,试图了解为什么当盒子处于默认位置时结果有效,但在移动和旋转时却不起作用,事实证明一切正常,但我针对对象的世界位置和比例测试了该点(奖励:我忽略了它的旋转)。

好像是行:

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);

这样它会准确地给出我想要的信息。

© www.soinside.com 2019 - 2024. All rights reserved.