使用四元数的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相对偏移对象旋转的主要内容,如果未能解决你的问题,请参考以下文章