您的位置:首页 > 其它

模拟太阳系

2017-03-11 02:12 183 查看
今天来模拟太阳系

我们知道,太阳系包括太阳,水星,金星,地球,火星,木星,土星,天王星,海王星。

为了模拟太阳系,首先我查找了一些相关参数



因为只是简单模拟,所以我只是依据它们的周期比例简单的为它们的旋转速度赋了值。

接下来我们就先建模,创建九个球,再网上下载相关纹理,拖入球体,得到九个实体(太阳肯定要搞大点)

由于对太阳系而言,太阳是静止的,所以我把太阳作为父类,其余的星球作为太阳的子类



(粉色的线是我用来绘制运行轨道的,后面会具体介绍)

下面我们编写脚本。我思考的是一个类中包含九个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,就会变成这样,超壮观的



若有疑问或者问题,请多多提出,感谢!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: