Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opengl 旋转四边形,使其';s垂直于球体_Opengl_3d_Three.js - Fatal编程技术网

Opengl 旋转四边形,使其';s垂直于球体

Opengl 旋转四边形,使其';s垂直于球体,opengl,3d,three.js,Opengl,3d,Three.js,在我正在开发的OpenGL应用程序中,我有一个半径为r的球体和一个lat/long点数组 我想渲染一个球体,然后在每个lat/long处渲染一个正方形。我粘在上面的那块是旋转正方形的,所以对于任何位置,它都垂直于球体的表面,就像切线一样 球体以原点为中心 在伪代码中,我有: lat = rand( 180.0 ) - 90.0; lng = rand( 180.0 ); phi = ( 90.0 - lat ) * PI / 180.0; theta = ( 360.0 - lng ) * P

在我正在开发的OpenGL应用程序中,我有一个半径为r的球体和一个lat/long点数组

我想渲染一个球体,然后在每个lat/long处渲染一个正方形。我粘在上面的那块是旋转正方形的,所以对于任何位置,它都垂直于球体的表面,就像切线一样

球体以原点为中心

在伪代码中,我有:

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,我想另外两个连接到lat/lng,但我尝试过的所有组合都不起作用


这里的JavaScript示例:

我不确定这是否是最好的方法,但使用一些代码使相机看向一个点,我想出了这个方法来旋转正方形,它似乎可以按照我的要求工作:

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 );
这里的示例:

您只需要:

mesh.lookAt( sphere.position );
请参阅更新的小提琴,其中有注释:


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

旋转为零时,正方形的方向如何?旋转顺序是什么?如果setRotation的值都为0(),我会得到这个结果-不确定旋转顺序是什么意思。我想我可以在每个轴上单独旋转,这样我可以控制顺序。或者你的意思是在设置位置之前旋转吗?通常,当旋转指定为三个值时,它指示围绕X、Y和Z轴的旋转量,但应用这些旋转的顺序会影响结果。旋转是应用于固定轴还是旋转轴也很重要。如果旋转发生在原点,然后对象移动到其最终位置,这是真的吗?这是一个很好的方法,但是makeRotation调用是不必要的。但是,在没有这些调用的情况下,我如何设置旋转角度?谢谢你的宝贵建议沃恩-非常感谢。非常感谢韦斯特兰利-我从Camera::LookAt()获得了我使用的代码-我不知道网格上也存在这种方法。