模擬太陽系

今天來模擬太陽系
我們知道,太陽系包括太陽,水星,金星,地球,火星,木星,土星,天王星,海王星。
爲了模擬太陽系,首先我查找了一些相關參數
這裏寫圖片描述

因爲只是簡單模擬,所以我只是依據它們的週期比例簡單的爲它們的旋轉速度賦了值。

接下來我們就先建模,創建九個球,再網上下載相關紋理,拖入球體,得到九個實體(太陽肯定要搞大點)
由於對太陽系而言,太陽是靜止的,所以我把太陽作爲父類,其餘的星球作爲太陽的子類

這裏寫圖片描述

(粉色的線是我用來繪製運行軌道的,後面會具體介紹)
下面我們編寫腳本。我思考的是一個類中包含九個Transform對象,依次對應這九個星球。由於模擬太陽系一直都是在運動的,不需要任何觸發,所以在Start函數中初始化每個星球的位置就好,而除了太陽是相對靜止的,其他的星球都是圍繞太陽旋轉(公轉),以及自轉。公轉我們可以用RotateAround方法,而自轉可以用Rotate。但是需要注意,公轉需要在不同的軌道上,要求必須在不同的法平面上,在初始化時,我把九個星球都放置在了y=0,z=0的平面上,因此要想做到真正的公轉,必須旋轉角度向量與oyz面垂直

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class RoundSun : MonoBehaviour {
    public Transform 太陽;
    public Transform 水星;
    public Transform 金星;
    public Transform 地球;
    public Transform 火星;
    public Transform 木星;
    public Transform 土星;
    public Transform 天王星;
    public Transform 海王星;
    float[] v1 = new float[8];
    float[] v2 = new float[8];

    // Use this for initialization
    void Start () {
        太陽.position = Vector3.zero;
        水星.position = new Vector3(4, 0, 0);
        金星.position = new Vector3(6, 0, 0);
        地球.position = new Vector3(8, 0, 0);
        火星.position = new Vector3(10, 0, 0);
        木星.position = new Vector3(12, 0, 0);
        土星.position = new Vector3(14, 0, 0);
        天王星.position = new Vector3(16, 0, 0);
        海王星.position = new Vector3(18, 0, 0);
        for (int i = 0; i < 8; i++)
        {
            v1[i] = Random.Range(1, 360);
            v2[i] = Random.Range(1, 360);
        }

    }

    // Update is called once per frame
    void Update () {
        // 水星
        水星.RotateAround(太陽.position, new Vector3(0, v1[0], v2[0]), 10 * Time.deltaTime);
        水星.Rotate(Vector3.up * 300 * Time.deltaTime);

        // 金星
        金星.RotateAround(太陽.position, new Vector3(0, v1[1], v2[1]), 15 * Time.deltaTime);
        金星.Rotate(Vector3.up * 900 * Time.deltaTime);

        // 地球
        地球.RotateAround(太陽.position, new Vector3(0, v1[2], v2[2]), 20 * Time.deltaTime);
        地球.Rotate(Vector3.up * 30 * Time.deltaTime);

        // 火星
        火星.RotateAround(太陽.position, new Vector3(0, v1[3], v2[3]), 40 * Time.deltaTime);
        火星.Rotate(Vector3.up * 30 * Time.deltaTime);

        // 木星
        木星.RotateAround(太陽.position, new Vector3(0, v1[4], v2[4]), 50 * Time.deltaTime);
        木星.Rotate(Vector3.up * 15 * Time.deltaTime);

        // 土星
        土星.RotateAround(太陽.position, new Vector3(0, v1[5], v2[5]), 60 * Time.deltaTime);
        土星.Rotate(Vector3.up * 15 * Time.deltaTime);

        // 天王星
        天王星.RotateAround(太陽.position, new Vector3(0, v1[6], v2[6]), 65 * Time.deltaTime);
        天王星.Rotate(Vector3.up * 15 * Time.deltaTime);

        // 海王星
        海王星.RotateAround(太陽.position, new Vector3(0, v1[7], v2[7]), 70 * Time.deltaTime);
        海王星.Rotate(Vector3.up * 15 * Time.deltaTime);
    }
}

由於所有行星不可能都在同一軌道公轉,而我又不可能知道它們的軌道是什麼樣的,所以就用隨機數Random來模擬

將該腳本掛載到太陽上,並把相應參數拖入,運行,即可看到玄幻的太陽系模擬!

這裏寫圖片描述

可能有些人會問了,3D視角,我怎麼看得出這個太陽系是否真的沿軌道旋轉呢,萬一有些偏離了呢。這裏我們可以繪製軌道,我上網查了一些,發現拖尾效果最好,但是那種奇妙的特效我還做不出來…..所以就用簡單的線條繪製。
首先選中一個星球,點擊菜單欄Component->Effects->Trail Renderer會出現該屬性

這裏寫圖片描述

修改Width = 0.2(這樣細一點好看)和Time=100(線條消失時間,越長越好,才能做到不會消失的假象)。
所有設置好後,再次Run,就會變成這樣,超壯觀的

這裏寫圖片描述

若有疑問或者問題,請多多提出,感謝!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章