代码之家  ›  专栏  ›  技术社区  ›  Daniel

预测旋转后的变换位置

  •  1
  • Daniel  · 技术社区  · 5 年前

    我有一个游戏对象和一些作为其子对象的对象。

    我要旋转这个游戏对象,但我想预测他的任何孩子是否会碰撞,这样我就可以避免旋转。为此,在实际旋转父对象之前,我需要预测每个子对象的最终位置。

    我按如下方式旋转父对象:

    transform.Rotate(x, y, z, Space.World);
    

    我如何预测这个旋转操作后每个孩子的终点位置?

    2 回复  |  直到 5 年前
        1
  •  3
  •   Daniel    5 年前

    我想我解决了这个问题。我使用了这个函数:

    private Vector3Int RotatePointAroundPivot(Vector3 point, Vector3 pivot, Vector3 angles) {
        returnQuaternion.Euler(angles) * (point - pivot) + pivot;
    }
    

    它显然在世界空间坐标系中围绕另一个点旋转一个点,所以我在 point ,中的父位置 pivot 以及a new Vector3(x, y, z) 在里面 angles 结果似乎是孩子在旋转后的最终位置。

        2
  •  1
  •   rustyBucketBay    5 年前

    我能想到三个选择:

    1.-您可以创建一组与要旋转的对象具有相同层次的空游戏对象。这个 transform.Rotate(x, y, z, Space.World); 应用于这个平行游戏对象将为每个孩子提供位置。这类似于旋转原始游戏对象,但只是处理预测的副本,这似乎不是很有用

    2.-你还有另一个机会,那就是用矩阵变换来计算自己——对层次结构中的所有子级进行旋转变换。可能,但如果没有所有统一功能和层次结构的自动转换的帮助,这将非常困难

    3. Transform.RotateAround 围绕确定的轴旋转一个点确定的角度。对于已确定的子对象,您只需在与要进行预测的子对象相同的世界位置处使用一个空游戏对象,计算旋转轴并围绕枢轴点旋转,即层次世界位置中原始游戏对象的最大父对象。 如果你知道你的轴和角度,或者你正在围绕3轴旋转,就像 转变。旋转(x,y,z,空间。世界); 你可以用以下方式链接3个旋转 Transform.RotateAround 应用围绕z轴的eulerAngles.z度、围绕x轴的euler Angles.x度和围绕y轴的eularAngles.y度的旋转(按此顺序),作为 Transform.Rotate 做。 这样做的目的是手动将空游戏对象旋转到最大父位置,模仿当最大父游戏对象旋转时,层次结构本身会进行的自旋转。

    希望我能被理解