用threejs模拟太阳系运动三维模型

最近在学习threejs,觉得非常有趣。于是决定用这个来模拟太阳系各行星的运行轨迹。

关于threejs的基础知识就不再赘述了,大家可以查看官网:threejs官方网站

本文的demo可以从下面下载:threejs模拟太阳系八大行星公转及自转三维模型

大家也可以通过以下地址观看效果:threejs模拟太阳系八大行星公转及自转三维模型效果

(可以通过鼠标和滚轴,切换视角和视野缩放)

下面介绍我的实现思路:

(1)设置太阳及八大行星参数

先查询太阳及八大行星的半径、自转周期、公转周期,各行星绕太阳公转椭圆轨道的近日点和远日点。并设置如下数组:

//行星参数const stars = [{ name: '太阳', radius: 69.550, textureImg: 'Sun.png', centerPosition: { x: 0, y: 0, z: 0 }, rotationSpeed: Math.PI / 100 / 25.5/*自转速度*/, },{ name: '水星', radius: 2.440, textureImg: 'Mercury.png', centerPosition: { x: 0, y: 0, z: 57909 / 500 }, rotationSpeed: Math.PI / 100 / 58/*自转速度*/, revolutionRadiusX: 69816.9 / 500, revolutionRadiusY: 46001.2 / 500, revolutionDiviseLength: 87.9/365*revolutionSpeedRatio/*公转速度有关,越大,转速越慢*/, revolutionDiviseInd: 0 },{ name: '金星', radius: 6.051, textureImg: 'Venus.png', centerPosition: { x: 0, y: 0, z: 108200 / 500 }, rotationSpeed: Math.PI / 100 / 243/*自转速度*/, revolutionRadiusX: 108942 / 500, revolutionRadiusY: 107476 / 500, revolutionDiviseLength: 224.701/365*revolutionSpeedRatio, revolutionDiviseInd: 0 },{ name: '地球', radius: 6.371, textureImg: 'Earth.png', centerPosition: { x: 0, y: 0, z: 147000 / 500 }, rotationSpeed: Math.PI / 100 / 1/*自转速度*/, revolutionRadiusX: 149600 / 500, revolutionRadiusY: 149580 / 500, revolutionDiviseLength: revolutionSpeedRatio, revolutionDiviseInd: 0 },{ name: '火星', radius: 3.396, textureImg: 'Mars.png', centerPosition: { x: 0, y: 0, z: 227940 / 500 }, rotationSpeed: Math.PI / 100 / 1.05/*自转速度*/, revolutionRadiusX: 249200 / 500, revolutionRadiusY: 206600 / 500, revolutionDiviseLength: 686.971/365*revolutionSpeedRatio, revolutionDiviseInd: 0 },{ name: '木星', radius: 69.911, textureImg: 'Jupiter.png', centerPosition: { x: 0, y: 0, z: 778330 / 500 }, rotationSpeed: Math.PI / 100 / 0.375/*自转速度*/, revolutionRadiusX: 817000 / 500, revolutionRadiusY: 741000 / 500, revolutionDiviseLength: 11.862*revolutionSpeedRatio, revolutionDiviseInd: 0 },{ name: '土星', radius: 60.268, textureImg: 'Saturn.png', centerPosition: { x: 0, y: 0, z: 1429400 / 500 }, rotationSpeed: Math.PI / 100 / 0.4/*自转速度*/, revolutionRadiusX: 1514500 / 500, revolutionRadiusY: 1355250 / 500, revolutionDiviseLength: 29.4571*revolutionSpeedRatio, revolutionDiviseInd: 0 },{ name: '海王星', radius: 24.622, textureImg: 'Neptune.png', centerPosition: { x: 0, y: 0, z: 4496000 / 500 }, rotationSpeed: Math.PI / 100 / 0.667/*自转速度*/, revolutionRadiusX: 4553946 / 500, revolutionRadiusY: 4452940 / 500, revolutionDiviseLength: 164.8*revolutionSpeedRatio, revolutionDiviseInd: 0 },{ name: '天王星', radius: 25.362, textureImg: 'Uranus.png', centerPosition: { x: 0, y: 0, z: 28709900 / 500 }, rotationSpeed: Math.P / 100 / 0.65/*自转速度*/, revolutionRadiusX: 30044197.04 / 500, revolutionRadiusY: 2748938.461 / 500, revolutionDiviseLength: 84.0205*revolutionSpeedRatio, revolutionDiviseInd: 0 }]

