如何将四元数旋转转换为方向盘运动?

时间:2017-01-29 10:37:46

标签: c# unity3d quaternions

我正在创建一个游戏,你可以使用旋转遥控器(它只知道它的旋转)来驾驶汽车。我将转换Quaternion(这是控制器的输出)转换为方向盘旋转时出现问题。这是我尝试的所有事情中最接近工作形式的事情(transform.localRotation是旋转的方向盘):

void Update() {

    transform.localRotation = GvrController.Orientation;

    transform.localRotation = new Quaternion(0.0f, 0.0f, transform.localRotation.z, transform.localRotation.w);

}

这显然不是一个好的解决方案,效果不是很好。我正在尝试做的事情有一个非常简单的可视化: enter image description here 控制器的默认方向面向前方,如图所示。

基本上整个问题是如何跳过除了负责旋转的轴(图片上的轴1)之外的所有轴并将其应用到方向盘上。你知道我该怎么办?

编辑: 因为如果没有适当的可视化就很难解释这个问题,我会拍摄我的控制器的照片并在它们上画出轴。

这是控制器的默认方向:

enter image description here

这就是它上面标有轴的方式:

enter image description here

1 个答案:

答案 0 :(得分:2)

使用Quaternion.EulerQuaternion.eulerAngles。注意,与Vector3不同,Euler函数的顺序是z,x和y。 EulerAngles以度为单位返回角度(而rotation.x返回该轴的四元数量)。 Euler函数需要一个角度,所以你需要像:

Quaternion rot = GvrController.Orientation;
transform.localRotation = Quaternion.Euler(rot.eulerAngles.z, 0, 0);

根据控制器轴的设置方式,如果它不是y-up z-forward,则可能需要尝试其他方向,例如

transform.localRotation = Quaternion.Euler(rot.eulerAngles.x, 0, 0);

transform.localRotation = Quaternion.Euler(0, 0, rot.eulerAngles.z);

等等。很快就会清楚它使用哪个系统。

另外,如果方向盘不是任何使用旋转而不是localRotation的父级。