给出3D空间中的一个点,将一条线转换为指向该对象所需的三个角度(例如欧拉角)是什么?
想象一下我在3D中有一条线(或一条盒子),并且想要转换其航向,俯仰和倾斜以从原点指向3D点,我将为那些角度使用什么值?
我无法计算出指向(1,2,3)
等位置的角度。
答案 0 :(得分:0)
注意:我将使用3D Math Primer for Graphics and Game Development by Fletcher Dunn定义的约定“航向,俯仰,倾斜”代替。
首先,请注意,在2D坐标系中,只需一个角度+大小即可“指向” 2D中的任何点。
类似地,在3D坐标系中,您only need two angles +幅度可“指向” 3D中的任何点。最后一个角度(“倾斜”或“横滚”)不影响3D中点的位置。而是“旋转”指向它的箭头。如果对象是360度对称的,则根本不会看到旋转影响对象。如果物体不对称(例如飞机),则会影响物体(例如,将一侧机翼向地面倾斜,另一侧机翼向天空倾斜)。
因此,最初的问题实际上变成了“如何找到指向3D空间中任何点的航向角,俯仰角和大小?”
您可以使用三角函数轻松解决这一问题。假设我们有一个(1,2,3)
点,我们正在尝试计算航向,俯仰,幅度。
对于下面的示例,让我们使用此图,其中左轴为X,上轴为Y,右轴为Z。点(1,2,3)
,然后由蓝色球体表示。
首先,让我们找到最简单的值,即幅度。对我们来说幸运的是,无论我们处于多少维度中,只要使用Pythagorean theorem,就很容易找到任意两点之间的大小(长度)。由于我们处于3D状态,并且正在计算从原点到我们点的距离,因此我们的距离公式变为:
magnitude = sqrt(x*x + y*y + z*z)
使用我们的实际值:
magnitude = sqrt(1*1 + 2*2 + 3*3)
= 3.7416573868
所以我们的幅度(或长度)约为〜3.741
。
接下来,要找到标题,请注意,我们只关心绕XZ平面的旋转,而根本不关心Y轴。如果我们要将3D空间“展平”为2D,则为becomes trivial to find the heading。
我们可以绘制一个与X轴成90度角的三角形(红色三角形),然后计算该角度。回忆三角函数tan(angle) = opposite / adjacent
,求解angle
,得到angle = arctan(opposite / adjacent)
。
在这种情况下,“相邻”是已知数量(redAdjacent = x = 1
),“相反”也是已知数量(redOpposite = z = 3
)。不过,我们希望使用atan2而不是使用arctan来求解方程,因为它将为我们处理x和y的所有不同情况。
所以我们有:
heading = atan2(redOpposite, redAdjacent)
使用我们的实际值:
heading = atan2(3, 1)
= 1.249045772398
因此我们的标题为1.249
弧度,或〜72°
。
最后,我们需要找到音高。与我们进行标题操作类似,我们可以沿着包含以下三个点的平面将3D空间展平为2D:(A)原点(0,0,0)
,(B)我们的点(1,2,3)
,以及(C)我们将投影到XZ平面(1,0,3)
上的点(例如,通过将Y值设置为0)。
如果我们在所有这三个点之间绘制一个三角形,您会注意到它们再次形成了直角三角形(绿色三角形)。我们可以再次简单地使用arctan2
计算角度。
我们已经在第1步中计算了绿色斜边(即向量的大小):
greenHypotenuse = sqrt(x*x + y*y + z*z)
= 3.7416573868
我们也知道绿色三角形的反面与y值相同:
greenOpposite = y
= 2
使用勾股定理,我们可以找到相邻角的长度:
greenOpposite^2 + greenAdjacent^2 = greenHypotenuse^2
y*y + greenAdjacent^2 = x*x + y*y + z*z
greenAdjacent^2 = x*x + z*z
greenAdjacent = sqrt(x*x + z*z)
请注意,另一种计算绿色三角形相邻长度的方法是注意redHypotenuse == greenAdjacent
,我们可以使用以下方法找到redHypotenuse
:
redHypotenuse^2 = redAdjacent^2 + redOpposite^2
= x*x + z*z
redHypotenuse = sqrt(x*x + z*z)
插入实际值,我们得到:
greenAdjacent = sqrt(1*1 + 3*3)
= 3.1622776602
现在我们知道了绿色三角形的相邻长度和相反长度,我们可以再次使用arctan2
:
pitch = atan2(greenOpposite, greenAdjacent)
= atan2(2, 3.1622776602)
= 0.563942641356
所以我们的间距是0.5634
弧度,或大约32°
。
如果您要从原点绘制一条线,其长度为3.741
,标题为1.249
rad,间距为0.564
rad,它将从(0,0,0)
延伸到{ {1}}。