2011-12-31 94 views
0

我在3D空間和兩個角度有一個點,我想從這個信息計算出結果線。我發現如何用2D線做到這一點,但不是3D。這如何計算?從一個起點和三維角度計算一條線

如果有幫助:我正在使用C++ & OpenGL,並有用戶的鼠標點擊位置和相機的角度,我想跟蹤這條線的交叉點。

+0

你的意思是你試圖對用戶點擊的地方投射光線,這源於相機? – 2011-12-31 05:48:32

+0

這是正確的。我是新手,不確定我是否使用了正確的詞彙。 – 2011-12-31 05:49:35

+0

您使用哪種語言? – vdbuilder 2011-12-31 05:50:16

回答

2

以三角形來說,需要兩個角度和一個點來定義三維空間中的一條線。轉換該到(x,Y,Z)是隻是極座標到直角座標的方程是:

X = R罪(Q)餘弦(F)

Ŷ= R罪(Q)罪(F )

Z = R COS(q)

其中r是從點P至原點的距離;線OP與正極軸之間的角度q(天頂)(可以被認爲是z軸);和初始射線與OP在赤道平面上的投影(通常從x軸測量)之間的角度f(方位角)。

編輯:

好的,這是你問的第一部分。其餘的問題,即問題更新後的真正問題,比從3D角度和3D空間中的點創建線要複雜得多。這涉及使用攝像機到世界的轉換矩陣,並在其他SO問題中進行了介紹。爲了方便,這裏有一個:How does one convert world coordinates to camera coordinates?答案涵蓋從世界到相機和相機到世界的轉換。

+0

感謝您的編輯,但我已經有了使用GluUnproject的觀點。 – 2011-12-31 15:22:38

+0

@Shawn B基本上,從那裏你可以認爲你的觀點是Origin創造了上面數學的界線,並應用一個變形矩陣來獲得世界座標系中的座標系。 – vdbuilder 2011-12-31 21:28:00

2

該線可以作爲「時間」中的一個點來衡量。這個方程必須是矢量化的,或者有一個合理的方向,所以時間是一種自然想法的方式。因此,在3個維的直線的方程真的是X,Y系列二維方程組,Z與時間有關的,如:

x = ax*t + cx 
y = ay*t + cy 
z = az*t + cz 

要查找的方程組,假設攝影機在原產地, (0,0,0),和你的觀點是(X1,Y1,Z1),那麼

ax = x1 - 0 
ay = y1 - 0 
az = z1 - 0 

cx = cy = cz = 0 

所以

x = x1*t 
y = y1*t 
z = z1*t 

注:這也假定了 「速度」 直線或矢量是這樣的,它在你的位置(x1,y1,z1)af一秒鐘。

因此,繪製該線只需按需要填充點就好,比如每10秒鐘的1/1000秒就可以畫出一條「線」,真的是一系列當從遠處看到的點顯示爲一條線時,超過10秒的距離,由您選擇的「速度」決定。

+0

我有相機的度數角度,他們應該在什麼單位進行計算? – 2011-12-31 06:23:14

+0

角度信息嵌入在攝像機將成爲原點(線條起始點),點(0,0,0)的假設中。只給出相機或三維空間中的一個點的角度,假設相機爲原點,可以推導出3D線,而不需要兩者。 – Motes 2011-12-31 06:32:29

+0

如果相機不在原點,而是在X和Y上都旋轉了45度? – 2012-01-01 00:33:12

相關問題