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

Woj*_*cel 5 c# quaternions unity-game-engine

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

void Update() {

    transform.localRotation = GvrController.Orientation;

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

}
Run Code Online (Sandbox Code Playgroud)

这显然不是一个好的解决方案,效果不是很好.我正在尝试做的事情有一个非常简单的可视化: 在此输入图像描述 控制器的默认方向面向前方,如图所示.

基本上整个问题是如何跳过除负责旋转的轴(图片上的轴1)以外的所有轴并将其应用到方向盘上.你知道我怎么能这样做吗?

编辑:因为没有适当的可视化很难解释问题我拍了我的控制器的照片并在它们上画了轴.

这是控制器的默认方向:

在此输入图像描述

这就是用它标记轴的方式:

在此输入图像描述

Abs*_*the 2

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

Quaternion rot = GvrController.Orientation;
transform.localRotation = Quaternion.Euler(rot.eulerAngles.z, 0, 0);
Run Code Online (Sandbox Code Playgroud)

根据控制器轴的设置方式,如果不是 y 向上 z 向前,您可能需要尝试其他方向,例如

transform.localRotation = Quaternion.Euler(rot.eulerAngles.x, 0, 0);
Run Code Online (Sandbox Code Playgroud)

或者

transform.localRotation = Quaternion.Euler(0, 0, rot.eulerAngles.z);
Run Code Online (Sandbox Code Playgroud)

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

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