我构建了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);
}

如下面的绿色箭头所示,而不是红色箭头如何指示地球仪是否没有旋转的父对象:

Rotation Inside Pivot Parent

这很简单,如果我这样做,效果很好:

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.

推荐答案

你的问题很长,但我想你要的是"轮换顺序".旋转通常应用于x轴,然后是y轴,最后是z轴.

您可能希望将地球的倾斜(z)放在第一位,而每日旋转(y)放在最后,因此您可以将其更改为:globe.rotation.order = "ZXY"

See here for official documentation on rotation order

Javascript相关问答推荐

使用JavaScript在ionic Web应用程序中更新.pane和.view的背景 colored颜色

如何使用侧边滚动按钮具体滚动每4个格?

我应该绑定不影响状态的函数吗?'

如何修复我的js构建表每当我添加一个额外的列作为它的第一列?

google docs boldText直到按行执行应用脚本错误

colored颜色 检测JS,平均图像 colored颜色 检测JS

如何从调整大小/zoom 的SVG路径定义新的d属性?""

您能在卸载程序(QtInsteller框架)上添加WizardPage吗?

如何在不影响隐式类型的情况下将类型分配给对象?

当用户点击保存按钮时,如何实现任务的更改?

JavaScript不重定向配置的PATH

搜索功能不是在分页的每一页上进行搜索

如果没有页面重新加载Angular ,innerHTML属性绑定不会更新

使用自动识别发出信号(&Q)

将Singleton实例设置为未定义后的Angular 变量引用持久性行为

输入数据覆盖JSON文件

如何将对象推送到firestore数组?

在使用JavaScript以HTML格式显示Google Drive中的图像时遇到问题

如何按区域进行过滤并将其从结果数组中删除?

Google OAuth 2.0库和跨域开放程序的问题-策略错误