用Unity3D实现太阳系仿真

用Unity3D模拟太阳系仿真

模拟要求

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

操作步骤

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

建立结构

image

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

在这里插入图片描述

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

贴图网址
网址失效 素材更新链接如下
链接: https://pan.baidu.com/s/1w0xSMt_0HgBLbVhco9b6GA 提取码: ead5

在这里插入图片描述
而且把对应行星的贴图图片拖到对应的球体上(给白色小球上色)得到下面结果

在这里插入图片描述

3.创建c#脚本 使每个行星绕太阳转

创建plantMove.cs文件 代码如下

把此脚本拖到sun 物体即可,代码就是在sun 里面找到各个行星,并且设置运动

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对象里 运行查看结果
在这里插入图片描述

  • 23
    点赞
  • 93
    收藏
    觉得还不错? 一键收藏
  • 26
    评论
Unity3D 智驾仿真是一种利用Unity3D游戏引擎开发的虚拟仿真系统,用于模拟和测试自动驾驶车辆的行为和性能。它基于计算机视觉、机器学习等技术,能够模拟真实世界中的道路、交通环境和车辆行为。 通过Unity3D 智驾仿真,我们可以创建虚拟的驾驶场景,如城市道路、高速公路等,并在其中放置各种类型的车辆,包括自动驾驶车辆和其他交通参与者。我们可以设定各种驾驶行为,如车辆的速度、转向、超车、避障等,并观察车辆在虚拟环境中的行为。 由于Unity3D具有强大的图形渲染和物理引擎,因此在智驾仿真中,我们能够实时模拟车辆的运动、碰撞和车辆之间的交互。我们可以通过录制和回放的方式收集数据并进行分析,从而评估自动驾驶车辆的行为和性能。 Unity3D智驾仿真有以下几个优势。首先,它具有良好的容错性,可以模拟各种可能的驾驶情况和意外情况,为自动驾驶系统提供全面的测试。其次,通过虚拟仿真,可以大大降低测试的成本和风险,避免真实道路上的潜在危险。此外,我们还可以根据实际需求随时调整场景和车辆类型,进行各种相应的测试。 总而言之,Unity3D智驾仿真是一种强大的工具,可用于模拟和评估自动驾驶车辆的行为和性能。它能够为自动驾驶技术的研发和测试提供有效的支持,并为未来交通系统的发展做出贡献。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值