1. 程式人生 > >用Unity3D實現太陽系模擬

用Unity3D實現太陽系模擬

用Unity3D模擬太陽系模擬

模擬要求

寫一個程式,實現一個完整的太陽系, 其他星球圍繞太陽的轉速必須不一樣,且不在一個法平面上。

操作步驟

1.建立如下結構 sun 裡包括8大行星, 並且設定好距離和大小

建立結構

image

建議用2D顯示來直觀設定距離

image

2.在網上找到相應貼圖 新增到assets

貼圖網址

image

而且把對應行星的貼圖圖片拖到對應的球體上(給白色小球上色)得到下面結果

image

3.建立c#指令碼 使每個行星繞太陽轉

建立plantMove.cs檔案 程式碼如下

using System.Collections;
using System.Collections
.Generic; using UnityEngine; public class plantMove : MonoBehaviour { // Use this for initialization void Start() { } // Update is called once per frame void Update() { GameObject.Find("Sun").transform.Rotate(Vector3.up * Time.deltaTime * 5 ); GameObject.Find
("Mercury").transform.RotateAround(Vector3.zero, new Vector3(0.1f, 1, 0), 60 * Time.deltaTime); //設定公轉的方向和速度 方向軸為(010) 速度為 60 GameObject.Find("Mercury").transform.Rotate(Vector3.up * Time.deltaTime * 10000 / 58); //設定自轉 自轉速度為10000/58 58是水星的自傳週期 倒數就是時間 下同 GameObject.Find("Venus"
).transform.RotateAround(Vector3.zero, new Vector3(0, 1, -0.1f), 55 * Time.deltaTime); GameObject.Find("Venus").transform.Rotate(Vector3.up * Time.deltaTime * 10000 / 243); GameObject.Find("Earth").transform.RotateAround(Vector3.zero, new Vector3(0, 1, 0), 50 * Time.deltaTime); GameObject.Find("Earth").transform.Rotate(Vector3.up * Time.deltaTime * 10000); GameObject.Find("Moon").transform.RotateAround(Vector3.zero, new Vector3(0, 1, 0), 5 * Time.deltaTime); GameObject.Find("Moon").transform.Rotate(Vector3.up * Time.deltaTime * 10000/27); GameObject.Find("Mars").transform.RotateAround(Vector3.zero, new Vector3(0.2f, 1, 0), 45 * Time.deltaTime); GameObject.Find("Mars").transform.Rotate(Vector3.up * Time.deltaTime * 10000); GameObject.Find("Jupiter").transform.RotateAround(Vector3.zero, new Vector3(-0.1f, 2, 0), 35 * Time.deltaTime); GameObject.Find("Jupiter").transform.Rotate(Vector3.up * Time.deltaTime * 10000 / 0.3f); GameObject.Find("Saturn").transform.RotateAround(Vector3.zero, new Vector3(0, 1, 0.2f), 20 * Time.deltaTime); GameObject.Find("Saturn").transform.Rotate(Vector3.up * Time.deltaTime * 10000 / 0.4f); GameObject.Find("Uranus").transform.RotateAround(Vector3.zero, new Vector3(0, 2, 0.1f), 15 * Time.deltaTime); GameObject.Find("Uranus").transform.Rotate(Vector3.up * Time.deltaTime * 10000 / 0.6f); GameObject.Find("Neptune").transform.RotateAround(Vector3.zero, new Vector3(-0.1f, 1, -0.1f), 10 * Time.deltaTime); GameObject.Find("Neptune").transform.Rotate(Vector3.up * Time.deltaTime * 10000 / 0.7f); } }

程式碼解釋:

我們通過GameObject.Find(“value”)來找到各個球體 然後通過呼叫RotateAround()設定公轉,通過呼叫Rotate()方法設定自轉

4. 進一步思考

執行下發現月球繞地球旋轉不對勁, 其原因是地球的自轉影響了月球的公轉, 月球是相對一個自轉的地球來的 月球公轉疊加了地球自轉。

所以怎麼去處理這個問題呢? 怎麼讓月球公轉和地球自轉不相關呢?

這裡有一個解決方案

在原來的Sun裡再加入一個物件名為EarthClone,而且大小和位置都和地球相同, 然後我對EarthClone設定和Earth一樣的公轉 但是不設定自轉 把Moon放到EarthClone裡讓Moon相對與EarthClone公轉 這樣就能解決問題了

檔案結構:

image

加入和更改下列程式碼

 void Update()
    {

        GameObject.Find("Sun").transform.Rotate(Vector3.up * Time.deltaTime * 5 );

        GameObject.Find("Mercury").transform.RotateAround(Vector3.zero, new Vector3(0.1f, 1, 0), 60 * Time.deltaTime);
        GameObject.Find("Mercury").transform.Rotate(Vector3.up * Time.deltaTime * 1 / 58);

        GameObject.Find("Venus").transform.RotateAround(Vector3.zero, new Vector3(0, 1, -0.1f), 55 * Time.deltaTime);
        GameObject.Find("Venus").transform.Rotate(Vector3.up * Time.deltaTime * 10 / 243);

        GameObject.Find("Earth").transform.RotateAround(Vector3.zero, new Vector3(0, 1, 0), 50 * Time.deltaTime);
        GameObject.Find("Earth").transform.Rotate(Vector3.up * Time.deltaTime * 10);
        //只設置公轉 不設定自傳
        GameObject.Find("EarthClone").transform.RotateAround(Vector3.zero, new Vector3(0, 1, 0), 50 * Time.deltaTime);
        //令Moon相對與不自轉的EarthClone公轉
        GameObject.Find("Moon").transform.RotateAround(GameObject.Find("EarthClone").transform.position, new Vector3(0, 1, 0), 250 * Time.deltaTime);
        GameObject.Find("Moon").transform.Rotate(Vector3.up * Time.deltaTime * 10/27);

        GameObject.Find("Mars").transform.RotateAround(Vector3.zero, new Vector3(0.2f, 1, 0), 45 * Time.deltaTime);
        GameObject.Find("Mars").transform.Rotate(Vector3.up * Time.deltaTime * 10);

        GameObject.Find("Jupiter").transform.RotateAround(Vector3.zero, new Vector3(-0.1f, 2, 0), 35 * Time.deltaTime);
        GameObject.Find("Jupiter").transform.Rotate(Vector3.up * Time.deltaTime * 10 / 0.3f);

        GameObject.Find("Saturn").transform.RotateAround(Vector3.zero, new Vector3(0, 1, 0.2f), 20 * Time.deltaTime);
        GameObject.Find("Saturn").transform.Rotate(Vector3.up * Time.deltaTime * 10 / 0.4f);

        GameObject.Find("Uranus").transform.RotateAround(Vector3.zero, new Vector3(0, 2, 0.1f), 15 * Time.deltaTime);
        GameObject.Find("Uranus").transform.Rotate(Vector3.up * Time.deltaTime * 10 / 0.6f);

        GameObject.Find("Neptune").transform.RotateAround(Vector3.zero, new Vector3(-0.1f, 1, -0.1f), 10 * Time.deltaTime);
        GameObject.Find("Neptune").transform.Rotate(Vector3.up * Time.deltaTime * 10 / 0.7f);

    }

5.結果顯示

把cs指令碼拖到Sun物件裡 執行檢視結果
image

6.相關心得