旋转四边形使其垂直于球体

时间:2012-09-06 02:07:41

标签: opengl 3d three.js

在我正在研究的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个连接到lat / lng,但我尝试过的所有组合都没有用。

这里的JavaScript示例:http://jsfiddle.net/NZEBH/2/

2 个答案:

答案 0 :(得分:2)

您只需要:

mesh.lookAt( sphere.position );

请参阅评论的更新小提琴:http://jsfiddle.net/NZEBH/59/

请记住,如果面法线面向球体的中心,则必须将材质设置为THREE.BackSide或THREE.DoubleSide。

答案 1 :(得分: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/