在我正在研究的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/
答案 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 );