zoukankan      html  css  js  c++  java
  • 用Unity3D实现太阳系仿真

    用Unity3D模拟太阳系仿真

    模拟要求

    写一个程序,实现一个完整的太阳系, 其他星球围绕太阳的转速必须不一样,且不在一个法平面上。

    操作步骤

    1.创建如下结构 sun 里包括8大行星, 并且设置好距离和大小

    建立结构

    image

    建议用2D显示来直观设置距离

    image

    2.在网上找到相应贴图 添加到assets

    贴图网址

    image

    而且把对应行星的贴图图片拖到对应的球体上(给白色小球上色)得到下面结果

    image

    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);
            //设置公转的方向和速度  方向轴为(010) 速度为 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公转 这样就能解决问题了

    文件结构:

    image

    加入和更改下列代码

     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对象里 运行查看结果
    image

    6.相关心得

  • 相关阅读:
    Linux操作系统 (RHEL 7/CentOS 7)
    (OK) 运行cBPM in Fedora23
    (OK) 运行cBPM—Fedora23
    (OK) Install codeblocks_16.01 on Fedora23
    (OK) Fedora23——Docker——CORE—testing
    (OK) CORE nodes access Internet—虚拟节点访问互联网—commands
    (OK-half) Fedora23——Docker——CORE—testing
    (OK) running imunes in Fedora 23
    (OK-HALF) To Find a Rogue DHCP Server—tcpdump/dhclient—nmap
    (OK) shell script—Find a Rogue DHCP Server—tcpdump/dhclient—nmap
  • 原文地址:https://www.cnblogs.com/qq874455953/p/9589220.html
Copyright © 2011-2022 走看看