簡體   English   中英

如何從 3D 向量中獲取偏航、俯仰和滾動

[英]How to get Yaw, Pitch and Roll from a 3D vector

我有一個應用到 position 的方向向量給了我相機應該看的點。 為了正確使用 glRotatef,我怎樣才能從偏航、俯仰和滾動中獲得?

提前致謝

您無法從方向向量獲得偏航,俯仰和滾動,因為方向向量只會告訴您要看哪個方向(偏航和俯仰)

要獲得偏航角和俯仰角,您可以使用三角學-我假設您已掌握一些工作知識。 此Wiki頁面上查看一些有用的圖表以可視化角度。

令Y =偏航,P =俯仰。

首先要獲得偏航:

tan(Y) = x/(-y)

現在開始推銷:

tan(P) = sqrt(x^2 + y^2)/z

為了獲得Y和P的實際值,您需要使用反正切,我已經在上面使用tan編寫了它,以使推導更清晰。

請注意,減號取決於您定義角度和軸的方式,但是您應該明白這一點。

然后,您可以將roll設置為0或任意設置。

這些方程式都不是“錯誤的”,但都有些笨拙。 Ryder052,您的示例並未說明您所評論的某些情況。 為什么不使用atan2?

給定單位(規范化)方向矢量d

pitch = asin(-d.Y);
yaw = atan2(d.X, d.Z)

您可能實際上並不想要偏航,俯仰和滾動。 您只需要正確的轉換即可。 嘗試使用gluLookAt構建它。 文件資料

菲利克斯的方程式是錯誤的。 親愛的未來的Google員工,您在這里工作了:

假設俯仰:X軸旋轉,偏航:Y軸旋轉,側傾:Z軸旋轉。 方向向量V(x,y,z)

pitch = asin(V.y / length(V));
yaw = asin( V.x / (cos(pitch)*length(V)) ); //Beware cos(pitch)==0, catch this exception!
roll = 0;

好吧,我不確定這些答案是關於什么的,因為我無法讓它們中的任何一個起作用。

我創建了自己的解決方案...

// get world target offset
// convert world target offset to world direction normal
// get my world transposed (inverted)
// rotate world direction normal to my space normal

Vector3D lWorldTargetOffset = gWorldTargetLocation - gWorldMyLocation;
Vector3D lWorldTargetDirection = lWorldTargetOffset.Normalize();
MatrixD lMyWorldTransposed = MatrixD.Transpose(MyWorldMatrix);
Vector3D lMySpaceTargetDirection = Vector3D.Rotate(lWorldTargetDirection, lMyWorldTransposed);

你現在在我的空間中擁有正常的世界目標方向

lMySpaceTargetDirection.X = pitch
lMySpaceTargetDirection.Y = yaw.
lMySpaceTargetDirection.Z = <0 infront >0 behind.

根據方向法線,所有值都是-1到1,所以如果你想要度數只是* 90。

並不是說這是最好的解決方案,但它是我花費數小時在網上搜索並涉足大量遲鈍和模糊不清的雜物后唯一可以開始工作的解決方案。

我希望您、某人或任何人會喜歡簡單地將目標方向正常旋轉,使其相對於 myspace,並發現它既簡單又有用:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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