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 の値を考えたいと思います。もちろん、そのうちの 1 つは 0 である必要があり、他の 2 つは緯度/経度に接続されていると思いますが、試したすべての組み合わせは機能しませんでした。

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 に答える