gpt4 book ai didi

transform - Godot/Gdscript 旋转 + 从本地空间到世界空间的转换

转载 作者:行者123 更新时间:2023-12-04 07:20:00 24 4
gpt4 key购买 nike

enter image description here
我有一个刚体节点(3D),我想得到,在全局坐标中 ,“目标”的位置,给定:

  • 角度“旋转”(向上是 Y)
  • 向量 = 5 * Vector.FORWARD

  • 看起来很简单....先平移,然后旋转,或者如果它不起作用,先旋转,然后旋转。
    A to B -> 如果我只应用翻译,它可以工作,没问题:
    target = global_transform.translated(5 * Vector3.FORWARD).origin
    但是如果我想要 B 到 C,它会失败:它看起来像围绕世界原点旋转
    在过去的几个小时里,我尝试了很多东西,并阅读了很多关于 Transform 的文章,现在,我要放弃了。所以……你会怎么做?
    enter image description here

    最佳答案

    我们将通过 XZ 平面上的极坐标(即“旋转”角度和距离,我称之为“d”)定义相对于您的刚体(3D)的位置。
    为了清楚起见,我们将在 RigidBody(3D) 的局部空间中定义它,然后将其移动到全局坐标。
    我们可以做到使用转换 .如果您需要保留旋转,您会怎么做。虽然它需要更多的工作。或者,您可以这样做 仅使用向量 .哪个更容易。
    以下是执行此操作的不同方法。

    使用变换
    局部变换
    我们像这样定义组合旋转和平移变换:

    var t = Transform.IDENTITY.rotated(Vector3.UP, rot).translated(d * Vector3.FORWARD)

    顺便说一下,使用这些方法时顺序无关紧要。结果是这样的:
    var t = Transform.IDENTITY.rotated(Vector3.UP, rot) * Transform.IDENTITY.translated(d * Vector3.FORWARD)
    这给出了在给定距离处围绕原点的旋转。但是,如果您这样做:
    var t = Transform.IDENTITY.translated(d * Vector3.FORWARD) * Transform.IDENTITY.rotated(Vector3.UP, rot)
    你会得到一个向前位移的变换,然后在适当的位置旋转。

    全局变换
    对于全局变换,我们可以使用它应该是相对于 RidigBody(3D) 的事实,我们有它的全局变换:
    var t = Transform.IDENTITY.rotated(Vector3.UP, rot).translated(d * Vector3.FORWARD)
    var global_t = global_transform * t

    请注意,这将应用旋转、缩放等。如果你只想要全局翻译,你可以这样做:
    var t = Transform.IDENTITY.rotated(Vector3.UP, rot).translated(d * Vector3.FORWARD)
    var global_t = Transform.IDENTITY.translated(global_transform.origin) * t
    不, t.translated(global_transform.origin)不是一回事。当您使用 translated它位于您调用它的变换的本地坐标中。

    本地位置
    如您所知,我们可以使用 origin变换的:
    var t = Transform.IDENTITY.rotated(Vector3.UP, rot).translated(d * Vector3.FORWARD)
    var v = t.origin

    全局定位
    您可以使用 to_global :
    var t = Transform.IDENTITY.rotated(Vector3.UP, rot).translated(d * Vector3.FORWARD)
    var v = t.origin
    var global_v = to_global(v)
    或者我们可以带 origin从全局变换:
    var t = Transform.IDENTITY.rotated(Vector3.UP, rot).translated(d * Vector3.FORWARD)
    var global_t = global_transform * t
    var global_v = global_t.origin

    如果你只想要全局翻译,你可以添加 global_transform.origin :
    var t = Transform.IDENTITY.rotated(Vector3.UP, rot).translated(d * Vector3.FORWARD)
    var v = t.origin
    var global_v = global_transform.origin + v

    仅使用向量
    本地位置
    如果您只关心位置,我们可以完全不进行转换:
    var v = (d * Vector3.FORWARD).rotated(Vector3.UP, rot)

    全局定位
    而且,当然,您可以使用 to_global :
    var v = (d * Vector3.FORWARD).rotated(Vector3.UP, rot)
    var global_v = to_global(v)

    再说一次,如果你只想要全局翻译,你可以添加 global_transform.origin :
    var v = (d * Vector3.FORWARD).rotated(Vector3.UP, rot)
    var global_v = global_transform.origing + v

    关于transform - Godot/Gdscript 旋转 + 从本地空间到世界空间的转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68564181/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com