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

5

我正在制作一个游戏,你需要使用旋转遥控器(它只知道自己的旋转)来驾驶汽车。我遇到了一个问题,就是将四元数(这是控制器的输出)转换为方向盘的旋转角度。以下是我尝试过的所有方法中最接近有效的代码(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

如果您提供一些输入和期望的输出,可能会更好地理解控制器给出的旋转。 - FINDarkside
这些确实很难调试。我建议记录测试运行,包括大致已知的期望输出角度,然后您可以在任何编程环境中(如Matlab或Python Spyder)“逆向工程”正确的公式,然后将其移植到所需的语言/框架中。 - NikoNyrh
请问您能否提供一段欧拉转换的录音? - Antoine Eskaros
1个回答

2
使用 Quaternion.EulerQuaternion.eulerAngles。请注意,欧拉函数的顺序是 z、x、y,与 Vector3 不同。EulerAngles 返回一个角度值(而 rotation.x 则返回该轴上的四元数值)。欧拉函数需要一个角度值,因此您需要类似以下的内容:
Quaternion rot = GvrController.Orientation;
transform.localRotation = Quaternion.Euler(rot.eulerAngles.z, 0, 0);

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

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

或者

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

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

此外,如果方向盘没有与任何物体相关联,请使用旋转而不是局部旋转。


1
我本来想使用控制器的方向。帖子已更新。如果Z轴不正确,请尝试其他轴。 - Absinthe
仍然不起作用。它给出非常不一致的结果 - 方向盘改变旋转方向或在我没有改变控制器旋转方向的情况下停止。我尝试了所有轴,但似乎没有任何一个与我想要方向盘围绕其旋转的轴相对应。 - Wojtek Wencel
我注意到的是,即使只有其中一个轴在运动,所有轴都会产生旋转 - 当我将其他轴设置为0时,它开始表现出奇怪的行为。另一件事是,当控制器被旋转时,比如说在X轴上倾斜它,在Y轴上倾斜不会像在绕X轴旋转之前那样做相同的事情。 - Wojtek Wencel
1
听起来控制器可能会提供连续的反馈,而不仅仅是说“我现在处于这个角度!”。在Update中调试它的旋转-即使控制器静止,它是否仍在不断变化?另外,当您只在Update中执行transform.localRotation = GvrController.Orientation时会发生什么? - Absinthe
如果控制器没有移动,那么它的旋转是稳定的,当简单地使用transform.localRotation = GvrController.Orientation;时,它就像控制器一样旋转。当从默认位置旋转时,轴似乎都没问题,但是当将向左旋转的位置用作参考时,轴似乎不像我在最后一张图片上画的那样。 - Wojtek Wencel
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接