【HTML】简单制作一个动态3D正方体

 目录

前言

开始

HTML部分

JS部分

CSS部分

效果图

总结


前言

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

 

开始

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

HTML部分

        文档的声明开始于<!DOCTYPE html>,这是一个指令,告诉浏览器这是一个HTML5文档。紧接着,我们有一个<html>标签,它定义了整个HTML文档的根元素,并设置语言属性为英语(lang="en")。

        在<head>部分,我们首先遇到了<meta charset="UTF-8">,这是一个非常重要的设置,因为它告诉浏览器文档的字符编码是UTF-8。UTF-8是一种广泛使用的字符编码,它可以表示世界上几乎所有的字符,这使得网页可以显示多种语言和特殊符号。紧接着是一个<title>标签,它定义了浏览器标签页上显示的标题,这对于搜索引擎优化(SEO)和用户体验都非常重要。此外,<link>标签引入了一个外部的CSS文件,这个文件名为style.css,它包含了网页的样式定义,使得网页更加美观和用户友好。

<!DOCTYPE html> <!-- 声明文档类型为HTML5 -->
<html lang="en"> <!-- 根元素,设置语言为英语 -->
<head>
  <meta charset="UTF-8"> <!-- 设置字符编码为UTF-8,支持多语言 -->
  <title>雷神 Leo</title> <!-- 网页标题,显示在浏览器标签页上 -->
  <link rel="stylesheet" href="./style.css"> <!-- 引入外部CSS文件,用于网页样式设计 -->
</head>
<body>

  <script src='https://cdnjs.cloudflare.com/ajax/libs/three.js/r128/three.min.js'></script> <!-- 引入Three.js库的压缩版,版本为r128,用于3D图形的渲染 -->
  <script src="./script.js"></script> <!-- 引入外部JavaScript文件,该文件包含网页的交互逻辑和动态效果 -->
</body>
</html>

JS部分

        这段代码通过Three.js库创建了一个动态的3D场景,其中包含一个旋转的立方体,其表面颜色会随着时间变化。通过顶点和片元着色器的自定义代码,实现了立方体的动态效果。动画函数animate通过requestAnimationFrame不断更新,保证了动画的平滑和高效。

// 创建一个场景对象,这是所有3D对象的容器
const scene = new THREE.Scene();

// 创建一个透视相机,用于定义视野和观察场景的视角
const camera = new THREE.PerspectiveCamera( 75, window.innerWidth / window.innerHeight, 0.1, 1000 );

// 创建一个WebGL渲染器,用于将3D场景渲染到网页上
const renderer = new THREE.WebGLRenderer();

// 设置渲染器的大小,使其填满整个浏览器窗口
renderer.setSize( window.innerWidth, window.innerHeight );

// 将渲染器的DOM元素添加到网页的body中,这样渲染的内容就会显示在页面上
document.body.appendChild( renderer.domElement );

// 创建一个立方体的几何体对象,大小为1x1x1,每个面有32x32的细分
const geometry = new THREE.BoxGeometry(1, 1, 1, 32, 32, 32);

// 创建一个时钟对象,用于跟踪动画的时间
const clock = new THREE.Clock();

// 创建一个uniforms对象,用于传递时间和其他信息到着色器中
const uniforms = {
  time: { value: clock.getElapsedTime() }
};

// 顶点着色器的GLSL代码,用于处理每个顶点的位置和变换
const vert = `
  // 定义一个varying变量v_uv,用于传递UV坐标到片元着色器
  varying vec2 v_uv;
  
  // 定义一个uniform变量time,用于接收从JavaScript传递的时间信息
  uniform float time;
  
  // 定义一个函数rotation3dY,用于创建一个绕Y轴旋转的3x3矩阵
  mat3 rotation3dY(float angle) {
    float s = sin(angle);
    float c = cos(angle);
    return mat3(
      c, 0.0, -s,
      0.0, 1.0, 0.0,
      s, 0.0, c
    );
  }
  
  // 主函数,用于设置顶点的最终位置和传递UV坐标
  void main () {
    vec3 new_position = position.xyz;
    
    // 使用rotation3dY函数和正弦函数结合顶点的y坐标和时间信息来旋转顶点
    new_position *= rotation3dY(
      3.141 / 2.0 * sin(position.y + time)
    );
    
    // 设置最终的顶点位置
    gl_Position = projectionMatrix * modelViewMatrix * vec4(new_position, 1.0);
    
    // 传递UV坐标到片元着色器
    v_uv = uv;
  }
`;

