目录

创作背景

功能分解

创建3d地球

创建3d月球

创建3d小火箭

设计地球自转轨迹和月球、小火箭旋转的行星轨道

1.地球的自转轨迹

2.月球的公转轨迹

3.小火箭的公转轨迹

最终效果展现

彩蛋


创作背景

马上又是一年中秋佳节到来之际,中秋佳节自古以来就是团圆,思乡的节日,佳节当晚一边赏着月色,一边品尝着美味的月饼,和亲人好友诉说着想念之情 ,悠闲惬意之情油然而生。

古人有诗云:”明月几时有,把酒问青天,不知天上宫阙,今夕是何年?“  这是古人对月亮和太空的理解,那么当现代的我们抬头望向星空,望向月亮的时候,你的太空遐想是什么呢?正好博主最近也在研究3维方面技术栈,来吧,这篇文章会从0和你一起用three.js 来实现:你心目中的地球和月球,并且在漫天的繁星中画出行星运转轨迹,并保留有一个小彩蛋哦


功能分解

  1. 3d地球
  2. 3d月球
  3. 3d小火箭
  4. 地球自转轨迹 和 月球、小火箭旋转的行星轨道
  5. 彩蛋

创建3d地球

如何实现一个3d地球呢

第一步:我们首先需要创造一个三维的空间场景

 /**  实例化场景*/scene = new THREE.Scene();

three.js封装好了三维场景实例化的方法,通过new THREE.Scene(),我们就可以创建了一个三维场景

第二步:我们向三维场景里面加一个摄像机,方便我们查看三维场景中的内容

 /*** 场景添加相机*/var width = window.innerWidth; //窗口宽度var height = window.innerHeight; //窗口高度camera = new THREE.PerspectiveCamera( 45, width / height, 1, 1000 ); //透视相机camera.position.z = 15;scene.add( camera )

相机概念示意图

第三步:创建我们的地球啦,先使用new THREE.SphereGeometry(EARTH_RADIUS, 32, 32)创建一个球体,再给咱们的球体贴上地球地图的材质,这里博主已经收集了,一并放在工程目录上,阅读完本文后,可以下载使用,最后再使用new THREE.Mesh(earthGeometry, earthMaterial1)方法,这样一个地球就创建成功啦

材质图:

 /*** 场景中添加地球*/const earthGeometry = new THREE.SphereGeometry(EARTH_RADIUS, 32, 32); //球体创建方法 const earthMaterial1 = new THREE.MeshPhongMaterial({map: new THREE.TextureLoader().load('./asset/img/textures/planets/earth_atmos_2048.jpg'), // 添加纹理shininess: 5,})earth = new THREE.Mesh(earthGeometry, earthMaterial1) //网格模型对象Meshearth.position.set(0, 0, 0)earth.castShadow = true; // 光源有阴影earth.receiveShadow = truescene.add(earth); //创建地球

第四步:执行threejs的渲染函数requestAnimationFrame() 这个频率为每秒60帧,让我们的场景实时动起来

创建3d月球

创建3d月球的方法步骤和3d地球类似,这里就不重复概述啦,将成功创建后的3d月球场景p给大家看一下

创建3d小火箭

因为3d火箭的模型结构较为复杂,这里我们直接使用three.js官方提供的模型文件来导入场景,

