欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

做一个简单的太阳系(二)

程序员文章站 2022-07-13 11:03:49
...

前言

在前面一篇博客中制作了一个“简单”的太阳系之后,发现了很多的问题,例如:不会发光的太阳,然后所有的行星都一样大等等。。所以在这篇博客,我们尝试去解决部分的问题。

对象处理

首先,我们先制作一个会发光的太阳,然后我们发现,Unity里面有一个点灯光的灯光, 貌似能实现我们的需求,到底会有怎样的效果呢?我们先实验一下,灯光颜色当然是选择原谅色啦(笑)。实验结果如下:
做一个简单的太阳系(二)
我们发现一个问题,就是一个对象被挂上点灯光之后,它只能绿了他人,而却不能绿了自己,这是很明显不符合我们太阳的属性的,所以我们采用了官方推荐的Glow 11插件,这个插件。。原来是在官方插件商店里有下载的,结果。。它居然下架了。。没关系,我会在博客的下面提供。下载完之后,我们只需Import Package把它Import进去就行了。如下图:
做一个简单的太阳系(二)
然后我们在主摄像机里面挂上Glow 11的挂件,直接用Add Component添加即可。
做一个简单的太阳系(二)
再然后,我们新生成一个材料,Shader选Glow 11提供的样例就行。如下图:
做一个简单的太阳系(二)
然后把这个材料挂在Sun上,还要挂上一个点灯光(当然这里我们不能选原谅色啦(严肃))然后我们再看看效果如何:
做一个简单的太阳系(二)
感觉还不错,然后我们再帮所有的行星加上轨迹,使得界面变得更加的好看。加轨迹的方法也很简单,只要加上Effects里的Trailer Render就行啦。
做一个简单的太阳系(二)
再看看效果:
做一个简单的太阳系(二)
然后我们就实现了一个还不错的太阳系。

代码部分

由于之前的代码存在很多重复性的部分,然而这不符合我们程序员的审美,所以我就修改了修改了代码。
Controller.cs

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

public class Controller : MonoBehaviour, Director.ISceneController {

    // the first scripts
    void Awake() {
        Director director = Director.getInstance ();
        director.setFPS (60);
        director.currentSceneController = this;
        director.currentSceneController.LoadResources ();
    }

    Transform[] planet = new Transform[8];
    string[] planet_name = { "Mercury", "Venus", "Earth", "Mars", "Jupiter", "Saturn", "Uranus", "Neptune"};
    Vector3[] position = {
        new Vector3 (9, 0, 0),
        new Vector3 (17, 0, 0),
        new Vector3 (23, 0, 0),
        new Vector3 (36, 0, 0),
        new Vector3 (122, 0, 0),
        new Vector3 (224, 0, 0),
        new Vector3 (451, 0, 0),
        new Vector3 (705, 0, 0)
    };
    Vector3[] direction = {
        new Vector3 (0, Mathf.Tan(Mathf.PI/180*7), 1),
        new Vector3 (0, Mathf.Tan(Mathf.PI/180*3.4f), 1),
        new Vector3 (0, 0, 1),
        new Vector3 (0, Mathf.Tan(Mathf.PI/180*1.9f), 1),
        new Vector3 (0, Mathf.Tan(Mathf.PI/180*1.3f), 1),
        new Vector3 (0, Mathf.Tan(Mathf.PI/180*2.5f), 1),
        new Vector3 (0, Mathf.Tan(Mathf.PI/180*0.8f), 1),
        new Vector3 (0, Mathf.Tan(Mathf.PI/180*1.8f), 1),
    };
    float[] revoluntion_rate = { 4.091f, 1.602f, 0.986f, 0.524f, 0.083f, 0.033f, 0.012f, 0.006f };
    float[] rotation_rate = { 6.138f, -1.481f, 360.986f, 350.895f, 877.9f, 844.3f, -501.16f, 541.137f };
    Transform Sun;
    // Loading resources for first scence

    Transform produce(Vector3 position,string name_) {
        return Instantiate<Transform> (Resources.Load<Transform> ("prefabs/"+name_), position, Quaternion.identity);
    }

    public void LoadResources() {
        //named the sphere
        Sun = produce(Vector3.zero,"Sun");
        Sun.name = "Sun";
        for (int i = 0; i < 8; i++) {
            planet [i] = produce (position [i], planet_name [i]);
            planet [i].transform.parent = Sun.transform;
            planet [i].name = planet_name [i];
        }
    }

    void move(Transform p, Vector3 dir,float re_r, float ro_r) {
        p.RotateAround (Sun.position, dir, re_r * Time.deltaTime);
        p.Rotate (Vector3.up * ro_r * Time.deltaTime);      
    }

    void Update() {
        for (int i = 0; i < 8; i++) {
            move (planet [i], direction [i], revoluntion_rate [i], rotation_rate [i]);
        }
    }

}

是不是显得简练了很多,然后我也去修改了修改了参数,让这个太阳系更加的多样性,单位长度设为地球的半径(6378.1km),然后八大行星的半径根据这个半径修改了大小,然后修改了每个行星公转轨迹的倾角,还有公转周期也按照实际比例修改了,游戏中的1秒相当于1天,自转速度也改变了。至于太阳的大小还有公转轨迹半径,实在按比例改。。否则就见不到行星了(比例实在太大了)。
改后效果:
做一个简单的太阳系(二)
那个细细的曲线就是。。水星,金星,地球,火星的轨迹。。这还是把距离缩小了1000倍的样子,要是真的把真实比例写进去,真的是什么都看不到了,可想而知,我们太阳系的辽阔。

补充

下面列一下八大行星与太阳的有关信息吧。

星球 轨道倾角/° 半径/km 自转周期 公转周期 公转半径/km
太阳
水星 7 2440 58.65天 88天 57,910,000
金星 3.4 6,051.9 243天 224.7天 108,208,930
地球 0 6,378.1 23小时56分4秒 365.25天 149,600,000
火星 1.9 3398 24小时37分22秒 686.98天 227,940,000
木星 1.3 71,492 9小时50分30秒 11.86年 778,330,000
土星 2.5 60,268 10小时14分 29.5年 1,429,400,000
天王星 0.8 25,559 17时14分24秒 84.32年 2,870,990,000
海王星 1.8 24,788 15小时57分59秒 164.8年 4,504,000,000

做了一个太阳系,上了一次天文课(笑)
Glow11:https://pan.baidu.com/s/1kVJpYSZ
下次再尝试把银河的背景跟火星与木星的小行星带加入进去。让这个太阳系更像太阳系吧。