首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我怎么能只扭转一个四元数的一个轴?

我怎么能只扭转一个四元数的一个轴?
EN

Stack Overflow用户
提问于 2019-07-15 11:37:14
回答 1查看 3.6K关注 0票数 1

我在Unity3D中创建了两个对象,表示一个上臂(父对象)和一个低臂(子对象),并与一个字符连接连接在一起。这些物体的旋转是由两个四元数驱动的,我从位于上臂和下臂的IMU中收集到。我校准了两个四元数。我的目标是想象肘关节的屈曲/伸展。

Q在名称中表示它是四元数。QImu表示它是来自IMU的四元数。Qstart表示它是IMU的初始启动方向。

代码语言:javascript
复制
// upperarm script attached to upperarm object
if (Input.GetKeyDown(KeyCode.Space))
        {
            QstartUpperArm = QimuUpperArm;
        }

        transform.localRotation = QstartUpperArm * Quaternion.Inverse(QimuUpperArm);
代码语言:javascript
复制
// lowerarm script attached to lowerarm object
if (Input.GetKeyDown(KeyCode.Space))
        {
            QstartLowerArm = QimuLowerArm;
        }

        QimuLowerArm = QstartLowerArm * Quaternion.Inverse(QimuLowerArm);
transform.localrotation = Quaternion.Inverse(Qstart2 * Quaternion.Inverse(Qimu2)) * Qimu1new;

Upperarm对象正像预期的那样旋转。然而,低臂对象有一个y轴相反的对象.所有其他轴都很好。如何使用四元数改变这一个轴的符号?

EN

回答 1

Stack Overflow用户

发布于 2019-07-15 12:47:25

您不应该在Quaternion中直接这样做。听起来你把Quaternion (它有4个组件x,y,z,w)和x,y,z中的欧拉空间表示搞混了。

你可以试着用

代码语言:javascript
复制
var invertedRotation = Quaternion.Euler(Vector3.Scale(QimuLowerArm.eulerAngles, Vector3.up * -1));

取决于必须反转的旋转(在代码中没有清楚地看到这一点)。

  • eulerAngles返回Quaternion的欧拉表示
  • Vector3.Scale乘成Vector3组件。在这种情况下,由Vector3.up * -1 == new Vector3(0, -1, 0);
  • Quaternion.Euler为给定欧拉角上的旋转生成一个Quaternion。这里必须注意的是,旋转是按x顺序应用的,然后是z,然后是y,但是由于是反转的,后者应该是可以的。

另一个afaik (不太确定)是

  • 否定相应的轴分量
  • 否定w组件

我仍然不会直接在四元数中做这件事,因为订单很重要,但也很重要。

代码语言:javascript
复制
var invertedRotation = new Quaternion (QimuLowerArm.x, - QimuLowerArm.y, QimuLowerArm.z, -QimuLowerArm.w);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57038900

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档