【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动画能够持续播放。
<!doctype html>
<!-- 声明文档类型为HTML5 -->
<html>
<head>
<meta charset="utf-8">
<!-- 设置字符编码为UTF-8 -->
<title>canvas时空隧道</title>
<!-- 页面标题 -->

<style>
*{margin:0;padding:0;}
/* 重置默认的边距和内边距 */
canvas {
  display: block;
  width: 100vw; /* 将canvas宽度设置为视口宽度的100% */
  height: 100vh; /* 将canvas高度设置为视口高度的100% */
}
.infos {
  padding: 5vmin; /* 设置内边距 */
  display: grid; /* 通过网格布局显示 */
  position: fixed; /* 固定位置 */
  top: 0;
  left: 0;
}
.infos a {
  color: #eee; /* 设置链接颜色为浅灰色 */
}
body{overflow: hidden} /* 隐藏body的滚动条 */
</style>
</head>
<body>

<script type="text/javascript" src="script.js"></script>
<!-- 引入外部JavaScript文件 -->

<canvas></canvas>
<!-- 创建一个canvas元素,用于绘制3D动画 -->

<script type="text/javascript">
"use strict";
// 严格模式声明,有助于捕捉错误和避免不安全的行为

// 引入Babylon.js库中的类
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;

// 获取canvas元素并创建Babylon.js引擎和场景
var canvas = document.querySelector('canvas');
var engine = new Engine(canvas);
var scene = new Scene(engine);
scene.clearColor.set(0, 0, 0, 1); // 设置场景背景颜色为黑色且完全透明
var camera = new ArcRotateCamera('', -Math.PI / 2, Math.PI / 2, 10, new Vector3(0, 0, 0), scene); // 创建一个围绕物体旋转的相机
camera.fov = Math.PI / 2; // 设置相机的视场角
camera.minZ = 1e-4; // 设置相机的最小Z值

// 创建一个点光源
var light = new PointLight('', new Vector3(0, -1, 0), scene);
light.intensity = 5e3; // 设置光源强度
light.diffuse.set(1, 1, 1); // 设置光源的漫反射颜色为白色

// 创建默认的渲染管线
var pp = new DefaultRenderingPipeline('');
pp.bloomEnabled = true; // 启用Bloom效果,增加图像的亮度和光晕效果
pp.bloomThreshold = 0.2; // 设置Bloom效果的阈值

// 创建一个PBR(基于物理的渲染)材质
var mat = new PBRMaterial('', scene);
mat.roughness = 1; // 设置材质的粗糙度

// 定义随机数生成函数
var urnd = function (a, b) {
    if (a === void 0) { a = 0; }
    if (b === void 0) { b = 1; }
    return a + Math.random() * (b - a);
};
var rnd = function (a, b) {
    if (a === void 0) { a = 0; }
    if (b === void 0) { b = 1; }
    return urnd(a, b) * (Math.random() < 0.5 ? -1 : 1);
};

// 创建一个多面体网格
var box = MeshBuilder.CreatePolyhedron('', { type: 1, sizeX: 0.2, sizeY: 1, sizeZ: 0.2 });

// 创建一个实体粒子系统
var sps = new SolidParticleSystem('', scene);
var vy = new WeakMap(); // 使用WeakMap存储粒子的垂直速度

// 添加形状到粒子系统中,并设置粒子数量
sps.addShape(box, 8e2);

// 初始化粒子
sps.initParticles = function () {
    var _a;
    var a = 0;
    for (var _i = 0, _b = sps.particles; _i < _b.length; _i++) {
        var p = _b[_i];
        a = rnd(0, Math.PI); // 生成随机角度
        p.position.set(5 * Math.sin(a), urnd(-10, 100), 5 * Math.cos(a)); // 设置粒子位置
        p.scaling.y = Math.random() * 2 + 1; // 设置粒子在Y轴方向的缩放
        (_a = p.color) === null || _a === void 0 ? void 0 : _a.set(Math.random(), Math.random(), 1, 1); // 设置粒子颜色
        vy.set(p, Math.random() * 0.1 + 0.1); // 设置粒子的垂直速度
    }
};

// 更新粒子位置
sps.updateParticle = function (p) {
    p.position.y -= vy.get(p); // 根据速度更新位置
    if (p.position.y < -10) { // 如果粒子超出视野范围
        p.position.y = 100; // 重置粒子位置
    }
    return p;
};

