【问题标题】:How to convert quaternion rotation to steering wheel motion?如何将四元数旋转转换为方向盘运动?
【发布时间】:2017-01-29 10:37:46
【问题描述】:

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

void Update() {

    transform.localRotation = GvrController.Orientation;

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

}

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

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

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

这是控制器的默认方向:

这就是它在轴上标记的方式:

【问题讨论】:

  • 如果您提供一些输入和预期输出以更好地了解控制器为您提供的旋转,这可能会有所帮助。
  • 是的,这些调试起来很麻烦。我建议以近似已知的预期输出角度记录测试运行,然后您可以在任何编程环境(如 Matlab 或 Python Spyder)中“逆向工程”正确的公式,然后将其移植到所需的语言/框架。
  • 能否给我们一段欧拉转换的录音?

标签: c# unity3d quaternions


【解决方案1】:

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

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。

【讨论】:

  • 我遇到了和以前一样的问题:它不仅响应控制器像方向盘一样旋转,而且还响应向前和向后旋转。
  • 我的意思是使用控制器方向。帖子更新了。如果 z 轴错误,请尝试其他轴。
  • 还是不行。它给出了非常不一致的结果 - 方向盘改变旋转方向或停止,而我没有改变控制器的旋转方向。我尝试了所有轴,它们中的任何一个似乎都对应于我希望方向盘旋转的轴。
  • 我注意到的是,所有轴即使在其中一个轴上也会产生旋转 - 当我将其他轴设置为 0 时,它开始表现得很奇怪。另一件事是,当控制器旋转时,假设在 X 轴上倾斜它在 Y 轴上不会做与围绕 X 轴旋转之前相同的事情。
  • 听起来控制器可能会持续提供信息,而不仅仅是说“我现在处于这个角度!”。 Debug.Log 它在更新中的旋转 - 即使控制器静止,它是否也在不断变化?另外,当您执行 transform.localRotation = GvrController.Orientation; 时会发生什么自己在更新中?
猜你喜欢
  • 2013-03-30
  • 2010-12-06
  • 2022-10-16
  • 2014-03-12
  • 2022-08-17
  • 2011-10-08
  • 1970-01-01
  • 1970-01-01
  • 2012-06-11
相关资源
最近更新 更多