Unity3D - y 轴上独立于旋转的相对位置?

Unity3D - Relative position on y-axis independent of rotation?

我有一个对象 (A),旁边还有另一个对象 (B)。我正在尝试计算对象 B 的 "height",以便我可以将另一个对象定位在相对于对象 A 位置的那个高度。我知道这听起来像是胡言乱语(我有点累)所以我有放个图来解释一下。

所以在左图中,黄线代表我正在尝试计算的内容。我在圆柱体(灰色)(使用网格数据计算的位置)的表面上有一个位置(橙色),我试图用它来计算物体的半径(黑线)。为此,我需要在对象(灰色)的中心有一个相同高度(红点)的位置,这样我就可以计算从一个到另一个的方向,并使用长度(.magnitude)作为半径。

我的问题是我无法解决问题,如何计算高度(黄线)而不影响旋转。

我目前使用的是 projectOnPlane,但是如果我像第二张图片中那样旋转对象,半径会显着减小,而半径应该是一致的,因为对象没有改变大小。

Vector3 RadDirection = (Vector3.ProjectOnPlane(orangePoint, grey.transform.up) - Vector3.ProjectOnPlane(grey.transform.position, grey.transform.up));
float radius = RadDirection.magnitude;

非常感谢任何帮助,谢谢。

**更新:图中的灰色块是 vector3 位置而不是游戏对象。我尝试进行的半径计算发生在运行时,因此我无法将对象设为灰色并查看检查器。

**更新 2:抱歉,我应该提一下。我正在执行此操作的对象并不总是一个完美的圆柱体,它可能是酒杯之类的东西,我需要计算玻璃杯的半径而不是杯柄。另一个例子可能是一个化学烧杯,它通常逐渐变细到一个点,所以我需要计算橙色点高度处的半径。对不起,我应该把它放在问题中。

这是一个图表来说明我在更新 2 中的意思。橙色点再次充当对象(在本例中为烧杯)网格表面上 Vector3 位置的视觉表示。

**更新 3:我似乎已经解决了这个问题,所以我在下面发布了我的答案,但在撰写本文时我不能接受它(必须等待 2 天)所以不能 close/answer 问题。我要感谢所有做出贡献并试图帮助我解决这个问题的人。希望有一天能帮到大家:)

您可以使用 transform.TransformDirection()transform.InverseTransformDirection()

要获得高度,取减法结果并将 X、Z 坐标设置为零:

Vector3 height = orangeBox.position - greenPoint.position; 
height.x = 0; 
height.z = 0; 

完整的解决方案:

    Vector3 direction = orangeBox.position - greenPoint.position;
    direction = greyBox.transform.InverseTransformDirection(direction);
    direction.x = 0;
    direction.z = 0;
    height = direction.magnitude;
    redPoint.position = greenPoint.position + greyBox.transform.up * height;

我似乎已经使用以下方法解决了我的问题:

public static Vector3 ProjectPointOnLine(Vector3 linePoint, Vector3 lineVec, Vector3 point)
    {
        //get vector from point on line to point in space
        Vector3 linePointToPoint = point - linePoint;

        float t = Vector3.Dot(linePointToPoint, lineVec);

        return linePoint + lineVec * t;
    }

我在这里找到了这个,它还有很多其他看起来很有用的功能: http://wiki.unity3d.com/index.php/3d_Math_functions

我基本上把烧杯的原点(绿点)作为"linePoint",烧杯的向上方向"lineVec"和beaker.transform.up,最后我通过世界烧杯网格表面上的 vector3 点(橙色点)它 returns 回到烧杯中间的一个点,与我的橙色点的高度相同。然后我只用一个减去另一个并将大小作为半径。计算出的半径值是正确的,因为它是我期望的值,并且仅在旋转期间在小数点后第六位之后发生变化,这提供了足够的准确性,因为我只需要小数点后三位或四位。

如果其他人需要帮助,我很乐意提供更多详细信息或帮助。