为了视觉效果展示方便,所有的长度单位、距离单位、转速等,都进行了比例处理。

  • name:为星球中文名称;
  • radius:半径(单位1000千米);
  • textureImg:纹理贴图;
  • centerPosition:星中心点坐标(其中太阳中心坐标为坐标系原点),,考虑坐标轴视觉范围,进行了一定等比缩放;
  • rotationSpeed:自转速度,其他星球按照地球日等比例计算和地球自传速度的比率;
  • revolutionRadiusX:公转椭圆轨道长轴半径,这个数据依据行星远日点数值计算,不是实际运行轨道,但是可以模拟出等比效果,考虑坐标轴视觉范围,进行了一定等比缩放
  • revolutionRadiusY:公转椭圆轨道短轴半径,这个数据依据行星近日点数值计算,不是实际运行轨道,但是可以模拟出等比效果,考虑坐标轴视觉范围,进行了一定等比缩放。
  • revolutionDiviseLength:公转椭圆轨道曲线切分长度(用于threejs生成curve的切分参数,数值越大,曲线越光滑。此处和公转的转速有关,切分点越多,公转速度越慢)

  • revolutionDiviseInd:公转运行坐标索引(仅八大行星需要此参数)

(2)开始创建场景,架好相机

//设置渲染器
renderer.setSize(width, height);
document.body.appendChild(renderer.domElement);
//设置控制器
cameraControls = new THREE.OrbitControls(camera, renderer.domElement);
//设置相机位置
camera.position.set(100, 200, 10000);//增加辅助坐标轴
var axeshelper = new THREE.AxesHelper(6000);//轴辅助,参数为轴大小
scene.add(axeshelper);//控制器设置
cameraControls.target = new THREE.Vector3(0, 1, 0); //绕目标坐标运动//GridHelper,坐标格辅助对象. 坐标格实际上是2维线数组.
const gridHelper = new THREE.GridHelper( 12000/*size*/, 100/*divisions*/ );
scene.add( gridHelper );

(3)给场景加入星球

stars.forEach((star, index) => {addStar(star, index)
})
function addStar(star, index) {const geometry = new THREE.SphereGeometry(star.radius, 100, 100);const material = new THREE.MeshBasicMaterial({ /*wireframe: true,*/ map: new       THREE.TextureLoader().load(star.textureImg) });const starObj = new THREE.Mesh(geometry, material);starObj.position.x = star.centerPosition.x;starObj.position.y = star.centerPosition.y;starObj.position.z = star.centerPosition.z;//将天体加入场景scene.add(starObj)//设置公转椭圆曲线const curve = new THREE.EllipseCurve(0, 0, // ax, aYstar.revolutionRadiusX, star.revolutionRadiusY,           // xRadius, yRadius0, 2 * Math.PI,  // aStartAngle, aEndAnglefalse,            // aClockwise0                 // aRotation);const points = curve.getPoints(star.revolutionDiviseLength)//设置对象stars[index].starObj = starObj;stars[index].revolutionPoints = points;
}

这里,首先通过THREE.EllipseCurve获得行星公转周期,然后通过getPoints获得曲线各点坐标。

最后将starObj(加入场景中的星球物体)和revolutionPoints(公转曲线坐标点数组)赋值给stars数组中对应的star对象。

(4)渲染

