使用四元数的Unity3D相对偏移对象旋转

Posted

技术标签:

【中文标题】使用四元数的Unity3D相对偏移对象旋转【英文标题】:Unity3D relative offset object rotation using quaternions 【发布时间】:2018-05-19 19:56:50 【问题描述】:

我不知道如何在 Unity3D 中解决这个问题。

示例:用户 a) 对对象执行 90 度顺时针操作 -> 对象 b) 应自动调整其方向,即也执行 90 度顺时针旋转相对于其当前方向。因此,这两个对象具有不同的最终方向。我必须使用四元数。

示例:

我尝试了以下方法:

float step = speed * Time.deltaTime;

transform.rotation = Quaternion.RotateTowards(transform.rotation, quatObjectA, Time.time * speed);

transform.rotation = Quaternion.Slerp(ransform.rotation, quatObjectA, Time.time * speed);

-> 对象 a) 和 b) 具有相同的终端方向,而不是我想要的(对于这两种方法)

transform.rotation = transform.rotation*quatObjectA;

-> 导致一些奇怪和错误的滞后运动

我想计算对象 a) 的当前方向和目标方向之间的差异,并针对对象 b) 的当前方向应用相同的旋转。


已解决

我想通了。这其实很明显。

    Quaternion relativeB = Quaternion.Inverse(ObjectBOld) * ObjectBNew;
    transform.rotation = transform.rotation*relativeB;

【问题讨论】:

【参考方案1】:

你想要这样的东西:

ObjectB.transform.position = ObjectA.transform.right * someOffsetX
  + ObjectA.transform.up* someOffsetY
  + ObjectA.transform.forward * someOffsetZ;

或者让 B 成为 A 的孩子。

【讨论】:

谢谢 Draco18s。但是,我不想改变对象的位置。我只谈改变方向。孩子也不适合我,因为对象 a) 不应该一直跟随对象 a) -> 它是由事件触发的。 这很难从你的帖子中得到,但看起来你已经明白了。【参考方案2】:

对于任何试图在任何给定轴上设置静态偏移的人,例如 z 轴上的 -90°:

transform.rotation *= Quaternion.Euler(0, 0, -90);

【讨论】:

以上是关于使用四元数的Unity3D相对偏移对象旋转的主要内容,如果未能解决你的问题,请参考以下文章

四元数运动学笔记旋转的雅克比矩阵

Unity3D 四元数的理解

四元数quaternion

Unity3D 控制物体旋转详解 —— 自身绕轴旋转缓慢旋转鼠标控制旋转欧拉数和四元数的关系

四元数法

如何在不使用 transform.Rotate 的情况下在其本地或世界轴上旋转带有第二个四元数的四元数?