我构建了3D地球仪,并将其放置在父边界框/轴中,如下所示:
var globe = new THREE.Group();
if (earthmesh) {globe.add(earthmesh);};
if (linesmesh) {globe.add(linesmesh);};
if (cloudmesh) {globe.add(cloudmesh);};
if (atmosmesh) {globe.add(atmosmesh);};
pivot = new THREE.Group();
if (globe) {pivot.add(globe);};
if (pivot) {scene.add(pivot);};
因此,当在父对象上围绕Z(从远到近)轴应用23度旋转时:
pivot.rotation.set(THREE.Math.degToRad(0), THREE.Math.degToRad(0), THREE.Math.degToRad(23));
在动画功能中,地球仪将围绕Y轴(从下到上)相对于其父轴旋转(如果您想知道,v
只是一个对象,它包含.loop
的值,即360度、.rate
的值,即旋转速度,以及.roll
、.spin
和.tilt
的变量,对应于地球仪的X、Y和Z旋转,单位为度):
function animate()
{
delta = clock.getDelta();
resize();
v.spin = (v.loop + v.spin + v.rate * delta) % v.loop;
globe.rotation.set(THREE.Math.degToRad(v.roll), THREE.Math.degToRad(v.spin), THREE.Math.degToRad(v.tilt));
renderer.render(scene, camera);
requestAnimationFrame(animate);
}
如下面的绿色箭头所示,而不是红色箭头如何指示地球仪是否没有旋转的父对象:
这很简单,如果我这样做,效果很好:
pivot.rotation.set(THREE.Math.degToRad(v.roll), THREE.Math.degToRad(0), THREE.Math.degToRad(v.tilt));
globe.rotation.set(THREE.Math.degToRad(0), THREE.Math.degToRad(v.spin), THREE.Math.degToRad(0));
在上述动画功能和我的按需/手动旋转系统中,无需更改相机位置/方向,因为这是由三个ArcballControls库按需要处理的.js,也可以在上面看到.
但是,我希望通过使用三种可用的其他工具在其父对象内实现此对象旋转.js,如矩阵、向量、四元数或其他内置函数,without having to set a parent for the globe and distributing the rotations between the parent and the child.我们的 idea 是像上面的原始动画功能一样进行地球旋转,并应用一些其他工具(甚至公式)来改变旋转并产生所需的效果.我该怎么做?
为了清晰起见,这种方法相对于为全球创建母公司的好处在于:
- 我将能够在
if (...) {...}
条件下轻松地在"正常"(红色箭头)和"改变"(绿色箭头)旋转系统之间切换,而无需 destruct 、重新创建或重置父子构造 - 我将能够自由地使用地球仪和改变方法的所有3个轴的旋转,而不是对父对象和子对象应用一些旋转
此外,如果其他方法太复杂,我最终会 Select 上面的父子方法,那么在这种情况下,我如何将旋转系统"重置"为"原始"(即红色箭头)方式,而不改变对象的视觉方向?我的意思是,将pivot
旋转重置为(0, 0, 0)
是很清楚的,但是应用于全局子对象的旋转是什么,以便即使其父对象现在没有旋转,它也保持不变?
Note:为简单起见,假设父组和子组/对象都处于(0,0,0)位置,并且父旋转在一个轴上进行说明,但理想情况下,备选方案应允许枢轴和对象的不同假设定位,而在所有3个轴上都可以进行改变全局的旋转.
P.S.为了使问题更清晰或更紧凑,请随时提出改进建议(对不起,我不是技术术语方面的专家,比如世界或局部旋转等),但try not to rush into marking it as a duplicate or closing it before you are absolutely sure about it.