2011-10-20 39 views
1

我在3D中有一個球體。在運行時,我爲它生成一個動態的2048x1024紋理。在這個紋理上繪製一個小圓圈,它可以在任何地方。我在紋理上有這個圓的x/y,因此有相應的UV座標。現在,我想插入這個小圓圈所在的球體上的位置。計算一個球體的XYZ點,給定其紋理的UV座標

這是我一直在使用的代碼,但它似乎總是關閉的+/- 90度

// U, V are original UV obtained from dynamic texture. 

_u = Math.PI * U; 
_v = -2 * Math.PI * V; 

_x = Math.cos(_u) * Math.sin(_v) * radius; 
_y = Math.sin(_u) * Math.sin(_v) * radius; 
_z = Math.cos(_v) * radius; 

感謝您的幫助!

回答

2

根據您在評論中發佈的代碼,以下是如何生成X,Y和Z值。

theta = 2 * PI * U; 
phi = PI * V; 

_x = Math.cos(theta) * Math.sin(phi) * radius; 
_y = Math.sin(theta) * Math.sin(phi) * radius; 
_z = -Math.cos(phi) * radius; 

OLD答:

你的代碼是正確的。你確定這個球體是以相同的方式產生的,而且這些球體是沿着Z軸的嗎? 「通常」球體是沿着Y軸產生的極點。檢查這個。否則,如果你總是偏離+/- 90°,那麼玩弄定義x和y的sin和cos。例如:

_x = -Math.sin(_u) * Math.sin(_v) * radius; 
_y = Math.cos(_u) * Math.sin(_v) * radius; 

是原始的90°旋轉。

有8種不同的方式可以做出這兩個元件的sin/cos變化的符號。不知道你的球體是如何產生的,你必須全部嘗試。 他們去

(x = sin(u), y = cos(u)); 
(x = sin(u), y = -cos(u)); 
(x = -sin(u), y = cos(u)); 
(x = -sin(u), y = -cos(u)); 

(x = cos(u), y = sin(u)); 
(x = cos(u), y = -sin(u)); 
(x = -cos(u), y = sin(u)); 
(x = -cos(u), y = -sin(u)); 

然而,這是痛苦的,哈克,我強烈建議試圖找出如何產生的球體。他們通常通過U和V循環產生的x,y,z位置

+0

感謝你 - 這些杆位於Y軸(Y-UP),如果這改變了任何東西。 – Brad

+0

是的,這使得世界有所不同!查看編輯。 – Hannesh

+0

恐怕仍然沒有得到它:( – Brad

0

請確保您有定義正確的座標軸,即:

ENU - 東部北起 NED - 大地座標系

的NED和ENU的變換通常是不同的,因爲方位角被定義爲相同的方式,即相對於北方的順時針。

在θ上各做一個90°或使用輔角規則。

嘗試推導公式自己可能..確保你知道正在使用

0

方程約定您使用生成球體治療極作爲Z軸。如果使用GLUT這樣的默認座標系,則Z軸垂直於屏幕,「向上」是Y軸。如果你交換Z和Y,它可能適合你。我剛剛完成了類似的工作,我對結果感到滿意。

我使用了以下內容。

double theta = ((2 * PI)/lWidth) * u; 
double phi = (PI/lHeight) * v; 

double dX = std::cos(theta) * std::sin(phi) * radius; 
double dZ = std::sin(theta) * std::sin(phi) * radius; 
double dY = std::cos(phi) * radius; 

lWidth和lHeight是我映射到球體的位圖的尺寸。