//渲染
function animate() {requestAnimationFrame(animate);cameraControls.update();//更新控制器renderer.render(scene, camera);stars.forEach((star, index) => {//自转stars[index].starObj.rotation.y += 0.1;//公转if(index==0) //太阳不参与公转return;if (star.revolutionDiviseInd >= star.revolutionDiviseLength) {stars[index].revolutionDiviseInd = 0;} else {stars[index].starObj.position.x =    stars[index].revolutionPoints[star.revolutionDiviseInd].x;stars[index].starObj.position.z = stars[index].revolutionPoints[star.revolutionDiviseInd].y;star.revolutionDiviseInd++;}})
}

(5)结尾

整个实现过程并不复杂,需要的一些细心和耐心。但是这个模型并不完美,因为考虑视觉效果,很多数据并没有进行真实比例还原,只能是示意。

半径、自转转速、公转速度、公转路径等之间的单位,也没有完全一致。有兴趣的话,大家可以更改参数让模型更贴近实际。

这里也没有画太阳系在银河系的运行动画,网上看过真实太阳系的运行,还是很震撼的。

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

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

相关文章

未来电话呼叫技术的社会影响与发展趋势----云微呼

未来电话呼叫技术将以更为智能化、便捷化和个性化为主要发展趋势,其所带来的社会影响也将是多层面的。以下将探讨未来电话呼叫技术可能的发展趋势以及对社会的影响: 智能化助力生活便捷: 未来电话呼叫技术将更加智能化,通过人工智…

聊聊PowerJob日志的上报及存储

