计算旋转以查看3D点?

时间:2009-08-09 17:41:10

标签: math 3d rotation angle euler-angles

我需要计算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)

pic   

enter image description here


这是我的系统。

  • 坐标系是x =向右,y =向下,z =进一步向后
  • 对象默认为(0,0,1),面向后方
  • 旋转的顺序为X,Y,Z,其中X上的旋转是俯仰,Y是偏航,Z是滚动

my system

4 个答案:

答案 0 :(得分:13)

以下是我的工作假设:

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

(术语偏航,俯仰和滚动可能令人困惑,所以我想避免使用它,但粗略地说对应是x =俯仰,y =偏航,z =滚动。)

根据此设置,我尝试解决您的问题:

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) )

希望这是正确的迹象。我认为解决这些迹象的最简单方法是通过反复试验。事实上,您似乎已经rotxroty上的标记正确 - 包括与z相关的微妙问题 - 因此您只需要修复rotz上的标记。< / p>

我希望这是非常重要的(可能取决于你所处的那个八卦),但在说出错之前请尝试一些可能性。祝你好运!


这是最终为我工作的代码。

我注意到当物体从任何前象限(正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 );
 }

答案 1 :(得分:6)

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

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

你有:单点的三维坐标

你想要的:一组欧拉角

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

你还应该意识到欧拉角度可能含糊不清:里奇的答案假定为 旋转应用于Z,然后是X',然后是Z',但这不是标准化的。如果必须使用欧拉角与其他代码进行互操作,则需要确保使用相同的约定。

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

答案 2 :(得分: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

答案 3 :(得分:-2)

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