Math 计算旋转以查看三维点?

Math 计算旋转以查看三维点?,math,3d,rotation,angle,euler-angles,Math,3d,Rotation,Angle,Euler Angles,我需要计算3D对象面对任意3D点的2个角度(偏航和俯仰)。这些旋转被称为“Euler”旋转,因为在第一次旋转之后(比如说Z,基于下图),Y轴也随着对象旋转 这是我正在使用的代码,但它不能完全工作。当在地平面(Y=0)上时,对象正确地旋转以面对该点,但只要我在Y方向上向上移动该点,旋转看起来就不正确 // x, y, z represent a fractional value between -[1] and [1] // a "unit vector" of the point I need

我需要计算3D对象面对任意3D点的2个角度(偏航和俯仰)。这些旋转被称为“Euler”旋转,因为在第一次旋转之后(比如说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 ) )
你知道如何计算给定点的两个欧拉角吗


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


这是我的系统

  • 坐标系为x=向右,y=向下,z=再向后
  • 默认情况下,对象位于(0,0,1)处,该位置朝后
  • 旋转顺序为X、Y、Z,其中X上的旋转为俯仰,Y为偏航,Z为滚转

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

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

有:单个点的三维坐标

您需要:一组欧拉角


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

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


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

< p>谈论轴的旋转,我认为步骤3应该是关于y′轴的x′,y′,z′轴的旋转。

< p>这里是我的工作假设:

  • 坐标系(x,y,z)是这样的:正x向右,正y向下,z是剩余方向。特别是,y=0是地平面
  • (0,0,0)处当前朝向(0,0,1)的对象正在转向朝向(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) )
希望这是正确的迹象。我认为解决这些问题最简单的方法是反复试验。事实上,您似乎已经在
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 );
 }

这一系列旋转将满足您的要求:

  • 大约X:0
  • 关于Y:atan2(z,x)
  • 关于Z:atan2(y,sqrt(x*x+Z*Z)) 除非你首先定义如何使用这些术语,否则我无法告诉你“横滚”、“俯仰”和“偏航”是什么。您没有以标准方式使用它们

    编辑:
    好的,那么试试这个:

  • 关于X:-atan2(y,z)
  • 关于Y:atan2(x,sqrt(Y*Y+z*z))
  • 大约Z:0
    “你没有足够的信息”。。我不是已经描述过3D空间中的两点了吗?第一点是任何东西,第二点是0,0,0。。。所以我想测量XYZ顺序中2个点之间的欧拉旋转,请考虑更新你的答案,因为我已经编辑了我的问题,加了+1 500的赏金。所以这里有一个误解。你说如果对象是y=0,你的代码就可以工作,但我不明白是怎么回事。在这种情况下,计算偏航=0,但俯仰=0,这似乎不正确。(这就是为什么我问z是否向上/向下。)有什么想法吗?是的,因为我的对象离它所面对的点有一段距离,唯一真正改变的角度是偏航(沿Y轴旋转,因此对象水平旋转以面对地平面上的点)。我说了什么让人困惑的话吗?@Rex-我已经在编辑的问题中解释了我能解释的一切,如果你还需要什么,请回信。正在等待更新的代码。@Rex-非常感谢!正确答案!!!它就像一个符咒,我的物体正确地旋转面对向量。。。呸!!!为了找到正确的答案,几乎花了一个星期的时间。Braineee:Stack Overflow是8年前推出的。您是在评论7年前提出的一个问题,该问题最近一次在6年前被激活。当您说“沿Y向上移动对象”时,您的意思是“沿Y向上移动点”?旋转前物体朝向哪个方向?@Beta-是的,这就是我的意思。对象是fa