如何用three.js实现我的太空遐想3D网页

简介: 如何用three.js实现我的太空遐想3D网页

 image.gif编辑

 

目录

创作背景

功能分解

创建3d地球

创建3d月球

创建3d小火箭

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

1.地球的自转轨迹

2.月球的公转轨迹

3.小火箭的公转轨迹

最终效果展现

彩蛋


创作背景

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

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


功能分解

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

    创建3d地球

    如何实现一个3d地球呢

    image.gif编辑

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

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

    image.gif

    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 )

    image.gif

    image.gif编辑

    相机概念示意图

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

    材质图:

    image.gif编辑

    /**
        * 场景中添加地球
        */
      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) //网格模型对象Mesh
      earth.position.set(0, 0, 0)
      earth.castShadow = true; // 光源有阴影
      earth.receiveShadow = true
      scene.add(earth); //创建地球

    image.gif

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

    创建3d月球

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

    image.gif编辑

    创建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);
          });

    image.gif

    image.gif编辑

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

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

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

    1.地球的自转轨迹

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

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

    image.gif

    2.月球的公转轨迹

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

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

    image.gif

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

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

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

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

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

    3.小火箭的公转轨迹

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

    最终效果展现

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

    image.gif编辑


    彩蛋

    最后本项目,开源在gitcode上面,里面包含了项目的全部代码和模型,贴图素材,需要学习的朋友可以去自行下载学习:

    国服第二切图仔 / Earth Moon Rockey Fly · GitCode

    在此链接gitcode前 加上 ide ,即可使用网页版的vscode查看本项目:

    Cloud IDE

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

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

    目录
    相关文章
    |
    4月前
    |
    存储 JavaScript 前端开发
    使用JavaScript构建动态交互式网页:从基础到实践
    【10月更文挑战第12天】使用JavaScript构建动态交互式网页:从基础到实践
    267 1
    |
    5月前
    |
    编解码 前端开发 JavaScript
    javascript检测网页缩放演示代码
    javascript检测网页缩放演示代码
    |
    5月前
    |
    Web App开发 JavaScript 前端开发
    添加浮动按钮点击滚动到网页底部的纯JavaScript演示代码 IE9、11,Maxthon 1.6.7,Firefox30、31,360极速浏览器7.5.3.308下测试正常
    添加浮动按钮点击滚动到网页底部的纯JavaScript演示代码 IE9、11,Maxthon 1.6.7,Firefox30、31,360极速浏览器7.5.3.308下测试正常
    |
    2月前
    |
    Web App开发 移动开发 HTML5
    html5 + Three.js 3D风雪封印在棱镜中的梅花鹿动效源码
    html5 + Three.js 3D风雪封印在棱镜中的梅花鹿动效源码。画面中心是悬浮于空的梅花鹿,其四周由白色线段组成了一个6边形将中心的梅花鹿包裹其中。四周漂浮的白雪随着多边形的转动而同步旋转。建议使用支持HTML5与css3效果较好的火狐(Firefox)或谷歌(Chrome)等浏览器预览本源码。
    99 2
    |
    3月前
    |
    缓存 JavaScript 前端开发
    JavaScript 与 DOM 交互的基础及进阶技巧,涵盖 DOM 获取、修改、创建、删除元素的方法,事件处理,性能优化及与其他前端技术的结合,助你构建动态交互的网页应用
    本文深入讲解了 JavaScript 与 DOM 交互的基础及进阶技巧,涵盖 DOM 获取、修改、创建、删除元素的方法,事件处理,性能优化及与其他前端技术的结合,助你构建动态交互的网页应用。
    87 5
    |
    4月前
    |
    存储 JavaScript 前端开发
    【JavaScript】网页交互的灵魂舞者
    本文介绍了 JavaScript 的三种引入方式(行内、内部、外部)和基础语法,包括变量、数据类型、运算符、数组、函数和对象等内容。同时,文章还详细讲解了 jQuery 的基本语法和常用方法,如 `text()`、`html()`、`val()`、`attr()` 和 `css()` 等,以及如何插入和删除元素。通过示例代码和图解,帮助读者更好地理解和应用这些知识。
    55 1
    【JavaScript】网页交互的灵魂舞者
    |
    3月前
    |
    JavaScript
    js实现简洁实用的网页计算器功能源码
    这是一款使用js实现简洁实用的网页计算器功能源码。可实现比较基本的加减乘除四则运算功能,界面简洁实用,是一款比较基本的js运算功能源码。该源码可兼容目前最新的各类主流浏览器。
    54 2
    用CSS+JavaScript打造网页中的选项卡
    用CSS+JavaScript打造网页中的选项卡
    |
    5月前
    |
    Web App开发 前端开发 JavaScript
    HTML/CSS/JS学习笔记 Day3(HTML--网页标签 下)
    HTML/CSS/JS学习笔记 Day3(HTML--网页标签 下)
    |
    4月前
    |
    Web App开发 缓存 前端开发
    前端RAG:使用Transformers.js手搓纯网页版RAG(二)- 基于qwen1.5-0.5B
    本文继续探讨了RAG的后半部分,通过在浏览器中运行qwen1.5-0.5B模型实现了增强搜索全流程。然而,由于浏览器与模型性能限制,该方案更适合研究、离线及高隐私场景。文章提供了完整的前端代码,让读者能够动手尝试。此外,详细介绍了代码框架、知识库准备、模型初始化及问答实现等步骤,并展示了实际运行效果。受限于当前技术,除非在离线或高隐私环境下,网页大模型的应用仍需进一步优化。
    218 0

    热门文章

    最新文章

  1. 1
    【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    24
  2. 2
    Node.js 中实现多任务下载的并发控制策略
    32
  3. 3
    【2025优雅草开源计划进行中01】-针对web前端开发初学者使用-优雅草科技官网-纯静态页面html+css+JavaScript可直接下载使用-开源-首页为优雅草吴银满工程师原创-优雅草卓伊凡发布
    25
  4. 4
    【JavaScript】深入理解 let、var 和 const
    48
  5. 5
    【04】Java+若依+vue.js技术栈实现钱包积分管理系统项目-若依框架二次开发准备工作-以及建立初步后端目录菜单列-优雅草卓伊凡商业项目实战
    44
  6. 6
    【03】Java+若依+vue.js技术栈实现钱包积分管理系统项目-若依框架搭建-服务端-后台管理-整体搭建-优雅草卓伊凡商业项目实战
    53
  7. 7
    【02】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-ui设计图figmaUI设计准备-figma汉化插件-mysql数据库设计-优雅草卓伊凡商业项目实战
    55
  8. 8
    如何通过pm2以cluster模式多进程部署next.js(包括docker下的部署)
    71
  9. 9
    【01】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-需求改为思维导图-设计数据库-确定基础架构和设计-优雅草卓伊凡商业项目实战
    55
  10. 10
    JavaWeb JavaScript ③ JS的流程控制和函数
    62