以不同的速度在几个轨道上旋转行星

时间:2014-02-19 22:20:39

标签: javascript canvas rotation three.js

我正在使用Three.js编写一个简单的太阳系。这时我增加了3个行星,每个行星都在其轴上旋转。在中间我加了太阳。

  • 对于每个星球,我创建了一个不同的组(mesh);
  • 所有行星都在一个主要群体中(Object3D);

我可以:

  • 在其轴上旋转每个行星(使用行星物体/组);
  • 旋转他们轨道上的每个行星(使用主要对象/组)。

问题在于,当我在例如1的主要组中进行旋转时,每个行星都会移动1.例如:

enter image description here

如果我将行星旋转180度,每个行星在其轨道上旋转180度。那么我怎样才能以不同的速度旋转每个行星呢?

我认为不需要主要组,我必须编写一个算法并将其用于每个星球,但我不知道算法是如何工作的。有人可以帮帮我吗?

代码的重要部分:

...主循环:

function loop() {
    jQuery.each(planets, function( key, value ) {
        value.rotation.y += 0.005;
        value.rotation.x += 0.005;
    });

    group.rotation.z -= 0.005;

    requestAnimationFrame( loop );
}

...添加一颗行星:

var data = {
    0: {
        texture:  "images/telos.png",
        radius:   10,
        segments: 20
    },
    1: {
        texture:  "images/ako.png",
        radius:   8,
        segments: 20
    },
    2: {
        texture:  "images/alba.png",
        radius:   21,
        segments: 20
    }
};
var planets = {}
jQuery.each(data, function( key, value ) {
    var planet = creator.planet({
        texture:  value.texture,
        radius:   value.radius,
        segments: value.segments
    });
    planet.position.set( key * 60, 0, 0 );
    planets[ key ] = planet;

    group.add( planets[ key ] );
});

任何提示?

1 个答案:

答案 0 :(得分:0)

这一行:

value.rotation.y += 0.005;

是关键。在这里你可以按照每个'tick'旋转所有行星相同的角度。你想要不同的速度,每个星球需要保持不同的速度值,所以首先:

var planet = creator.planet({
    texture:  value.texture,
    radius:   value.radius,
    segments: value.segments,
    speed:    value.speed
});

然后您需要访问该值:

value.rotation.y += value.speed;

然后确保在创建行星时发送速度值。

如果您想要实际的速度值,可以使用Kepler's laws of planetary motion从半径计算它们。比率是平方反比,所以你可以这样做:

var planet = creator.planet({
    texture:  value.texture,
    radius:   value.radius,
    segments: value.segments,
    speed:    1/(value.radius*value.radius) * 100 //change 100 to taste
});