【问题标题】:Predict transform position after rotation预测旋转后的变换位置
【发布时间】:2021-01-31 18:01:15
【问题描述】:

我有一个 GameObject 和一些是它的子对象。

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

我正在像这样旋转父级:

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

如何预测旋转操作后每个孩子的结束位置?

【问题讨论】:

  • 虽然位置可能不够“碰撞”;)
  • 无法解决问题。如果你旋转物体和孩子,他们不会比以前更多地发生碰撞。
  • 与其他事物碰撞,而不是它们之间。

标签: unity3d geometry transform


【解决方案1】:

我想我解决了这个问题。我使用了这个功能:

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

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

【讨论】:

    【解决方案2】:

    我能想到 3 个选项:

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

    2.- 您还有一个机会是使用矩阵变换计算自己,旋转变换到层次结构中的所有子级。可能,但如果没有所有统一函数和沿层次结构的自动转换的帮助,这将非常困难

    3.- Transform.RotateAround 围绕一个确定的轴旋转一个点确定的角度。对于您确定的孩子,您可以在与您想要进行预测的孩子游戏对象相同的世界位置使用一个空游戏对象,计算您的旋转轴并围绕枢轴点旋转,即原始游戏对象在层次结构世界中的最大父级位置。 如果您知道轴和角度,或者如果您像 transform.Rotate(x, y, z, Space.World); 一样围绕 3 轴旋转,您可以立即执行此操作,您可以使用 Transform.RotateAround 将 eulerAngles.z 度围绕 z 的旋转链接 3 个旋转-axis,eulerAngles.x 围绕 x 轴的度数,以及 eulerAngles.y 围绕 y 轴的度数(按此顺序),就像 Transform.Rotate 所做的那样。 这样做的目的是手动将空游戏对象旋转到最大父位置,模仿当最大父游戏对象旋转时层次结构本身的自动旋转所做的事情。

    希望我能理解自己

    【讨论】:

    • 我尽量避免创造新的东西,所以我选择了第二个选项。
    • 我认为计算起来要困难得多。干得好
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-23
    • 1970-01-01
    • 1970-01-01
    • 2013-09-05
    • 1970-01-01
    相关资源
    最近更新 更多