// 片元着色器的GLSL代码,用于确定最终的像素颜色
const frag = `
  // 定义一个varying变量v_uv,从顶点着色器接收UV坐标
  varying vec2 v_uv;
  
  // 定义一个uniform变量time,用于接收从JavaScript传递的时间信息
  uniform float time;
  
  // 主函数,用于计算每个像素的最终颜色
  void main () {
    vec2 uv = v_uv;
    
    // 根据UV坐标和时间信息计算颜色,蓝色通道会随时间变化产生波动效果
    gl_FragColor = vec4(uv.x, uv.y, 0.5 + 0.5 * sin(time), 1.0);
  }
`;

// 创建一个着色器材质对象,使用顶点和片元着色器代码
const material = new THREE.ShaderMaterial({ 
  uniforms: uniforms, // 传入uniforms对象
  vertexShader: vert, // 顶点着色器代码
  fragmentShader: frag // 片元着色器代码
});

// 创建一个立方体网格对象,包含几何体和材质
const cube = new THREE.Mesh( geometry, material );
scene.add( cube ); // 将立方体添加到场景中

// 设置相机的位置,这里将Z轴坐标设置为2,以便从立方体的外部观察它
camera.position.z = 2;

// 定义一个动画函数,用于更新立方体的旋转和渲染场景
function animate() {
  // 旋转立方体的X、Y和Z轴
  cube.rotation.x += 0.002;
  cube.rotation.y += 0.002;
  cube.rotation.z += 0.002;
  
  // 更新uniforms中的时间信息
  uniforms.time.value = clock.getElapsedTime();
  
  // 循环调用animate函数以持续更新动画,使用requestAnimationFrame来优化性能和平滑度
  requestAnimationFrame( animate );
  
  // 渲染场景和相机,将3D对象显示在网页上
  renderer.render( scene, camera );
}

// 开始动画循环
animate();

CSS部分

       这段CSS代码是一个通用的样式规则,它将应用于HTML文档中的所有元素。具体来说,* 是一个通配符选择器,它表示选择所有元素。{ margin: 0; } 则是设置这些元素的margin(外边距)属性为0。

这意味着,当你在HTML文档中使用这段CSS代码时,它会移除文档中所有元素的默认外边距,使得元素之间的间距为零。这通常用于重置浏览器的默认样式,以便开发者可以更精确地控制网页的布局和设计。

例如,浏览器通常会为某些元素(如<p><h1><h6><ul>等)添加默认的外边距或内边距。如果你希望从零开始创建自己的样式,而不是在浏览器的默认样式基础上进行修改,你可以在CSS文件的顶部使用这个通用规则。

这是一个常见的做法,被称为“reset”或“normalize” CSS,旨在为所有元素提供一个干净的、无样式的起点。然而,需要注意的是,这种方法也有争议,因为它可能会移除一些有用的默认样式,导致后续需要重新添加这些样式。因此,一些开发者更倾向于使用更有针对性的方法来重置或标准化样式。

* { margin: 0; }

真就只有一行

效果图

总结

        上面代码 构建了一个基于Web的3D场景,使用了Three.js库来实现。文档的结构和功能可以概括如下:

  1. 文档类型声明:通过<!DOCTYPE html>指定了文档类型为HTML5,这是创建现代网页的基础。

  2. 语言设置:在<html>标签中,lang="en"属性设置页面内容的主要语言为英语,有助于搜索引擎优化和屏幕阅读器的正确解读。

  3. 头部信息

    • 字符编码<meta charset="UTF-8">设置了页面的字符编码为UTF-8,这是一种广泛使用的国际字符编码,能够表示世界上几乎所有的字符和符号。
    • 网页标题<title>标签定义了网页的标题,即“雷神 Leo”,这个标题会显示在浏览器的标签页上,同时也是搜索引擎结果中的标题。
    • 样式表链接:通过<link>标签引入了外部的CSS文件“style.css”,该文件包含了网页的样式设计,使得页面具有更好的视觉效果和用户界面体验。
  4. 主体内容

    • Three.js库引入:在<body>标签内,首先通过<script>标签引入了Three.js库的压缩版(版本r128),这是一个强大的3D图形库,使得在网页上创建和显示3D内容成为可能。
    • JavaScript逻辑:紧接着,另一个<script>标签引入了“script.js”,这个JavaScript文件包含了创建3D场景的逻辑和动画效果。它定义了一个3D场景、相机、渲染器、几何体、材质以及动画循环函数,使得页面上的3D对象能够动态地渲染和展示。

        整体而言,这个HTML文档通过结合HTML、CSS和JavaScript技术,以及Three.js库,创建了一个具有动态3D图形的交互式网页。用户在访问这个网页时,将看到一个3D场景,场景中的3D对象会随着时间动态变化,提供了视觉上的吸引力和互动性。

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

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

