Unity学习笔记(3)-----制作一个仿真星系(复杂版)【Step1】
来源:互联网 发布:淘宝怎么设置延长收货 编辑:程序博客网 时间:2024/06/05 04:45
继续学习Unity3D 这周任务之一是要做一个太阳系,如下图:
而这次笔记的重点不在作业上~.~, 而是在于如何建立一个, 真正意义上的 “星系”。
上过课都知道, 作业简单用以下两条语句即可搞定:
Planet.gameObject.transform.RotateAround();Planet.gameObject.transform.Rotate();
然而这样做并没有实现真的仿真, 因为:
1. 轨道只能是圆的..... 而大部分星球轨道不可能完全是圆, 只是有些轨道离心率略低看起来像是圆罢了。。。
2. 凭感觉(因为高中物理忘得差不多了), 这样弄出来的各个星球的转速放在同一个中心天体的星系中可能会违反物理规律.....
3. 用的物理模型本身就不符 ~。~ Rotate只有旋转而已, 不能体现各个星球之间对各自轨道的影响
------------------------------------装逼与正文分割线-----------------------------------------
所以第一个问题, 就是如何建立一个引力场。
我们知道每个星球都有引力, 而且引力范围是无限的。各个天体之间的引力由万有引力公式给出
那么, 首先我们新建一个 Sphere 物体, Reset其位置, 当做中心天体。
然后, 给这个物体添加Rigidbody属性, 这是为了给此对象添加物理事件, 比如我们需要的引力, 碰撞等......
将其做成一个预设, 放在Resources/Prefabs 中。(文件夹名字一定要是Resources里啊, 不然之后没法加载...)
当然保存Scene也是习惯了, 还有一些琐碎操作, 什么调摄像机镜头到合适角度啊,设定物体Scale和Mass啊之类的, 合理就行。
放一个我设置的图:(Rotation那里忽略, 设置为0就好! 这图是我在仿真过程中随手截的, 等下会解释这个)
然后就是添加一个Script脚本, 实现引力效果。
要实现引力, 大致可以分为以下几个步骤:
- 设置一个引力范围。
- 选定在引力范围内的所有天体。
- 给每个天体都加一个来自此对象的力(即指向此对象), 力的大小由万有引力公式决定。
void KeepUniversalG() {var Center = this.transform.position;Collider[] colliders = Physics.OverlapSphere (Center, GalaxyRange);foreach (Collider obj in colliders) {Rigidbody rb = obj.GetComponent<Rigidbody> ();if (rb != null)rb.AddExplosionForce (-1 * UniversalG(this.gameObject, obj.gameObject) * Time.deltaTime, Center, GalaxyRange);}}没高亮?.... 好伤啊。
AddExplosionForce(...);这个从名字看是实现从某物体发出的产生爆炸力的作用效果, 但是注意在参数设定Force那里*-1, 改变力的方向不就是引力了么(~。~)
void Start () {var Center = this.transform.position;InitialForce = ProperForce (this.gameObject);this.gameObject.GetComponent<Rigidbody> ().AddForce (InitialForce * ProperDirect(Center));}
Center * ProperDirect(Center) == 0 //这里指向量点乘。
以上工作做完, 保存脚本, 看看效果。
这时候的效果应该不是太好, 原因如下:
1.参数乱设的。 2. 天体不美观。 3.轨道很难观察 4. 可能还有Bug、、、(这是最气的)
鉴于写到这里我发现还有很多没写,, 我还是另写一篇做下文吧, 不然太长了。
先发下成品效果图。。
懒得发动图了, 角度也懒得换了。。。 反正自己看着还挺不错。
- Unity学习笔记(3)-----制作一个仿真星系(复杂版)【Step1】
- Unity学习笔记(3)-----制作一个仿真星系(复杂版)【Step2】
- Unity学习笔记(3)-----制作一个仿真星系(复杂版)【Step3】
- unity shader学习笔记(十三)——Unity中的复杂光照之渲染路径
- unity shader学习笔记(十四)——Unity中的复杂光照之光源类型
- unity shader学习笔记(十五)——Unity中的复杂光照之光照衰减
- Unity学习笔记3 简易2D横版RPG游戏制作(三)
- MailBox writeup(step1)
- MATLAB学习笔记(Simulink仿真)
- 星系炸弹(蓝桥杯)
- Shell学习笔记(3)-一个复杂一点的Shell程序
- unity学习笔记(1)-hello unity
- Direct3D学习笔记(四) 制作一个真正的三维空间
- Direct3D学习笔记(四) 制作一个真正的三维空间
- Direct3D学习笔记(四) 制作一个真正的三维空间
- gtk学习笔记2(制作一个完整的窗口)
- Qt学习笔记(三)---制作一个记事本
- Unity学习笔记1 简易2D横版RPG游戏制作(一)
- JavaScript for Kids 学习笔记2. 数据类型与变量
- SpringMVC 转发和重定向
- 一个节点rac+单节点dg网络配置(listener.ora与tnsnames.ora)
- 移动距离
- Python标准模块——gzip
- Unity学习笔记(3)-----制作一个仿真星系(复杂版)【Step1】
- 为CentOS配置网易163的yum源
- 算法小研究
- unity 鼠标指示NavMeshAgent移动
- smarty静态缓存
- 谜题(Puzzle UVa227)
- GDB(设置断点)
- Struts2的参数接收的四种方法
- 从HTTP协议演进理解HTTP协议