序 本文主要研究一下PowerJob的日志上报及存储 OmsLoggerFactory.build tech/powerjob/worker/log/OmsLoggerFactory.java public class OmsLoggerFactory {public static OmsLogger build(Long instanceId, String logConfig, WorkerRuntime workerRuntime) {LogConfig cf…

uniapp 组件封装

1. uniapp 组件封装时间戳格式化为星期 1.1. components/m-week.vue <template><text>{{week}}</text> </template> <script>export default {props: {time: String},mounted(e) {this.week this.getWeek(Number(this.time))},data() {return …

FreeMark ${r‘原样输出‘} ${r“原样输出“}

FreeMark ${r’原样输出’} ${r"原样输出"} 在${}使用 小写字母r接两个单引号或两个双引号包裹的内容可以原样输出, 字母r只能用小写 ${r想要原样输出的内容} --用了单引号${r"想要原样输出的内容"} --用了双引号 例子: ${r"${r}"} 得到 ${r…

Unity引擎学习笔记之【动画、动画器操作】

动画Animate Animation是基于关键帧的动画系统&#xff0c;适用于简单的动画需求&#xff1b; 而Animator是一种状态机驱动的动画系统&#xff0c;适用于更复杂的动画逻辑和交互式动画。 通常&#xff0c;Animator组件更适合用于游戏中的角色动画控制&#xff0c; 而Animation…

车载测试Vector工具——基于DoIP的ECU/车辆的连接故障排除

车载测试Vector工具——基于DoIP的ECU/车辆的连接故障排除 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师(Wechat:gongkenan2013)。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和…

【考研408】计算机网络笔记

文章目录 计算机网络体系结构计算机网络概述计算机网络的组成计算机网络的功能计算机网络的分类计算机网络的性能指标课后习题 计算机网络体系结构与参考模型计算机网络协议、接口、服务的概念ISO/OSI参考模型和TCP/IP模型课后习题 物理层通信基础基本概念奈奎斯特定理与香农定…

PyCharm / DataSpell 导入WSL2 解析器,实现GPU加速

PyCharm / DataSpell 导入WSL2 解析器的实现 Windows的解析器不好么&#xff1f;设置WSL2和实现GPU加速为PyCharm / DataSpell 设置WSL解析器设置Interpreter Windows的解析器不好么&#xff1f; Windows上的解析器的确很方便&#xff0c;也省去了我们很多的麻烦。但是WSL2的解…

cesium-水平测距

cesium测量两点间的距离 <template><div id"cesiumContainer" style"height: 100vh;"></div><div id"toolbar" style"position: fixed;top:20px;left:220px;"><el-breadcrumb><el-breadcrumb-item&…

React16源码: React中处理hydrate的核心流程源码实现

hydrate 1 &#xff09;概述 hydrate 在react当中不算特别重要, 但是很多时候会用到的一个API这个 API 它主要作用就是在进入第一次渲染的时候&#xff0c;如果本身 dom 树上面已经有一个dom结构存在是否可以去利用这一部分已经存在的dom&#xff0c;然后去避免掉在第一次渲染…

千万级数据深分页查询SQL性能优化实践-京东零售技术团队

一、系统介绍和问题描述 如何在Mysql中实现上亿数据的遍历查询&#xff1f;先来介绍一下系统主角&#xff1a;关注系统&#xff0c;主要是维护京东用户和业务对象之前的关注关系&#xff1b;并对外提供各种关系查询&#xff0c;比如查询用户的关注商品或店铺列表&#xff0c;查…

贪心算法中关于重叠区间问题的感悟

在我这两天的感受中&#xff0c;对区间的排序是解题的关键&#xff0c;能够正确的排序就成功三分之一了。不过想到排序的方法很重要&#xff0c;有的是按照开始点从小到大排列&#xff0c;有的是按照从大到小&#xff0c;有的是按照结束节点排序&#xff0c;有的甚至再排过开始…

[晓理紫]CCF系列会议截稿时间订阅

关注{晓理紫|小李子}&#xff0c;每日更新CCF系列会议信息&#xff0c;如感兴趣&#xff0c;请转发给有需要的同学&#xff0c;谢谢支持&#xff01;&#xff01; 如果你感觉对你有所帮助&#xff0c;请关注我&#xff0c;每日准时为你推送最新会议信息。 SAC (CCF C) Select…

物流平台架构设计与实践

随着电商行业的迅猛发展&#xff0c;物流行业也得到了极大的发展。从最初的传统物流到现在的智慧物流&#xff0c;物流技术和模式也在不断的更新与升级。物流平台作为连接电商和物流的重要媒介&#xff0c;其架构设计和实践显得尤为重要。 一、物流平台架构设计 1. 前端架构设…

VSCode Vue 必备插件

VSCode Vue 插件 1. Vue Language Features(Volar)官方插件 volar不仅支持 Vue3 语言高亮、语法检测&#xff0c;还支持 TypeScript 和基于 vue-tsc 的类型检查功能。需要注意的是&#xff1a;使用时需要禁用 Vetur 插件,Volar与它会有冲突 2. Vue VSCode Snippets 此插件为…

京东广告算法架构体系建设--高性能计算方案最佳实践 | 京东零售广告技术团队

1、前言 推荐领域算法模型的在线推理是一个对高并发、高实时有较强要求的场景。算法最初是基于Wide & Deep相对简单的网络结构进行建模&#xff0c;容易满足高实时、高并发的推理性能要求。但随着广告模型效果优化进入深水区&#xff0c;基于Transformer用户行为序列和Att…

OpenSSL:configure: error: OpenSSL library not found解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

项目02《游戏-05-开发》Unity3D

基于 项目02《游戏-04-开发》Unity3D &#xff0c; 【任务】UI背包系统&#xff0c; 首先将Game窗口设置成1920 * 1080&#xff0c; 设置Canvas的缩放模式&#xff0c;&#xff1a;这样设置能让窗口在任意分辨率下都以一个正确的方式显示&#xff0c; 设置数值&…

Mac安装Homebrew+MySQL+Redis+Nginx+Tomcat等

Mac安装HomebrewMySQLRedisNginxTomcat等 文章目录 Mac安装HomebrewMySQLRedisNginxTomcat等一、Mac安装Mysql 8①&#xff1a;下载②&#xff1a;安装③&#xff1a;配置环境变量④&#xff1a;外部连接测试 二、Mac安装Redis和可视化工具①&#xff1a;安装Redis01&#xff1…