12

我需要计算 3D 对象面对任意 3D 点的 2 个角度(偏航和俯仰)。这些旋转被称为“欧拉”旋转,仅仅是因为在第一次旋转之后(假设 Z,基于下图),Y 轴也随着对象旋转。

这是我正在使用的代码,但它不能完全工作。在地平面 (Y = 0) 上,对象正确旋转以面对该点,但是一旦我在 Y 中向上移动该点,旋转看起来不正确。

// x, y, z represent a fractional value between -[1] and [1]
// a "unit vector" of the point I need to rotate towards

yaw = Math.atan2( y, x )
pitch = Math.atan2( z, Math.sqrt( x * x + y * y ) )

你知道如何计算给定一个点的 2 个欧拉角吗?


下图显示了我旋转的方式。这些是我需要计算的角度。(唯一的区别是我按 X、Y、Z 的顺序旋转对象,而不是 Z、Y、X)

图片

在此处输入图像描述


这是我的系统。

  • 坐标系是 x = 向右,y = 向下,z = 更靠后
  • 默认情况下,对象位于 (0,0,1),它面向后
  • 旋转的顺序是 X、Y、Z,其中在 X 上的旋转是俯仰,Y 是偏航,Z 是滚动

我的系统

4

4 回答 4

15

以下是我的工作假设:

  • 坐标系 (x,y,z) 使得正 x 向右,正 y 向下,z 是剩余方向。特别地,y=0 是地平面。
  • (0,0,0) 处当前面向 (0,0,1) 的对象正在转向面向 (x,y,z)。
  • 为了实现这一点,将围绕 x 轴旋转,然后围绕 y 轴旋转。最后,围绕 z 轴旋转以使物体直立。

(术语 yaw、pitch 和 roll 可能会造成混淆,所以我想避免使用它,但大致对应的是 x=pitch,y=yaw,z=roll。)

鉴于此设置,这是我尝试解决您的问题:

rotx = Math.atan2( y, z )
roty = Math.atan2( x * Math.cos(rotx), z )
rotz = Math.atan2( Math.cos(rotx), Math.sin(rotx) * Math.sin(roty) )

希望这是正确的迹象。我认为修复标志最简单的方法是反复试验。实际上,您似乎已经得到了标志rotx并且roty正确了——包括一个关于 z 的微妙问题——所以你只需要修复标志rotz

我希望这是不平凡的(可能取决于你所在的八分圆),但在说它是错误的之前请尝试一些可能性。祝你好运!


这是最终对我有用的代码。

我注意到当物体从任何前象限(正 Z)移动到任何后象限时会发生“翻转”效应。在前象限中,对象的前部将始终面向该点。在后象限中,对象的后部始终面向该点。

此代码更正了翻转效果,使对象的前部始终面向该点。我通过反复试验遇到它,所以我真的不知道发生了什么!

 rotx = Math.atan2( y, z );
 if (z >= 0) {
    roty = -Math.atan2( x * Math.cos(rotx), z );
 }else{
    roty = Math.atan2( x * Math.cos(rotx), -z );
 }
于 2010-10-26T08:30:23.277 回答
7

Rich Seller 的回答向您展示了如何将一个点从一个 3-D 坐标系旋转到另一个系统,给定一组描述两个坐标系之间旋转的欧拉角。

但听起来你要求的是不同的东西:

你有: 单点的 3-D 坐标

你想要:一组欧拉角

如果这就是你所要求的,那么你没有足够的信息。要找到欧拉角,您需要两个坐标系中至少两个点的坐标,以确定从一个坐标系到另一个坐标系的旋转。

您还应该知道欧拉角可能不明确:Rich 的回答假设旋转应用于 Z,然后是 X',然后是 Z',但这不是标准化的。如果您必须使用欧拉角与其他代码进行互操作,则需要确保使用相同的约定。

您可能需要考虑使用旋转矩阵或四元数而不是欧拉角。

于 2009-08-09T23:15:50.563 回答
3

这一系列的轮换将为您提供您所要求的:

  1. 关于 X: 0
  2. 关于Y:atan2(z, x)
  3. 关于Z:atan2(y, sqrt(x*x + z*z))

除非您首先定义如何使用这些术语,否则我无法告诉您这些术语是什么“滚动”、“俯仰”和“偏航”。您没有以标准方式使用它们。

编辑:
好的,然后试试这个:

  1. 关于 X:-atan2(y, z)
  2. 关于Y:atan2(x, sqrt(y*y + z*z))
  3. 关于Z:0
于 2010-10-27T17:54:33.687 回答
-2

谈到轴的旋转,我认为第 3 步应该是 X'-、Y''- 和 Z'-轴围绕 Y''-轴的旋转。

于 2009-09-02T00:50:02.677 回答