2014-02-19 27 views
0

我正在用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 ]); 
}); 

任何提示嗎?

+0

你能用行星的信息CONSOLE.LOG你'data'變量 – Vikram

+0

這只是一個對象。我編輯了主要信息。 – guest459473

回答

0

這條線:

value.rotation.y += 0.005; 

是關鍵。這裏是每個「滴答」以相同的角度旋轉所有行星的地方。是你想要的速度不同,每個行星需要持有不同的速度值,所以首先:

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 
}); 
+0

我已經試過了。問題在於它會使行星在自己的軸上旋轉,而不是在自己的軌道上。 – guest459473

+0

@ guest459473 - 你有沒有想過這個?我開始研究動畫,我也遇到過這個問題。所有物品的軌道速度相同,但距中央(太陽)的半徑不同。 – Casey