// 初始化粒子并构建网格
sps.initParticles();
sps.buildMesh();

// 释放创建的多面体网格
box.dispose();

// 设置粒子系统的网格材质
sps.mesh.material = mat;

// 设置粒子系统的网格旋转
sps.mesh.rotation.set(Math.PI / 2, 0, 0);

// 添加事件监听器以在场景渲染前更新粒子
scene.onBeforeRenderObservable.add(function () { return sps.setParticles(); });

// 添加事件监听器以在窗口大小变化时调整引擎大小
window.onresize = function () { return engine.resize(); };

// 开始渲染循环
engine.runRenderLoop(function () { return scene.render(); });
</script>
</body>
</html>

JS部分

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

效果图

总结

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【CPA考试】2024注册会计师报名照片尺寸要求解读及手机拍照方法

随着2024年注册会计师考试的临近&#xff0c;众多会计专业人士和学生都开始准备报名参加这一行业的重要考试&#xff0c;报名时间为4月8日至4月30日。报名过程中&#xff0c;一张符合要求的证件照是必不可少的。本文将为您详细解读2024年注册会计师考试报名照片的尺寸要求&…

Kafka基础/1

Kafka 概念 Kafka 是一个分布式的流媒体平台。 应用&#xff1a;消息系统、日志收集、用户行为追踪、流式处理 特点&#xff1a;高吞吐量、消息持久化、高可靠性、高扩展性 术语&#xff1a; broker&#xff1a;Kafka 的服务器&#xff0c;Kafka 当中每一台服务器&#xf…

网络安全---Packet Tracer - 配置扩展 ACL

一、实验目的 在Windows环境下利用Cisco Packet Tracer进行 配置防火墙操作。 二、实验环境 1.Windows10、Cisco Packet Tracer 8.2 2.相关的环境设置 在最初的时候&#xff0c;我们已经得到了搭建好的拓扑模型&#xff0c;利用已经搭建好的拓扑模型&#xff0c;进行后续的…

SOLIDWORKS如何新建定义材质库

SolidWorks材质库中包含了大量的材料选项&#xff0c;涵盖了金属、塑料、橡胶、复合材料等各种类型&#xff0c;每种材料都有详细的特性参数。用户可以根据设计需求&#xff0c;在材质库中选择合适的材料&#xff0c;从而更好地满足设计要求。在有限元分析中&#xff0c;需要附…

【架构师】-- 成长路线图

成长为软件架构师不是一件容易的事&#xff0c;这篇文章列举了架构师需要学习的技术储备&#xff0c;给出了成为软件架构师的路线图&#xff0c;帮助有志于在架构领域成长的同学可以明确学习的方向。原文&#xff1a;Master Plan for becoming a Software Architect[1] 软件架…

easyExcel - 动态复杂表头的编写

目录 前言一、情景介绍二、问题分析三、代码实现方式一&#xff1a;head 设置方式二&#xff1a;模板导出方式三&#xff1a;自定义工具类 前言 Java-easyExcel入门教程&#xff1a;https://blog.csdn.net/xhmico/article/details/134714025 之前有介绍过如何使用 easyExcel&…

LeetCode_144(二叉树前序遍历)

