Unity实现简易太阳系

news2024/12/26 22:20:40

开发环境:Unity 2022.3.5f1c1 + Visual Studio 2022
太阳系相关星体:太阳、八大行星、月球
模拟星系:太阳系、地月系
功能:支持行星以太阳为中心,任意轴进行公转,此处演示同一平面。
a1-a8为公转轴,可以任意修改,InitStarPosition()将会修正星体初始位置;MoveAroundSun脚本挂在SolarSystemGroup对象上(空对象)。
动态演示效果

静态展示图片
在这里插入图片描述

核心代码

using UnityEngine;

public class MoveAroundSun : MonoBehaviour
{
    // 星体
    public Transform Sun;
    public Transform Mercury;
    public Transform Venus;
    public Transform Earth;
    public Transform Moon;
    public Transform Mars;
    public Transform Jupiter;
    public Transform Saturn;
    public Transform Uranus;
    public Transform Neptune;

    // 公转轴:Mercury至Neptune八大行星
    Vector3 a1 = new Vector3(0, 1, 0);
    Vector3 a2 = new Vector3(0, 1, 0);
    Vector3 a3 = new Vector3(0, 1, 0);
    Vector3 a4 = new Vector3(0, 1, 0);
    Vector3 a5 = new Vector3(0, 1, 0);
    Vector3 a6 = new Vector3(0, 1, 0);
    Vector3 a7 = new Vector3(0, 1, 0);
    Vector3 a8 = new Vector3(0, 1, 0);

    /// <summary>
    /// 初始化行星位置,使Star位于以Center为中心,rotateAxis为公转轴的法平面上
    /// </summary>
    /// <param name="center">公转中心</param>
    /// <param name="star">公转行星</param>
    /// <param name="rotateAxis">公转轴</param>
    void InitStarPosition(Vector3 center, Transform star, Vector3 rotateAxis)
    {
        // 中心点指向行星的方向向量
        Vector3 centerToStar = star.position - center;
        // 通过方向向量和公转轴向量的叉乘,得到这两个向量所在平面的法向量
        Vector3 normal = Vector3.Cross(rotateAxis, centerToStar);
        // 计算方向向量和公转轴向量的角度
        float angle = Vector3.Angle(rotateAxis, centerToStar);
        // 计算方向向量转动到法向量的角度(转动到法平面上的角度)
        float rotateAngle = Mathf.Abs(90 - angle);
        // 以太阳为中心,法向量为转轴来转动角度
        star.RotateAround(center, normal, rotateAngle);
    }