相关文章

智慧展览馆:基于AI智能识别技术的视频智慧监管解决方案

一、建设背景 随着科技的不断进步和社会安全需求的日益增长&#xff0c;展览馆作为展示文化、艺术和科技成果的重要场所&#xff0c;其安全监控系统的智能化升级已成为当务之急。为此&#xff0c;旭帆科技&#xff08;TSINGSEE青犀&#xff09;基于视频智能分析技术推出了展览馆…

Windows下Docker安装Kafka3+集群

编写 docker-compose.yaml 主要参照&#xff1a;https://www.cnblogs.com/wangguishe/p/17563274.html version: "3"services:kafka1:image: bitnami/kafka:3.4.1container_name: kafka1environment:- KAFKA_HEAP_OPTS-Xmx1024m -Xms1024m- KAFKA_ENABLE_KRAFTyes- K…

在s390x架构机器上构建frps/frpc镜像 —— 筑梦之路

源码&#xff1a;GitHub - fatedier/frp: A fast reverse proxy to help you expose a local server behind a NAT or firewall to the internet. # 克隆代码git clone https://github.com/fatedier/frp.git# 切换目录cd frp# 构建frps服务端docker build -t frps:s390x -f …

04 Python进阶:MySQL-PyMySQL

什么是 PyMySQL&#xff1f; PyMySQL 是一个用于 Python 的纯 Python MySQL 客户端库&#xff0c;提供了与 MySQL 数据库进行交互的功能。PyMySQL 允许 Python 开发人员连接到 MySQL 数据库服务器&#xff0c;并执行诸如查询、插入、更新和删除等数据库操作。 以下是 PyMySQL …

MySQL查询数据大小

在 MySQL 数据库中&#xff0c;有一个内置的库叫做 information_schema&#xff0c;该数据库中的 tables 表包含了数据库中所有表的基本信息&#xff0c;tables 表结构如下&#xff1a; 下面介绍几个主要关键字段&#xff1a; TABL_SCHEMA&#xff1a;表所属的数据库名TABLE_N…

使用deepspeed,transformers,safetensor中常见的训练精度,共享权重问题

使用deepspeed可能需要注意精度问题 混合精度&#xff0c;LayerNorm 虽然deepspeed有混合精度训练的功能&#xff0c;但是对于网络上各种奇奇怪怪的代码的DIY转化中&#xff0c;他还是很弱小的。它的精度问题&#xff0c;使用deepspeed如果模型中有部分模型使用的是half精度&a…

0基础如何进入IT行业?

前言 俗话说得好“隔行如隔山”&#xff0c;每个人从事自己陌生的行业都是十分艰难的。但现在网上不是流行一种这样的说法吗&#xff1f;360行&#xff0c;行行转IT。我觉得这个说的真的挺对的&#xff0c;因为从我身边认识的同事确实有很多大学并非是计算机科学专业的&#x…

【项目新功能开发篇】开发编码

作者介绍&#xff1a;本人笔名姑苏老陈&#xff0c;从事JAVA开发工作十多年了&#xff0c;带过大学刚毕业的实习生&#xff0c;也带过技术团队。最近有个朋友的表弟&#xff0c;马上要大学毕业了&#xff0c;想从事JAVA开发工作&#xff0c;但不知道从何处入手。于是&#xff0…

练习 20 Web [HCTF 2018]admin

本题由于GitHub上的源码已经不见了&#xff0c;看了wp也没法复现&#xff0c;只用用保利破解的方式做题。 其他方法还有&#xff1a; Flask Session 伪造 https://blog.csdn.net/qq_46918279/article/details/121294915 暴力破解 打开后看到右上角有菜单栏 然后进入register界…

【THM】Nmap Post Port Scans(后端口扫描)-初级渗透测试

