【问题标题】:Unity3D - Relative position on y-axis independent of rotation?Unity3D - y轴上的相对位置与旋转无关?
【发布时间】:2018-09-21 13:48:08
【问题描述】:

我有一个对象 (A),旁边有另一个对象 (B)。我正在尝试计算对象 B 的“高度”,以便我可以将另一个对象定位在相对于对象 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 天),因此无法关闭/回答问题.我要感谢所有做出贡献并试图帮助我解决这个问题的人。希望有一天能帮到大家:)

【问题讨论】:

  • 图表很好,但没有代码我们看不出有什么问题。虽然这听起来对我来说,如果你只是得到一条直线的测量值,你应该使用从中心向外的射线。我假设正在谈论3d?不是二维的?
  • @Vanethrane 我已经添加了我当前使用的受旋转影响的代码
  • b 的子a
  • @Vanethrane no B 只是对象 A 网格表面上的 vector3 位置。我使用顶点数据和 KdTree 计算它。
  • transform.localscale.z/2 将更有效地为您提供半径...给我第二个我快速将一些东西放在一起

标签: unity3d rotation trigonometry


【解决方案1】:

您可以使用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;

【讨论】:

  • 如果他改变了变换方向,它会改变他的方法和transform.up的方向
  • 他可以使用transform.TransformDirection()来计算方向而不改变gameObject的变换。
  • 为了执行您在代码 sn-p 中输入的内容,我需要高度。高度是我要计算的
  • 要获得高度,取减法的结果并将 X、Z 坐标设置为零:Vector3 heading = orangePoint.position - greenPoint.position;标题.x = 0;标题.z = 0;高度 = 航向.幅度
  • 旋转时位置变化不起作用。
【解决方案2】:

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

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 点烧杯网格(橙色点)它返回烧杯中间的一个点,与我的橙色点高度相同。然后我只是从另一个中减去一个并将大小作为半径。计算的半径值是正确的,这就是我所期望的值,并且仅在旋转过程中小数点后六位后发生变化,这提供了足够的准确性,因为我只需要三位或四位小数。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-22
    • 2018-06-09
    • 1970-01-01
    • 1970-01-01
    • 2021-09-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多