2014-01-14 85 views
1

我試圖讓3D太陽系所以首先我創建了太陽和地球與THREE.SphereGeometry()旋轉地球圍繞太陽

var sphere2 = new THREE.Mesh(new THREE.SphereGeometry(50, 100, 100), 
new THREE.MeshBasicMaterial({side: THREE.DoubleSide, map:txt2})); 
sphere2.position.set(100,5,30); 

sphere2是地球,我想圍繞太陽旋轉,在我render()我加

sphere2.position.x -= 1; 
    sphere2.position.normalize(); 
    sphere2.position.multiplyScalar(200); 

我想我只需要編輯x軸的位置,對吧?但是,從我所看到的情況來看,這只是旋轉了一半。我顯然需要在某個時間之後停止減法並增加x的位置,但這隻會讓地球倒退,它不會落在太陽後面,它總是形成一個半圈並停止,最後x位置的值爲「 -200「我期待找到它」-100「但不知道爲什麼。我也想給地球23.5度的軸向傾斜,我嘗試了quaternion = new THREE.Quaternion().setFromAxisAngle(axisOfRotation, angleOfRotation);,但沒有奏效。我會很高興,如果你能給我的手!

+1

_「我想我只需要編輯x軸的位置,對吧?」_我認爲這不會起作用。在某一點上,地球的位置將位於x軸的上方,此時減去1,歸一化完全不會改變其位置。你應該考慮制定一個不同的策略。 – Kevin

回答

3

要做的最簡單的(雖然不科學的)事情會使用Math.cos/sin與更新角度值配對。事情是這樣的幀更新:

earthOrbitAngle += earthOrbitSpeed; //advance angle in degrees 
var orbitAngleInRadians = earthOrbitAngle * Math.PI/180; //convert to radians 

//update position of earth... 
earth.position.x = Math.cos(orbitAngleInRadians) * earthOrbitRadius; 
earth.position.z = Math.sin(orbitAngleInRadians) * earthOrbitRadius; 

你可以拉長無論是X或Z值,使橢圓軌道由一些因素相乘earthOrbitRadius。

你可以通過設置它的rotation.z來傾斜地球。然而,如果你想擁有月球並繞着傾斜軸進行軌道運動,那麼最簡單的方法就是創建一個空的Object3D容器來容納這兩個容器,月球運行自己的軌道腳本。然後,您在太陽周圍製作該容器的動畫。因此,設立會是這個樣子:

theSun = new THREE.Mesh(new THREE.SphereGeometry(30, 16, 15), new THREE.MeshBasicMaterial({ 
    color: 'yellow' 
})); 
scene.add(theSun); 

theEarthAndMoon = new THREE.Object3D(); 
theEarthAndMoon.rotation.z = 23.439281 * Math.PI/180; //tilt of earth in radians; 
scene.add(theEarthAndMoon); 

theEarth = new THREE.Mesh(new THREE.SphereGeometry(5, 16, 15), new THREE.MeshLambertMaterial({ 
    color:"blue" 
})); 

theEarthAndMoon.add(theEarth); 

theMoon = new THREE.Mesh(new THREE.SphereGeometry(1, 16, 15), new THREE.MeshLambertMaterial({ 
    color:"white" 
})); 

theEarthAndMoon.add(theMoon); 

和畫面更新:

//run the earth's orbit around the Sun 
earthOrbitAngle += earthOrbitSpeed; 
var radians = earthOrbitAngle * Math.PI/180; 

theEarthAndMoon.position.x = Math.cos(radians) * earthOrbitRadius; 
theEarthAndMoon.position.z = Math.sin(radians) * earthOrbitRadius; 

//run the Moon's orbit around the Earth 
moonOrbitAngle += moonOrbitSpeed; 
var moonRadians = moonOrbitAngle * Math.PI/180; 

theMoon.position.x = Math.cos(moonRadians) * moonOrbitRadius; 
theMoon.position.z = Math.sin(moonRadians) * moonOrbitRadius; 

你可以看到它運行在這裏:現在Simple Sun, Earth, and Moon at JSFiddle

,如果你想深入沿着準確的軌道力學的兔子洞,我建議先看看這個令人難以置信的所有行星和600,000個小行星的Three.js模擬的引擎蓋:Asterank project

+0

親愛的馬修我非常感謝你付出了很多努力並給出了正確的解決方案,我希望你之前出現了一點:)但是我很高興你開始回答問題並選擇我的問題作爲第一:)我發現同樣的答案與大量的谷歌搜索,從一個工作的太陽系複製:'earth.position.set(200 * Math.cos(e_angleEARTH),200 * Math.sin(e_angleEARTH),0);'這是我提出的解決方案與同一件事sin/cos。接下來要讓我的3D太陽系更加逼真,我想讓你給他們的例子的軌道「橢圓形」也是圓形的。任何提示? – Anarkie

+2

謝謝@Anarkie,這是我的榮幸。至於你跟進的問題,修改上面的例子,你可以通過修改一個修改器來延長一個軸: 'var elongatedFactor = 1.5; theEarthAndMoon.position.x = Math.cos(弧度)* earthOrbitRadius * elongFactor; theEarthAndMoon.position.z = Math.sin(弧度)* earthOrbitRadius;' 這將使得在x軸上行進的距離是z軸的1.5倍。 –