簡體   English   中英

如何計算 3D 中一個點的偏航、俯仰和滾動?

[英]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)則由藍色球體表示。

在此處輸入圖像描述

1. 找出量級

首先,讓我們找到最簡單的值,即幅度。 對我們來說幸運的是,只要使用勾股定理,任何兩點之間的大小(長度)都很容易找到,無論我們有多少維。 由於我們在 3D 並且我們正在計算從原點到我們點的距離,我們的距離公式變為:

magnitude = sqrt(x*x + y*y + z*z)

插入我們的實際值:

magnitude = sqrt(1*1 + 2*2 + 3*3)
          = 3.7416573868

所以我們的大小(或長度)是 ~ 3.741

2.找到標題

接下來,要找到航向,請注意我們只關心圍繞 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°

3.找到音高

最后,我們需要找到音高。 與我們對標題所做的類似,我們可以將 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM