2012-09-06 23 views
0

在我正在開發的OpenGL應用程序中,我有一個半徑爲r的球體和一個經緯度點陣列。旋轉四個方塊使其與球體垂直

我想渲染一個球體,然後在每個經緯度渲染一個正方形。我被卡住的那部分旋轉了正方形,因此對於任何位置,它都垂直於球體表面 - 就像一個切線。

球體以原點爲中心。

僞代碼,我有:

lat = rand(180.0) - 90.0; 
lng = rand(180.0); 

phi = (90.0 - lat) * PI/180.0; 
theta = (360.0 - lng) * PI/180.0; 

x = radius * sin(phi) * cos(theta); 
y = radius * cos(phi); 
z = radius * sin(phi) * sin(theta); 

square.setRotation(rx, ry, rz); 
square.setPosition(px, py, pz); 

我要來爲RX,RY和RZ值。其中一個當然應該是0,我想其他2個連接到經緯度,但我試過的所有組合都沒有奏效。

JavaScript的例子在這裏:http://jsfiddle.net/NZEBH/2/

+0

當旋轉爲零時,您的方形如何定向? –

+0

什麼是輪換順序? –

+0

這是我得到的,如果setRotation的值都是0(http://i.imgur.com/Ghurv.png) - 不確定你的意思是按順序排列。我*想*我可以在每個軸上單獨旋轉,因此我可以控制順序。或者你的意思是在我設置位置之前旋轉嗎? – speedwell

回答

2

所有你需要的是:

mesh.lookAt(sphere.position); 

見更新撥弄它說:http://jsfiddle.net/NZEBH/59/

記住,如果朝球體的中心,面對正常的面孔,那麼你必須將材料設置爲THREE.BackSide或THREE.DoubleSide。

+0

非常感謝WestLangley - 我從Camera :: LookAt()得到了我使用的代碼 - 我不知道Mesh上的方法也存在。 – speedwell

0

我不知道這是否是最好的方式,但使用一些代碼來使相機看一個點,我想出了這個旋轉的方形,它似乎工作,我想:

var target_vec = new THREE.Vector3(0, 0, 0); 
var rotation_matrix = new THREE.Matrix4(); 
rotation_matrix.makeRotationX(phi); 
rotation_matrix.makeRotationY(0); 
rotation_matrix.makeRotationZ(theta); 
rotation_matrix.lookAt(mesh.position, target_vec, mesh.up); 
mesh.rotation.setEulerFromRotationMatrix(rotation_matrix, mesh.eularOrder); 

這裏舉例:http://jsfiddle.net/NZEBH/47/

+0

這是一個很好的方法,但makeRotation調用是不必要的。 –

+0

但是,如何在沒有這些調用的情況下設置旋轉角度? – speedwell

+0

謝謝您寶貴的建議Vaughn - 非常感謝。 – speedwell