我需要计算一个三维物体面对任意三维点的两个角度(偏航和俯仰)。这些旋转被称为“欧拉”旋转,仅仅是因为在第一次旋转之后(比如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)


这是我的系统。
backward
。

发布于 2010-10-26 08:30:23
以下是我的工作假设:
(术语偏航、俯仰和滚动可能会令人困惑,所以我想避免使用它,但粗略地说,对应关系是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 );
}发布于 2009-08-09 23:15:50
富卖家的答案告诉你如何旋转一个点从一个三维坐标系到另一个系统,给定一组描述两个坐标系之间旋转的欧拉角。
但听起来你要求的是不同的东西:
你有:一个点的三维坐标
你想要:一组欧拉角
如果这就是你想要的,你就没有足够的信息。要找到欧拉角,你需要至少两个点的坐标,在两个坐标系中,确定从一个坐标系到另一个坐标系的旋转。
你也应该注意到,欧拉角可能是模棱两可的:里奇的答案假设旋转适用于Z,然后X',然后Z',但这是不标准化的。如果您必须使用Euler角度与其他代码进行互操作,则需要确保您使用的是相同的约定。
您可能需要考虑使用旋转矩阵或四元数来代替欧拉角。
发布于 2009-09-02 00:50:02
说到轴的旋转,我认为第三步应该是X'-,Y‘-和Z’-轴围绕Y‘-轴的旋转。
https://stackoverflow.com/questions/1251828
复制相似问题