方法如下:

 /*** 场景中添加飞船 (飞船造型太复杂,代码是画不出来滴 直接导入模型)* */const loader = new LWOLoader();loader.load('asset/model/lwo/Objects/LWO3/Demo.lwo', function(object) {rocket = object.meshes[2]; //这个模型有三部分 火箭是第三个rocket.position.set(0, 0, 0);rocket.scale.set(0.5, 0.5, 0.5);// rocket.rotateZ(MathUtils.degToRad(-90))scene.add(rocket);});

这三个场景,博主已经分布写成三个demo,大家后续clone下来自行查看

设计地球自转轨迹和月球、小火箭旋转的行星轨道

刚刚我们都已经实现了模型的创建和加载,这里我们把这个三个模型加在一个场景里面,再给每个模型设计一下自己的运行轨迹,这样就可以完成我们的地球-飞行器-月亮的太空运行轨迹遐想啦

1.地球的自转轨迹

通过学习three.js的官方文档可知,three.js提供了rotateOnAxis 方法,这个方法可以在局部空间中绕着该物体的轴来旋转一个物体 ,使用方法如下,传入两个参数( axis : Vector3, angle : Float )坐标轴和弧度,我们可将地球设置为围绕Y轴选择,转的角度为圆周率的等分点即可

earth.rotateOnAxis(new Vector3(0,1,0),3.14)

2.月球的公转轨迹

这个就比较复杂,月球需要围绕着地球来旋转,这个运行轨迹在空间中是个圆,在官方文档学习示例中,我们可以看到月球的运动轨迹就是通过修改月球在三维坐标系中的x和z值来实现的,也就是这行关键代码:

moon.position.set(Math.sin(elapsed) * 5, 0, Math.cos(elapsed) * 5);

x轴坐标:Math.sin(elapsed)*5
y轴坐标:Math.cos(elapsed)*5

球的运动轨迹,是围绕y轴,在xoz形成的平面内画圆。

通过以上观察,在运动轨迹上,任一点的坐标x,z坐标满足一下规律:

也就是三角函数的正弦余弦平方和为1,即半径为1。

3.小火箭的公转轨迹

火箭的公转轨迹也设计的和月球相同,后续有想法的小伙伴,可以写写更为复杂的数学公式,实现更多不同的运动轨迹。

最终效果展现

最后我们将全部元素组装到一个场景里面,就可以实现如下的效果,怎么样,还不错吧


彩蛋

最后本项目,开源在gitcode上面,里面包含了项目的全部代码和模型,贴图素材,需要学习的朋友可以去自行下载学习:
国服第二切图仔 / Earth Moon Rockey Fly · GitCode
在此链接gitcode前 加上 ide ,即可使用网页版的vscode查看本项目:

Cloud IDE

关于火箭的运行轨迹其实可以设计的更加合理一点(现在也绕地球飞行),这里也保留一点遗憾,希望各位大佬,设计出更合理的运行轨迹(在绕地飞行的同时还能,从地球出发,飞往月球)来一起完善这个项目

最后提前祝大家中秋节快乐,也希望通过这个小项目,可以激发你对软件开发的兴趣,有喜欢本项目的朋友,希望可以给个一键三连鼓励一下博主,也欢迎评论区留言互动~~

【中秋快乐】如何用three.js实现我的太空遐想3D网页相关推荐

  1. 二零一九己亥年中秋快乐

    海上生明月,天涯何人与我共此时? 举头望一轮明月,想起小时候呼作白玉盘.沉吟低思,不禁意间想起了故乡,泪湿眼眶.再看这月--还是故乡的亮. 明月几时有?举起一杯酒,问青天.不知天上之宫阙,今夕是何年了 ...

  2. 教你如何用node.js开发微信公众号(一)

    内容简介 本文章简单介绍了如何用node.js开发微信公众号.主要内容包括微信公众平台的配置,signature的验证,以及用node.js去处理用户主动发起的行为. 准备工作 开发前需要安装好nod ...

  3. 历史精华文章分类汇总,祝大家中秋快乐!

    (欢迎关注"我爱计算机视觉"公众号,一个有价值有深度的公众号~) 前几天看到某位朋友在公众号对话界面回复了好多关键字,因为他翻了一遍所有的52CV君发的文章,突然52CV君意识到从 ...

  4. 中秋快乐:数据库的全家福喜添新员

    海上生明月,天涯共此时. 距离上次整理数据库中秋图已过一载,如今,我们看看这一年来有什么新的变化?这些数据库哪些是你熟知的,哪些是你认不出的? 数据和云祝愿读者朋友多安康,中秋快乐,合家团圆. 资源下 ...

  5. 中秋快乐:数据库的全家福指尖细数识几何?

    海上生明月,天涯共此时. 在数据库的世界里,如果也能有一个大团圆的圆桌聚会,该是一个多么热闹的场面? 我整理了一个数据库中秋图,祝热爱数据技术的朋友们中秋快乐,大家也可以顺便数一下,你能找到多少个数据 ...

  6. 如何用 Node.js 实现一个简单的 Websocket 服务?

    最近正在研究 Websocket 相关的知识,想着如何能自己实现 Websocket 协议.到网上搜罗了一番资料后用 Node.js 实现该协议,倒也没有想象中那么复杂,除去注释语句和 console ...

  7. 零基础Unity做一个中秋诗词鉴赏网页,提前祝您中秋快乐!(DoTween动画 | WebGL视频 | 大文件上传GitHub)

    零基础Unity做一个中秋诗词鉴赏网页,提前祝您中秋快乐! 前言 一,环境搭建 1.1 安装Unity 1.2 添加WebGl模块 二,开发项目 2.1 导入插件 2.2 项目搭建 2.3 逻辑处理 ...

  8. 浓情中秋,月满人团圆!联诚发祝您中秋快乐!

    皓魄当空宝镜升 云间仙籁寂无声 平分秋色一轮满 长伴云衢千里明 中秋月圆至,人间好时节 转眼,又是一年中秋近 每年一到这时候 脑海中关于中秋节的记忆就会自动点亮 会是什么呢 说起中秋节,自然让人联想到 ...

  9. 【中秋快乐】是什么让友小盟选择在中秋节加班?

    因为要祝大家 中秋快乐呀! 友小盟出道的几天中 粉丝们纷纷发来贺电 这是友小盟收到最最有意义的中秋礼物 因为信任,所以简单 ↓↓↓ ???????? 作为曾经的个人站长到现在的产品运营,也算了陪伴了友 ...

最新文章

  1. 深入理解MSTP域和端口角色
  2. Redis学习笔记三:Redis的数据类型
  3. uibot中级认证试题_喜大普奔丨UiBot中级认证工程师考试上线啦!
  4. 互联的情怀 凝成一股绳共同成长
  5. VB.net Socket Udp收、发数据包示例源码
  6. 卓越郭朝晖:垂直类B2C网站可能昙花一现
  7. 赶快来了解一下职场达人进化论吧,它都有哪些实战技巧?
  8. 语音论文优选:口语理解A Streaming End-to-End Framework For SLU
  9. R(13):第三章:3.2数据的分布
  10. 线性光耦PC817的重要参数CTR
  11. 微信小程序开发入门教程(一)
  12. java1000到十10以内的加减法,【小学】 生成10以内的加减法
  13. 绿竹生物获上市“大路条”:融资不搞研发去理财,孔健下什么棋?
  14. thinkcentreE95微型计算机,标准化商务办公优选 ThinkCentre E95评测
  15. 腾讯云服务器2核4G、4核8G、8核16G、16核32G配置报价表出炉
  16. 爱贝云计费服务端接入注意事项
  17. 微信小程序如何正确引入iconfont图标
  18. Springboot 阿里实名认证api 调用案例
  19. 积木开发系列----Workspace的一些设定细节
  20. 下载上市公司信息及公告原文到数据库

热门文章

  1. Cygwin环境使用第三方ARMGCC编译eCos系统
  2. 还不懂vue-cli构建SPA项目和SPA项目结构吗?赶紧看看这一篇
  3. 怎么对文件夹进行随机重命名?怎么批量给多个文件夹生成随机名称?
  4. 解密库尔勒可靠性检测
  5. AI岗位平均月薪2.58w,如何抓住这波人才红利?
  6. 图像修复 python_用python进行图像修复与去除水印
  7. 元胞自动机模拟森林火灾--matlab实现
  8. Web测试中定位bug方法
  9. docker-elastic7.9.3集群搭建并开启用户验证
  10. 美化滚动条的一个插件 vue3-perfect-scrollbar