当前位置:   article > 正文

【HTML】简单制作一个3D动态粒子效果的时空隧道

【HTML】简单制作一个3D动态粒子效果的时空隧道

目录

前言

开始

HTML部分

CSS部分

效果图

总结


前言

        无需多言,本文将详细介绍一段HTML,具体内容如下:

 

开始

        首先新建文件夹,创建两个文本文档,其中HTML的文件名改为[index.html],CSS的文件名改为[Babylon.js],创建好后右键用文本文档打开,再把下面相对应代码填入后保存即可。

HTML部分

        这段HTML代码是一个使用Babylon.js库创建的3D动画效果页面。Babylon.js是一个强大的JavaScript库,用于创建和显示3D内容在网页上。下面是对这段代码的详细总结:

  1. HTML结构

    • <!doctype html> 声明了文档类型为HTML5。
    • <html> 标签定义了整个HTML文档的根。
    • <head> 部分包含了文档的元数据,如字符编码设置为UTF-8,页面标题设置为“canvas时空隧道”,以及引入外部的JavaScript文件“script.js”和Babylon.js的类定义。
  2. CSS样式

    • 全局样式重置默认的边距和内边距为0。
    • canvas 元素的宽度和高度被设置为视口宽度和高度的100%,以确保全屏显示。
    • .infos 类定义了一个使用网格布局的固定位置元素,具有一定大小的内边距。
    • 链接颜色被设置为浅灰色。
    • body 的滚动条被隐藏。
  3. JavaScript逻辑

    • 使用严格模式声明,有助于捕捉错误和避免不安全的行为。
    • 引入Babylon.js库中的类,如引擎(Engine)、场景(Scene)、相机(ArcRotateCamera)、向量(Vector3)、网格构建器(MeshBuilder)、材质(PBRMaterial)、光源(PointLight)、粒子系统(SolidParticleSystem)等。
    • 创建一个canvas元素,并初始化Babylon.js引擎和场景。
    • 设置场景背景颜色为黑色且不透明。
    • 创建一个围绕物体旋转的相机,并设置视场角和最小Z值。
    • 创建一个点光源,并设置光源强度和漫反射颜色。
    • 创建默认的渲染管线,并启用Bloom效果。
    • 创建一个基于物理的渲染(PBR)材质,并设置粗糙度。
    • 定义随机数生成函数,用于生成粒子的位置、缩放和颜色。
    • 创建一个多面体网格,并将其添加到实体粒子系统中。
    • 初始化粒子并构建网格。
    • 设置粒子系统的网格材质和旋转。
    • 添加事件监听器以在场景渲染前更新粒子位置,并在窗口大小变化时调整引擎大小。
    • 开始渲染循环,确保3D动画能够持续播放。
  1. <!doctype html>
  2. <!-- 声明文档类型为HTML5 -->
  3. <html>
  4. <head>
  5. <meta charset="utf-8">
  6. <!-- 设置字符编码为UTF-8 -->
  7. <title>canvas时空隧道</title>
  8. <!-- 页面标题 -->
  9. <style>
  10. *{margin:0;padding:0;}
  11. /* 重置默认的边距和内边距 */
  12. canvas {
  13. display: block;
  14. width: 100vw; /* 将canvas宽度设置为视口宽度的100% */
  15. height: 100vh; /* 将canvas高度设置为视口高度的100% */
  16. }
  17. .infos {
  18. padding: 5vmin; /* 设置内边距 */
  19. display: grid; /* 通过网格布局显示 */
  20. position: fixed; /* 固定位置 */
  21. top: 0;
  22. left: 0;
  23. }
  24. .infos a {
  25. color: #eee; /* 设置链接颜色为浅灰色 */
  26. }
  27. body{overflow: hidden} /* 隐藏body的滚动条 */
  28. </style>
  29. </head>
  30. <body>
  31. <script type="text/javascript" src="script.js"></script>
  32. <!-- 引入外部JavaScript文件 -->
  33. <canvas></canvas>
  34. <!-- 创建一个canvas元素,用于绘制3D动画 -->
  35. <script type="text/javascript">
  36. "use strict";
  37. // 严格模式声明,有助于捕捉错误和避免不安全的行为
  38. // 引入Babylon.js库中的类
  39. var Engine = BABYLON.Engine, Scene = BABYLON.Scene, ArcRotateCamera = BABYLON.ArcRotateCamera, Vector3 = BABYLON.Vector3, MeshBuilder = BABYLON.MeshBuilder, PBRMaterial = BABYLON.PBRMaterial, PointLight = BABYLON.PointLight, SolidParticleSystem = BABYLON.SolidParticleSystem, SolidParticle = BABYLON.SolidParticle, DefaultRenderingPipeline = BABYLON.DefaultRenderingPipeline;
  40. // 获取canvas元素并创建Babylon.js引擎和场景
  41. var canvas = document.querySelector('canvas');
  42. var engine = new Engine(canvas);
  43. var scene = new Scene(engine);
  44. scene.clearColor.set(0, 0, 0, 1); // 设置场景背景颜色为黑色且完全透明
  45. var camera = new ArcRotateCamera('', -Math.PI / 2, Math.PI / 2, 10, new Vector3(0, 0, 0), scene); // 创建一个围绕物体旋转的相机
  46. camera.fov = Math.PI / 2; // 设置相机的视场角
  47. camera.minZ = 1e-4; // 设置相机的最小Z值
  48. // 创建一个点光源
  49. var light = new PointLight('', new Vector3(0, -1, 0), scene);
  50. light.intensity = 5e3; // 设置光源强度
  51. light.diffuse.set(1, 1, 1); // 设置光源的漫反射颜色为白色
  52. // 创建默认的渲染管线
  53. var pp = new DefaultRenderingPipeline('');
  54. pp.bloomEnabled = true; // 启用Bloom效果,增加图像的亮度和光晕效果
  55. pp.bloomThreshold = 0.2; // 设置Bloom效果的阈值
  56. // 创建一个PBR(基于物理的渲染)材质
  57. var mat = new PBRMaterial('', scene);
  58. mat.roughness = 1; // 设置材质的粗糙度
  59. // 定义随机数生成函数
  60. var urnd = function (a, b) {
  61. if (a === void 0) { a = 0; }
  62. if (b === void 0) { b = 1; }
  63. return a + Math.random() * (b - a);
  64. };
  65. var rnd = function (a, b) {
  66. if (a === void 0) { a = 0; }
  67. if (b === void 0) { b = 1; }
  68. return urnd(a, b) * (Math.random() < 0.5 ? -1 : 1);
  69. };
  70. // 创建一个多面体网格
  71. var box = MeshBuilder.CreatePolyhedron('', { type: 1, sizeX: 0.2, sizeY: 1, sizeZ: 0.2 });
  72. // 创建一个实体粒子系统
  73. var sps = new SolidParticleSystem('', scene);
  74. var vy = new WeakMap(); // 使用WeakMap存储粒子的垂直速度
  75. // 添加形状到粒子系统中,并设置粒子数量
  76. sps.addShape(box, 8e2);
  77. // 初始化粒子
  78. sps.initParticles = function () {
  79. var _a;
  80. var a = 0;
  81. for (var _i = 0, _b = sps.particles; _i < _b.length; _i++) {
  82. var p = _b[_i];
  83. a = rnd(0, Math.PI); // 生成随机角度
  84. p.position.set(5 * Math.sin(a), urnd(-10, 100), 5 * Math.cos(a)); // 设置粒子位置
  85. p.scaling.y = Math.random() * 2 + 1; // 设置粒子在Y轴方向的缩放
  86. (_a = p.color) === null || _a === void 0 ? void 0 : _a.set(Math.random(), Math.random(), 1, 1); // 设置粒子颜色
  87. vy.set(p, Math.random() * 0.1 + 0.1); // 设置粒子的垂直速度
  88. }
  89. };
  90. // 更新粒子位置
  91. sps.updateParticle = function (p) {
  92. p.position.y -= vy.get(p); // 根据速度更新位置
  93. if (p.position.y < -10) { // 如果粒子超出视野范围
  94. p.position.y = 100; // 重置粒子位置
  95. }
  96. return p;
  97. };
  98. // 初始化粒子并构建网格
  99. sps.initParticles();
  100. sps.buildMesh();
  101. // 释放创建的多面体网格
  102. box.dispose();
  103. // 设置粒子系统的网格材质
  104. sps.mesh.material = mat;
  105. // 设置粒子系统的网格旋转
  106. sps.mesh.rotation.set(Math.PI / 2, 0, 0);
  107. // 添加事件监听器以在场景渲染前更新粒子
  108. scene.onBeforeRenderObservable.add(function () { return sps.setParticles(); });
  109. // 添加事件监听器以在窗口大小变化时调整引擎大小
  110. window.onresize = function () { return engine.resize(); };
  111. // 开始渲染循环
  112. engine.runRenderLoop(function () { return scene.render(); });
  113. </script>
  114. </body>
  115. </html>

JS部分

        JS部分的代码很长,发不出来,发在资源处了,在文章顶部也可下载。如果不是免费的,可以私聊我,我直接发给你们。

效果图

总结

        整体而言,这段代码通过Babylon.js库创建了一个具有动态粒子效果的3D场景。粒子系统生成了大量的粒子,这些粒子在场景中随机生成并随时间下落,创建出了一种动态的视觉效果,类似于一个时空隧道。 通过设置相机、光源和材质,页面上呈现出一个具有深度和光照效果的3D环境。此外,通过监听窗口大小变化和渲染循环,确保了动画的流畅性和适应不同设备的显示需求。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/426702
推荐阅读
相关标签
  

闽ICP备14008679号