模拟太阳系

今天来模拟太阳系
我们知道,太阳系包括太阳,水星,金星,地球,火星,木星,土星,天王星,海王星。
为了模拟太阳系,首先我查找了一些相关参数
这里写图片描述

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

接下来我们就先建模,创建九个球,再网上下载相关纹理,拖入球体,得到九个实体(太阳肯定要搞大点)
由于对太阳系而言,太阳是静止的,所以我把太阳作为父类,其余的星球作为太阳的子类

这里写图片描述

(粉色的线是我用来绘制运行轨道的,后面会具体介绍)
下面我们编写脚本。我思考的是一个类中包含九个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,就会变成这样,超壮观的

这里写图片描述

若有疑问或者问题,请多多提出,感谢!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值