模拟太阳系
2017-03-11 02:12
183 查看
今天来模拟太阳系
我们知道,太阳系包括太阳,水星,金星,地球,火星,木星,土星,天王星,海王星。
为了模拟太阳系,首先我查找了一些相关参数
因为只是简单模拟,所以我只是依据它们的周期比例简单的为它们的旋转速度赋了值。
接下来我们就先建模,创建九个球,再网上下载相关纹理,拖入球体,得到九个实体(太阳肯定要搞大点)
由于对太阳系而言,太阳是静止的,所以我把太阳作为父类,其余的星球作为太阳的子类
(粉色的线是我用来绘制运行轨道的,后面会具体介绍)
下面我们编写脚本。我思考的是一个类中包含九个Transform对象,依次对应这九个星球。由于模拟太阳系一直都是在运动的,不需要任何触发,所以在Start函数中初始化每个星球的位置就好,而除了太阳是相对静止的,其他的星球都是围绕太阳旋转(公转),以及自转。公转我们可以用RotateAround方法,而自转可以用Rotate。但是需要注意,公转需要在不同的轨道上,要求必须在不同的法平面上,在初始化时,我把九个星球都放置在了y=0,z=0的平面上,因此要想做到真正的公转,必须旋转角度向量与oyz面垂直
由于所有行星不可能都在同一轨道公转,而我又不可能知道它们的轨道是什么样的,所以就用随机数Random来模拟
将该脚本挂载到太阳上,并把相应参数拖入,运行,即可看到玄幻的太阳系模拟!
可能有些人会问了,3D视角,我怎么看得出这个太阳系是否真的沿轨道旋转呢,万一有些偏离了呢。这里我们可以绘制轨道,我上网查了一些,发现拖尾效果最好,但是那种奇妙的特效我还做不出来…..所以就用简单的线条绘制。
首先选中一个星球,点击菜单栏Component->Effects->Trail Renderer会出现该属性
修改Width = 0.2(这样细一点好看)和Time=100(线条消失时间,越长越好,才能做到不会消失的假象)。
所有设置好后,再次Run,就会变成这样,超壮观的
若有疑问或者问题,请多多提出,感谢!
我们知道,太阳系包括太阳,水星,金星,地球,火星,木星,土星,天王星,海王星。
为了模拟太阳系,首先我查找了一些相关参数
因为只是简单模拟,所以我只是依据它们的周期比例简单的为它们的旋转速度赋了值。
接下来我们就先建模,创建九个球,再网上下载相关纹理,拖入球体,得到九个实体(太阳肯定要搞大点)
由于对太阳系而言,太阳是静止的,所以我把太阳作为父类,其余的星球作为太阳的子类
(粉色的线是我用来绘制运行轨道的,后面会具体介绍)
下面我们编写脚本。我思考的是一个类中包含九个Transform对象,依次对应这九个星球。由于模拟太阳系一直都是在运动的,不需要任何触发,所以在Start函数中初始化每个星球的位置就好,而除了太阳是相对静止的,其他的星球都是围绕太阳旋转(公转),以及自转。公转我们可以用RotateAround方法,而自转可以用Rotate。但是需要注意,公转需要在不同的轨道上,要求必须在不同的法平面上,在初始化时,我把九个星球都放置在了y=0,z=0的平面上,因此要想做到真正的公转,必须旋转角度向量与oyz面垂直
using System.Collections; using System.Collections.Generic; using UnityEngine; public class RoundSun : MonoBehaviour { public Transform 太阳; public Transform 水星; public Transform 金星; public Transform 地球; public Transform 火星; public Transform 木星; public Transform 土星; public Transform 天王星; public Transform 海王星; float[] v1 = new float[8]; float[] v2 = new float[8]; // Use this for initialization void Start () { 太阳.position = Vector3.zero; 水星.position = new Vector3(4, 0, 0); 金星.position = new Vector3(6, 0, 0); 地球.position = new Vector3(8, 0, 0); 火星.position = new Vector3(10, 0, 0); 木星.position = new Vector3(12, 0, 0); 土星.position = new Vector3(14, 0, 0); 天王星.position = new Vector3(16, 0, 0); 海王星.position = new Vector3(18, 0, 0); for (int i = 0; i < 8; i++) { v1[i] = Random.Range(1, 360); v2[i] = Random.Range(1, 360); } } // Update is called once per frame void Update () { // 水星 水星.RotateAround(太阳.position, new Vector3(0, v1[0], v2[0]), 10 * Time.deltaTime); 水星.Rotate(Vector3.up * 300 * Time.deltaTime); // 金星 金星.RotateAround(太阳.position, new Vector3(0, v1[1], v2[1]), 15 * Time.deltaTime); 金星.Rotate(Vector3.up * 900 * Time.deltaTime); // 地球 地球.RotateAround(太阳.position, new Vector3(0, v1[2], v2[2]), 20 * Time.deltaTime); 地球.Rotate(Vector3.up * 30 * Time.deltaTime); // 火星 火星.RotateAround(太阳.position, new Vector3(0, v1[3], v2[3]), 40 * Time.deltaTime); 火星.Rotate(Vector3.up * 30 * Time.deltaTime); // 木星 木星.RotateAround(太阳.position, new Vector3(0, v1[4], v2[4]), 50 * Time.deltaTime); 木星.Rotate(Vector3.up * 15 * Time.deltaTime); // 土星 土星.RotateAround(太阳.position, new Vector3(0, v1[5], v2[5]), 60 * Time.deltaTime); 土星.Rotate(Vector3.up * 15 * Time.deltaTime); // 天王星 天王星.RotateAround(太阳.position, new Vector3(0, v1[6], v2[6]), 65 * Time.deltaTime); 天王星.Rotate(Vector3.up * 15 * Time.deltaTime); // 海王星 海王星.RotateAround(太阳.position, new Vector3(0, v1[7], v2[7]), 70 * Time.deltaTime); 海王星.Rotate(Vector3.up * 15 * Time.deltaTime); } }
由于所有行星不可能都在同一轨道公转,而我又不可能知道它们的轨道是什么样的,所以就用随机数Random来模拟
将该脚本挂载到太阳上,并把相应参数拖入,运行,即可看到玄幻的太阳系模拟!
可能有些人会问了,3D视角,我怎么看得出这个太阳系是否真的沿轨道旋转呢,万一有些偏离了呢。这里我们可以绘制轨道,我上网查了一些,发现拖尾效果最好,但是那种奇妙的特效我还做不出来…..所以就用简单的线条绘制。
首先选中一个星球,点击菜单栏Component->Effects->Trail Renderer会出现该属性
修改Width = 0.2(这样细一点好看)和Time=100(线条消失时间,越长越好,才能做到不会消失的假象)。
所有设置好后,再次Run,就会变成这样,超壮观的
若有疑问或者问题,请多多提出,感谢!
相关文章推荐
- java学习之java模拟太阳系简单实现
- OpenGL 实现模拟太阳系运动
- JS+HTML5的Canvas画图模拟太阳系运转
- 【OpenGL】模拟太阳系
- OpenGL模拟太阳系运行
- OpenGL 简易太阳系模拟 总结
- css模拟太阳系旋转效果
- Unity 小项目:模拟太阳系
- unity学习2——基于物理模拟的太阳系模型
- 模拟太阳系项目
- 自己写的一个近似模拟太阳系行星运行的代码(更新CSS3代码在下方)
- HTML5的Canvas画图模拟太阳系运转
- OpenGL简单实现太阳系模拟
- c++版模拟银行窗口排队叫号系统
- 2440 模拟IIC 可以读取 L3G4200D ,ADXL345
- POJ_2993_Emag eht htiw Em Pleh_模拟
- [UVA512]Spreadsheet Tracking[模拟][STL]
- 2016腾讯春招模拟笔试
- POJ 3173 模拟
- hdu 1296 Polynomial Problem(模拟)