用Unity3D實現太陽系模擬
阿新 • • 發佈:2019-01-09
用Unity3D模擬太陽系模擬
模擬要求
寫一個程式,實現一個完整的太陽系, 其他星球圍繞太陽的轉速必須不一樣,且不在一個法平面上。
操作步驟
1.建立如下結構 sun 裡包括8大行星, 並且設定好距離和大小
建立結構
建議用2D顯示來直觀設定距離
2.在網上找到相應貼圖 新增到assets
而且把對應行星的貼圖圖片拖到對應的球體上(給白色小球上色)得到下面結果
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);
//設定公轉的方向和速度 方向軸為(0, 1, 0) 速度為 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公轉 這樣就能解決問題了
檔案結構:
加入和更改下列程式碼
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物件裡 執行檢視結果