我正在寻找一种方法将方向矢量(X,Y,Z)转换为欧拉角(航向,俯仰,坡度).我知道方向矢量本身不足以获得倾斜角度,因此还有另一个所谓的向上矢量.
有方向向量(X,Y,Z)和向上向量(X,Y,Z)我如何将其转换为欧拉角?
我需要计算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 ) )
Run Code Online (Sandbox Code Playgroud)
你知道如何计算给定点的2个欧拉角吗?
下图显示了我旋转的方式.这些是我需要计算的角度.(唯一的区别是我按X,Y,Z顺序旋转物体而不是Z,Y,X)
pic http://i53.tinypic.com/33lo6jp.jpg
这是我的系统.

我有2个旋转矩阵(让我们称之为A和B),其中:
A = 1 0 0
0 0 -1
0 1 0
Run Code Online (Sandbox Code Playgroud)
和
B = -1 0 0
0 0 -1
0 -1 0
Run Code Online (Sandbox Code Playgroud)
这基本上只是一个旋转,相机旋转在后面看自己.显然,我不能直接在矩阵中插值,因为它看起来很奇怪.我已经尝试将矩阵转换为欧拉角,产生2组X,Y,Z角,并试图根据X,Y,Z角的每个分量之间的最小距离确定使用哪个角.这肯定会产生我想要的那种旋转,但是我想不出一个合适的方法来确定插入哪个角度,因为有时导致最小误差的角度组会导致围绕错误的轴/轴旋转.我也尝试了四元数,但这基本上给了我相同的结果.谁能指出我正确的方向?
目前,我正在尝试使用方向传感器值使用getRotation()方法旋转3D立方体.当Android设备旋转到某些边界以上时,会观察到一些意外行为.例如,如果我让设备'站起来','roll'的价值就变得疯狂了.
此外,我正在经历类似于所谓的万向节锁定的现象.唯一的区别是,即使在将传感器值应用于3D旋转之前,我也遇到了这个问题.当我尝试通过仅围绕"俯仰"轴旋转设备来改变"俯仰"值时,"偏航"值也会根据俯仰的旋转而改变.这对我来说似乎完全不合理.
有人能帮帮我吗?我在这个问题上坚持了一个月.