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 个连接到 lat/lng 但我尝试过的所有组合都没有奏效。

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

4

2 回答 2

2

所有你需要的是:

mesh.lookAt( sphere.position );

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

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

于 2012-09-06T09:11:46.303 回答
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/

于 2012-09-06T05:08:41.017 回答