介绍 本房间是 Nmap 系列的最后一个(网络安全简介模块的一部分)。在这个房间中,我们重点关注端口扫描之后的步骤:特别是服务检测、操作系统检测、Nmap脚本引擎和保存扫描结果。 Nmap实时主机发现Nmap基本端口扫描Nmap高级端口扫描Nmap后端口扫描在本系列的第一个房间中,我…

​网络socket编程(二)——面向流的TCP编程及测试(SocketTool)、Wireshark软件使用

目录 一、书接上回&#xff08;select()函数使用注意事项&#xff09; 二、面向流(TCP)的socket编程 2.1 TCP服务端编程和测试 2.1.1 TCP服务器原理流程图 2.1.2 TCP服务端编程实战 2.1.3 测试 2.2 TCP客户端编程和测试 三、Wireshark抓包软件的使用 3.1 Wireshark是什…

vue 数据埋点

最近菜鸟做项目&#xff0c;需要做简单的数据埋点&#xff0c;不是企业级的&#xff0c;反正看渡一的视频&#xff0c;企业级特别复杂&#xff0c;包括但不限于&#xff1a;错误收集、点击地方、用户行为…… 菜鸟的需求就是简单收集一下用户的ip、地址、每个界面的访问时间&a…

doccano标注工具|为机器学习建模做数据标注

目录 一、标记流程 二、配置环境 2.1 安装 2.2 运行doccano 三、案例 3.1 创建项目 3.2 上传数据 3.3 定义标签 3.4 添加成员 3.5 开始标注 3.6 导出数据 3.7 导出数据 doccano doccano是开源的数据…

在ssh 工具 Linux screen会话中使用鼠标进行上下滚动

经过几次发现 除xshell外&#xff0c; WindTerm finalshell MobaXterm 都是进入会话后&#xff0c;发现其界面无法滚动屏幕向上查看 如果想要在Linux screen会话中使用鼠标进行上下滚动。必须首先进入该screen的回滚(scrollback模式)才能进行上下滚动 第一步&#xff…

小白理智进入IT行业

职业测试 &#x1f514; 0基础请先按照以下步骤做一遍&#xff0c;试试自己的毅力 1️⃣ 请在b站搜索王佩丰vba&#xff0c;然后试着看一下 2️⃣ 看完视频&#xff0c;有两种结果 &#x1f62d; 视频看到一半就终止&#xff0c;代码只会复制粘贴。 &#x1f389; 看完全部视…

MHA高可用-解决MySQL主从复制的单点问题

目录 一、MHA的介绍 1&#xff0e;什么是 MHA 2&#xff0e;MHA 的组成 2.1 MHA Node&#xff08;数据节点&#xff09; 2.2 MHA Manager&#xff08;管理节点&#xff09; 3&#xff0e;MHA 的特点 4. MHA工作原理总结如下&#xff1a; 二、搭建 MySQL MHA 实验环境 …

mongoDB 优化(2)索引

执行计划 语法&#xff1a; db.collection_xxx_t.find({"param":"xxxxxxx"}).explain(executionStats) 感觉这篇文章写得很好&#xff0c;可以参考 MongoDB——索引&#xff08;单索引&#xff0c;复合索引&#xff0c;索引创建、使用&#xff09;_mongo …

软考高级架构师:CISC (复杂指令集计算机) 和 RISC (精简指令集计算机)概念和例题

作者&#xff1a;明明如月学长&#xff0c; CSDN 博客专家&#xff0c;大厂高级 Java 工程师&#xff0c;《性能优化方法论》作者、《解锁大厂思维&#xff1a;剖析《阿里巴巴Java开发手册》》、《再学经典&#xff1a;《Effective Java》独家解析》专栏作者。 热门文章推荐&am…

开源博客项目Blog .NET Core源码学习(13:App.Hosting项目结构分析-1)

开源博客项目Blog的App.Hosting项目为MVC架构的&#xff0c;主要定义或保存博客网站前台内容显示页面及后台数据管理页面相关的控制器类、页面、js/css/images文件&#xff0c;页面使用基于layui的Razor页面&#xff08;最早学习本项目就是想学习layui的用法&#xff0c;不过最…

flink1.18源码本地调试环境

01 源码本地调试环境搭建 1. 从github拉取源码创建本地项⽬ https://github.com/apache/flink.git 可以拉取github上官⽅代码 https://github.com/apache/flink.git GitHub - apache/flink: Apache Flink 2. 配置编译环境 ctrlaltshifts &#xff08;或菜单&#xff09;打…