[英]How do I calculate the yaw, pitch, and roll of a point in 3D?
給定 3D 空間中的一個點,將一條線轉換為指向該 object 所需的三個角度(例如歐拉角)是多少?
想象一下,我在 3D 中有一條線(或一個框),我想將它的航向、俯仰和坡度轉換為從原點指向 3D 點,這些角度我將使用什么值?
我無法計算出數學來計算指向(1,2,3)
等位置的角度。
注意:我將使用3D Math Primer for Graphics and Game Development by Fletcher Dunn定義的約定“航向、俯仰、傾斜”,而不是“偏航、俯仰、滾動”。
首先,請注意,在 2D 坐標系中,您只需要一個角度 + 幅度即可“指向”2D 中的任何點。
同樣,在 3D 坐標系中,您只需要兩個角度+ 幅度即可“指向”3D 中的任何點。 最后一個角度(“bank”或“roll”)不影響 3D 中點的位置。 相反,它會“旋轉”指向它的箭頭。 如果 object 是 360 度對稱的,則根本不會看到影響 object 的自旋。 如果 object 不對稱(例如飛機),它將影響 object(例如,將一個機翼向地面傾斜,另一個向天空傾斜)。
所以最初的問題實際上變成了,“我如何找到航向角、俯仰角和幅度來“指向”3D 空間中的任何點?
您可以使用三角函數輕松計算出這一點。 假設我們有點(1,2,3)
,我們正在嘗試計算航向、俯仰、幅度。
對於以下示例,讓我們使用此圖,其中左軸為 X,上軸為 Y,右軸為 Z。點(1,2,3)
則由藍色球體表示。
首先,讓我們找到最簡單的值,即幅度。 對我們來說幸運的是,只要使用勾股定理,任何兩點之間的大小(長度)都很容易找到,無論我們有多少維。 由於我們在 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 空間,則查找標題變得微不足道。
我們可以畫一個三角形 forms 與 X 軸成 90 度角(紅色三角形),然后計算該角度。 回憶三角函數tan(angle) = opposite / adjacent
,求解angle
,我們得到angle = arctan(opposite / adjacent)
。
在這種情況下,“相鄰”是一個已知量( redAdjacent = x = 1
),“相反”也是已知的( redOpposite = z = 3
)。 我們不想使用 arctan 來求解方程,而是使用atan2 ,因為它會為我們處理 x 和 y 的所有不同情況。
所以我們有:
heading = atan2(redOpposite, redAdjacent)
插入我們的實際值:
heading = atan2(3, 1)
= 1.249045772398
所以我們的航向是1.249
rad,或 ~ 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
弧度,間距為0.564
弧度,它將從(0,0,0)
延伸到(1,2,3)
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.