我需要计算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)
这是我的系统。
答案 0 :(得分:13)
以下是我的工作假设:
(术语偏航,俯仰和滚动可能令人困惑,所以我想避免使用它,但粗略地说对应是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) )
希望这是正确的迹象。我认为解决这些迹象的最简单方法是通过反复试验。事实上,您似乎已经rotx
和roty
上的标记正确 - 包括与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)
这一系列轮换将为您提供所需要的内容:
除非您首先定义如何使用这些术语,否则我无法告诉您这些在“滚动”,“俯仰”和“偏航”方面的含义。您没有以标准方式使用它们。
修改:
好的,然后试试这个:
答案 3 :(得分:-2)
谈到轴的旋转,我认为第3步应该是围绕Y'轴的X',Y''和Z'轴的旋转。