**需求:**在三维地球上某点进行贴图,并且任意角度都可以观察到。
发生场景:设想的是直接用贴图在某点贴上去,可发现旋转视角并不能任意方向都观察到,查了下资料才想起来three.js的贴图默认贴在xoy平面,即使开了双面可见,视线总有看不见的(贴图是二维平面,而不是三维的)。
解决办法:保证贴图与球面要进行贴图的某点相切,这样各个视角就看得见了。
首先要知道相切的概念:一看图就懂,不解释了。
然而通常我们都是在二维平面中去了解他们,当涉及到三维开发的时候,通常的思路是:计算两个面的法向量,若两个法向量平行并重叠,则两个平面两两垂直。
1.计算该点与球心构成法向量,并进行归一化;
var coordVec3 = new THREE.Vector3(coord.x, coord.y, coord.z).normalize();
2.因为three.js的贴图默认贴在xoy平面,所以要贴的图法向量取(0, 0, 1)
var meshNormal = new THREE.Vector3(0, 0, 1);
3.利用three封装好的四元数库,计算从向量vFrom到vTo所需的四元数,然后改变贴图的状态。
.setFromUnitVectors ( vFrom : Vector3, vTo : Vector3 ) : Quaternion
Sets this quaternion to the rotation required to rotate direction vector vFrom to direction vector.
mesh.quaternion.setFromUnitVectors(meshNormal, coordVec3);
最终效果图: