我正在寻找一种绕月球绕太阳公转的方法。

(所有这些都是three.js中的3d对象)

我已经定义了所有对象,目前地球围绕我的太阳旋转,但是我很难让月亮围绕已经旋转的地球旋转。

sun = models['sun'];
earth = models['earth'];
moon = models['moon'];

let suns = new THREE.Group();
suns.add(sun);

let planets = new THREE.Group();
planets.add(earth);

let moons = new THREE.Group();
moons.add(moon);

scene.add(sun);
scene.add(earth);
scene.add(moon);

var orbit = 3;
var date = Date.now() * 0.0005;

earth.position.set(Math.cos(date) * orbit, 0, Math.sin(date) * orbit);

earth.rotation.y += 0.01*animation_speed;
moon.rotation.y += 0.01*animation_speed;


预期:地球绕太阳旋转(静止),而月亮绕地球旋转,因为它绕太阳旋转。

当前:地球围绕太阳旋转。不确定如何处理月亮...

最佳答案

如果您对对象进行分层,那样会很容易,这样它们就可以围绕其父对象旋转。

首先请注意,您的小组毫无意义。如果您呼叫suns.add(sun),然后再呼叫scene.add(sun),则第二个呼叫将从sun中删除​​suns并将其添加到scene,因此您的组为空。因此,在以下示例中,我将不使用组。

F.e.

const sun = models['sun'];
const earth = models['earth'];
const moon = models['moon'];

const sunContainer = new THREE.Object3D
sunContainer.add(sun)
const earthContainer = new THREE.Object3D
earthContainer.add(earth)
const moonContainer = new THREE.Object3D
moonContainer.add(moon)

scene.add(sunContainer); // sunContainer is child of scene
sunContainer.add(earthContainer); // earthContainer is child of sunContainer
earthContainer.add(moonContainer); // moonContainer is child of earthContainer

var earthOrbitRadius = 3;
var moonOrbitRadius = 0.2;

// position them at their orbit radius (relative to their parents)
earthContainer.position.set(earthOrbitRadius, 0, 0);
moonContainer.position.set(moonOrbitRadius, 0, 0);

// each planet rotates around its poles
sun.rotation.y += 1*animation_speed;
earth.rotation.y += 1*animation_speed;
moon.rotation.y += 1*animation_speed;

// and each planet orbits around its parent
sunContainer.rotation.y += 0.1*animation_speed;
earthContainer.rotation.y += 0.1*animation_speed;


现在,将这些位恢复到您的代码中,根据需要调整数字,它的工作原理与所需类似。

还有其他方法可以做到,这只是一种方法。要使行星旋转独立于轨道旋转,可以将行星旋转调整为负轨道旋转。或者,您可以使容器旋转,然后将太阳,地球和月亮直接添加到场景而不是容器中,然后将容器位置复制到它们,同时它们独立旋转。或者,您可以使用物理引擎(Three.js中内置“子弹物理”)。或者您使用pivot points

顺便说一句,如果您发布工作代码,它将有所帮助。 :)

关于javascript - 我正在尝试将(THREE.mesh)3d对象围绕已经在轴上旋转的另一个对象旋转。有指针吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55552889/

10-09 18:25
查看更多