    // Start is called before the first frame update
    void Start()
    {
        // 为了让任意位置的星体都可以绕任意轴旋转,需要在初始时刻定位星体位置(只挂载一个脚本,所以有重复代码)
        InitStarPosition(Sun.position, Mercury, a1);
        InitStarPosition(Sun.position, Venus, a2);
        InitStarPosition(Sun.position, Earth, a3);
        InitStarPosition(Sun.position, Mars, a4);
        InitStarPosition(Sun.position, Jupiter, a5);
        InitStarPosition(Sun.position, Saturn, a6);
        InitStarPosition(Sun.position, Uranus, a7);
        InitStarPosition(Sun.position, Neptune, a8);
        InitStarPosition(Earth.position, Moon, Earth.transform.up);
    }
    // Update is called once per frame
    void Update()
    {
        Mercury.RotateAround(Sun.position, a1, 20 * Time.deltaTime);
        Mercury.Rotate(Vector3.up * 50 * Time.deltaTime);

        Venus.RotateAround(Sun.position, a2, 10 * Time.deltaTime);
        Venus.Rotate(Vector3.up * 30 * Time.deltaTime);

        Earth.RotateAround(Sun.position, a3, 10 * Time.deltaTime);
        Earth.Rotate(Vector3.up * 30 * Time.deltaTime);
        Moon.transform.RotateAround(Earth.position, Vector3.up, 359 * Time.deltaTime);

        Mars.RotateAround(Sun.position, a4, 8 * Time.deltaTime);
        Mars.Rotate(Vector3.up * 30 * Time.deltaTime);

        Jupiter.RotateAround(Sun.position, a5, 7 * Time.deltaTime);
        Jupiter.Rotate(Vector3.up * 30 * Time.deltaTime);

        Saturn.RotateAround(Sun.position, a6, 6 * Time.deltaTime);
        Saturn.Rotate(Vector3.up * 30 * Time.deltaTime);

        Uranus.RotateAround(Sun.position, a7, 5 * Time.deltaTime);
        Uranus.Rotate(Vector3.up * 30 * Time.deltaTime);

        Neptune.RotateAround(Sun.position, a8, 4 * Time.deltaTime);
        Neptune.Rotate(Vector3.up * 30 * Time.deltaTime);
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1021920.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

需要每日温习的java八股文基础

一、java &#xff08;1&#xff09;集合 1.list&#xff1a;LinkedList、ArrayList和Vector ArrayList、LinkedList和Vector的区别&#xff0c;场景和扩容机制源码 LinkedList 接口实现类&#xff0c; 链表&#xff0c; 插入删除&#xff0c; 没有同步&#xff0c; 线程不…

网站降权的康复办法(详解百度SEO数据分析)

随着搜索引擎算法的不断升级&#xff0c;很多网站在SEO优化过程中遭遇到降权的情况。如果您的网站也遭遇到了类似的问题&#xff0c;不必惊慌失措。本文将为您详细介绍网站降权恢复的方法&#xff0c;包括百度SEO数据分析、网站收录少的5个原因、网站被降权的6个因素以及百度SE…

什么是顶点颜色

在3D模型的渲染中&#xff0c;除了贴图属性外&#xff0c;顶点颜色也是一种常见的材质属性。顶点颜色是指通过给模型的顶点分配颜色值来定义模型表面的颜色。 顶点颜色通常以顶点数据的形式储存&#xff0c;并且与每个顶点的位置信息相对应。在渲染过程中&#xff0c;顶点颜色会…

【性能测试】JMeter:集合点,同步定时器的应用实例!

一、集合点的定义 在性能测试过程中&#xff0c;为了真实模拟多个用户同时进行操作以度量服务器的处理能力&#xff0c;可以考虑同步虚拟用户以便恰好在同一时刻执行操作或发送请求。 通过插入集合点可以较真实模拟多个用户并发操作。 (注意&#xff1a;虽然通过加入集合点可…

pdf在线加密怎么做?几个好用的方法分享

PDF在线加密怎么做&#xff1f;在进行PDF在线加密时&#xff0c;您可以使用以下几种方法来确保文档的安全性&#xff0c;并注意以下一些加密的注意事项。 方法一&#xff1a;使用PDF转换加密工具 首先我们可以在电脑上打开迅捷PDF转换器工具&#xff0c;进入该转换工具后先在顶…

Vue系列(二)之 基础语法【上篇】

目录 一. 插值 1.1 文本 1.2 原始HTML 1.3 属性 1.4 表达式 二. 指令 2.1 v-if/v-else-if/v-else指令 2.2 v-show指令 2.3 v-for指令 2.4 下拉框/复选框 2.5 动态参数 三. 过滤器 3.1 局部过滤器基本应用 3.2 局部过滤器串行使用 3.3 局部过滤器传参 3.4 全局过…

无涯教程-JavaScript - LCM函数

描述 LCM函数返回整数的最小公倍数。最小公倍数是最小的正整数,它是所有整数参数number1,number2等的倍数。使用LCM添加具有不同分母的分数。 语法 LCM (number1, [number2] ...)争论 Argument描述Required/OptionalNumber1, number2... 您想要最小公倍数的1到255个值。 如…

【JDK 8-函数式编程】4.2 BiFunction

一、BiFunction 二、改造上节课&#xff1a;四则运算 一、BiFunction Function 只能接收一个参数&#xff0c;要传递两个参数,则用 BiFunction 两个参数&#xff1a;可以是两种不同数据类型 调用方法: R apply(T t, U u); import java.util.Objects;/*** param <T>…

无涯教程-JavaScript - GCD函数

描述 GCD函数返回两个或多个整数的最大公约数。最大公约数是将number1和number2均除而无余数的最大整数。 语法 GCD (number1, [number2] ...)争论 Argument描述Required/OptionalNumber11 to 255 values. If any value is not an integer, it is truncated.Requirednumber…

颠覆传统!老子云支持70+三维格式转换,在线即可一键处理!

老子云自研AMRT展示框架及三维格式具有广泛兼容性&#xff0c;同时还会用户提供了3D格式在线转换工具&#xff0c;支持实现70三维格式模型的快速处理和转换。 你是不是也遇到过这种情况&#xff1a;做了半天的3D模型图&#xff0c;好不容易弄好了&#xff0c;到最后插入的时候居…

win11 腾讯会议提示未检测到可用麦克风

平时都用的耳机&#xff0c;今天直接用笔记本的音频进行会议&#xff0c;发现提示&#xff1a;显示未检测到可用麦克风&#xff0c;请插入设备重试&#xff1b;很奇怪的设置了腾讯会议的音频和电脑的&#xff0c;发现电脑的显示无可用的音频输入设备&#xff0c;折腾一番&#…

PYTHON第一次

1. 输入三个整数&#xff0c;按降序输出 a int(input("请输入第一个整数&#xff1a;")) b int(input("请输入第二个整数&#xff1a;")) c int(input("请输入第三个整数&#xff1a;"))nums [a, b, c] nums.sort(reverseTrue)print("…

mysql某批量更新导致死锁

#查询当前数据库全部线程show full processlist #查询当前运行的全部事务select * from information_schema.innodb_trx#查询锁情况select * from information_schema.innodb_locks#查询锁等待情况select * from information_schema.innodb_lock_waits #查看mysql设置等待锁时长…

《golang设计模式》第二部分·结构型模式-06-享元模式(Flyweight)

文章目录 1. 概述1.1角色1.2 类图 2. 代码示例2.1 设计2.2 代码2.3 类图示例 1. 概述 享元&#xff08;Flyweight&#xff09;模式采用共享方式向客户端提供数量庞大的细粒度对象。 所谓细粒度对象&#xff0c;是指实现了业务细节并相互独立的对象。细粒度对象是一种相对概念&…

2023年中秋·国庆节放假通知

放假期间如有业务、技术及其他相关需求&#xff0c;欢迎新老客户前来咨询&#xff01;放假期间如给您带来不便敬请谅解! 注意事项 1、放假离开公司前须全面清扫所属办公区域的卫生&#xff0c;收拾好桌面、保管好个人办公物品&#xff1b; 2、关闭个人电脑等办公设备的电源&a…

MySQL DDL操作触发Metadata Lock等待,怎么办?5个高效应对策略解析!

大家好&#xff0c;我是小米&#xff0c;一个热衷于技术分享的程序员。上周三&#xff0c;有一位童鞋在 QQ 群里向我请教了一个关于“alter table 触发metadata lock一直等待”的问题&#xff0c;在今天的文章中&#xff0c;我将与大家分享一些关于MySQL数据库DDL操作中触发Met…

再获认可丨聚焦云计算标准和应用大会,畅谈边缘AI的探索实践

2023年9月13日&#xff0c;中国电子技术标准化研究院主办的第十二届云计算标准和应用大会在北京成功召开。本次大会以“标准筑基 数智创新 云端赋能 合作共赢”为主题&#xff0c;汇聚政产学研用各方专家学者&#xff0c;共享和探讨云计算标准化工作的重要进展以及云计算产业发…

实现可观测性平台的技术要点是什么?

文章目录 实现可观测性平台的技术要点是什么?兼容全域信号量所谓全域信号量有哪些&#xff1f;统一采集和上传工具统一的存储后台自由探索和综合使用数据总结 实现可观测性平台的技术要点是什么? 随着可观测性理念的深入人心&#xff0c;可观测性平台已经开始进入了落地阶段…

RecyclerView滑动时添加缩放效果

最近看到一个动画效果&#xff0c;感觉不错&#xff0c;所以动手试一试 我实现的效果 基本上是已经实现了头像无限滚动中itemview也伴随缩放效果 初步实现基本思路&#xff1a; 1、没选择用ViewPager&#xff0c;考虑到特定几张图片的循环显示和扩展我使用recyclerview 2、头…

lv5 嵌入式开发-2 exec函数族

目录 1 进程 – exec函数族 1.1 exec函数族特点 1.2 进程 – execl / execlp使用方法 1.3 进程 – execv / execvp 2 进程 – system 3 exec族要点演示 掌握&#xff1a;exec函数族、system 1 进程 – exec函数族 执行程序&#xff0c;通孔ps -elf发现&#xff0c;父进…