我在Unity3D中创建了两个对象,表示一个上臂(父对象)和一个低臂(子对象),并与一个字符连接连接在一起。这些物体的旋转是由两个四元数驱动的,我从位于上臂和下臂的IMU中收集到。我校准了两个四元数。我的目标是想象肘关节的屈曲/伸展。
Q在名称中表示它是四元数。QImu表示它是来自IMU的四元数。Qstart表示它是IMU的初始启动方向。
// upperarm script attached to upperarm object
if (Input.GetKeyDown(KeyCode.Space))
{
QstartUpperArm = QimuUpperArm;
}
transform.localRotation = QstartUpperArm * Quaternion.Inverse(QimuUpperArm);// 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轴相反的对象.所有其他轴都很好。如何使用四元数改变这一个轴的符号?
发布于 2019-07-15 12:47:25
您不应该在Quaternion中直接这样做。听起来你把Quaternion (它有4个组件x,y,z,w)和x,y,z中的欧拉空间表示搞混了。
你可以试着用
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组件我仍然不会直接在四元数中做这件事,因为订单很重要,但也很重要。
var invertedRotation = new Quaternion (QimuLowerArm.x, - QimuLowerArm.y, QimuLowerArm.z, -QimuLowerArm.w);https://stackoverflow.com/questions/57038900
复制相似问题