1.递归 public List<Integer> preorderTraversal(TreeNode root) {List<Integer> res new ArrayList<>();accessTree(root,res);return res;}public void accessTree(TreeNode root,List<Integer>res){if(root null){return;}res.add(root.val);acce…

Redis 八种常用数据类型常用命令和应用场景

5 种基础数据类型&#xff1a;String&#xff08;字符串&#xff09;、List&#xff08;列表&#xff09;、Set&#xff08;集合&#xff09;、Hash&#xff08;散列&#xff09;、Zset&#xff08;有序集合&#xff09;。 3 种特殊数据类型&#xff1a;HyperLogLog&#xff0…

计算机视觉——Python OpenCV BGR转HSV

这里将介绍如何使用 OpenCV 与 Python 来作彩色影像转HSV(RGB to HSV 或 BGR to HSV)&#xff0c;在写 Python 影像处理程序时常会用到 OpenCV cvtColor 作颜色空间转换的功能&#xff0c;接下来介绍怎么使用 Python 搭配 OpenCV 模块来进行 RGB/BGR 转 HSV 彩色转HSV空间。 H…

03 Php学习:echo 、 print 、EOF

echo 和 print 在 PHP 中有两个基本的输出方式&#xff1a; echo 和 print。 echo 和 print 区别: echo - 可以输出一个或多个字符串print - 只允许输出一个字符串&#xff0c;返回值总为 1 注意&#xff1a;echo 输出的速度比 print 快&#xff0c; echo 没有返回值&…

VS Code开发插件使用 pnpm 打包异常的解决姿势

前言 刚刚准备发一个插件&#xff0c;发现用 pnpm 打出一个本地插件包直接扑街了。 这里只聚焦错误问题的解决&#xff0c;不是发插件的教程。。 聊点背景信息&#xff0c;vscode 的插件命令行的是 vsce 这个模块提供的 cli 能力去做的 环境 pnpm : 8.x 错误截图 本地打…

C++ Virtual详解

Virtual是C OO机制中很重要的一个关键字。只要是学过C的人都知道在类Base中加了Virtual关键字的函数就是虚拟函数&#xff08;例如函数print&#xff09;&#xff0c;于是在Base的派生类Derived中就可以通过重写虚拟函数来实现对基类虚拟函数的覆盖。当基类Base的指针point指向…

LRU算法的实现

目录 一&#xff0c;LRU算法 二&#xff0c;使用场景 三&#xff0c;LRU算法实现 一&#xff0c;LRU算法 LRU-least recently used-最近最少使用算法&#xff0c;是一种内存数据淘汰策略&#xff0c;使用常见是当内存不足时&#xff0c;需要淘汰最近最少使用的数据。LRU常用…

Mac 安装 brew brew cask 遇到的问题以及解决办法

安装Homebrew和Homebrew Cask是在Mac上管理软件包的常用方法。虽然大多数情况下安装这两个工具是比较简单的&#xff0c;但有时候也可能遇到一些问题。下面是一些常见的问题以及解决办法&#xff1a; 问题1&#xff1a;无法安装Homebrew 解决办法&#xff1a; 1.确保你的Mac已连…

4月9日学习记录

[GXYCTF 2019]禁止套娃 涉及知识点&#xff1a;git泄露&#xff0c;无参数RCE 打开环境&#xff0c;源码什么的都没有&#xff0c;扫描后台看看 扫描发现存在git泄露 用githack下载查看得到一串源码 <?php include "flag.php"; echo "flag在哪里呢&#…

REST API实战演练之JavaScript使用Rest API

咱们前面讲了一下如何创建REST API 假期别闲着&#xff1a;REST API实战演练之创建Rest API-CSDN博客 又讲了java客户端如何使用REST API 假期别闲着&#xff1a;REST API实战演练之客户端使用Rest API-CSDN博客 接下来咱们看看JavaScript怎么使用REST API。 一、新建一个…

swiftui macOS实现加载本地html文件

import SwiftUI import WebKitstruct ContentView: View {var body: some View {VStack {Text("测试")HTMLView(htmlFileName: "localfile") // 假设你的本地 HTML 文件名为 index.html.frame(minWidth: 100, minHeight: 100) // 设置 HTMLView 的最小尺寸…

权威报道 | 百分点科技:《突发事件应急预案管理办法》解读

近日&#xff0c;百分点科技CTO刘译璟作为唯一企业界代表&#xff0c;接受应急领域权威期刊——《中国应急管理》杂志邀请&#xff0c;与中国安全生产科学研究院、中央党校、中国政法大学等单位的专家一起&#xff0c;就《突发事件应急预案管理办法》&#xff08;以下简称《办法…

CLI的使用与IOS基本命令

1、实验目的 通过本实验可以掌握&#xff1a; CLI的各种工作模式个CLI各种编辑命令“?” 和【Tab】键使用方法IOS基本命令网络设备访问限制查看设备的相关信息 2、实验拓扑 CLI的使用与IOS基本命令使用拓扑如下图所示。 3、实验步骤 &#xff08;1&#xff09;CLI模式的切…

Vue3 + Vite 构建组件库发布到 npm

你有构建完组件库后&#xff0c;因为不知道如何发布到 npm 的烦恼吗&#xff1f;本教程手把手教你用 Vite 构建组件库发布到 npm 搭建项目 这里我们使用 Vite 初始化项目&#xff0c;执行命令&#xff1a; pnpm create vite my-vue-app --template vue这里以我的项目 vue3-xm…