Three.js实现3D动态心形与粒子背景的数学与代码映射解析

news2025/1/31 11:34:50

一、效果概述

本文通过Three.js构建了一个具有科技感的3D场景,主要包含两大视觉元素:

  • 动态心形模型:采用数学函数生成基础形状,通过顶点操作实现表面弧度。
  • 星空粒子背景:随机分布的粒子群组形成空间层次感。
  • 复合动画系统:包含心跳脉冲、轴向旋转、粒子场运动等动画效果。
    视觉效果:

超酷3D心形粒子特效,浪漫满分!

二、核心技术实现原理

2.1,心形建模算法

心形建模算法利用了经典的心形参数方程,通过数学公式生成心形路径。该方程定义了心形在二维平面上的轮廓,其中 (x(t) = 16\sin^3 t) 和 (y(t) = 13\cos t - 5\cos 2t - 3\cos 3t - \cos 4t)。这些公式通过参数 (t) 描述了心形的曲线形状,随着 (t) 从0到 (2\pi) 的变化,生成一个完整的心形轮廓。这个路径随后被用于创建三维几何体,通过Three.js的ExtrudeGeometry进行挤出,形成一个具有深度和曲面弧度的3D心形模型。

2.1.1,心形参数方程

代码中采用经典心形线参数方程,其数学表达式为:
在这里插入图片描述
其中 t∈[0,2π]t∈[0,2π],步长0.01决定曲线精度。该方程相比标准心形方程 r=a(1−sinθ)r=a(1−sinθ) 能生成更圆润的边界曲线。

2.1.2,代码实现

function createHeartShape() {
    const shape = new THREE.Shape();
    for (let t = 0; t <= Math.PI*2; t += 0.01) {
        const x = 16 * Math.pow(Math.sin(t), 3);
        const y = 13*Math.cos(t) - 5*Math.cos(2*t) - 3*Math.cos(3*t) - Math.cos(4*t);
        // 路径绘制...
    }
    return shape;
}

2.1.3,原理说明

该方程通过多项式组合控制曲线形态,相比标准心形方程:

  • 5cos2t 项控制心形凹陷深度
  • 3cos3t 调整顶部曲率
  • cos4t 消除底部尖角
    代码中t += 0.01的步长值决定了曲线精度(约628个顶点)

2.2,三维挤出变换

2.2.1,变换矩阵

通过ExtrudeGeometry实现2D到3D转换时,运用了仿射变换矩阵:
在这里插入图片描述

2.2.2,代码实现

const extrudeSettings = {
    depth: 8,              // 挤出深度
    bevelEnabled: true,    // 启用倒角
    bevelSegments: 12      // 倒角细分
};
geometry.scale(0.5, 0.5, 0.5);

2.2.3,原理说明

  • depth:8 沿Z轴挤出8个单位
  • bevelSegments:12 使用12段圆弧平滑边缘
  • 缩放矩阵将模型整体缩小50%,避免场景过载

2.3. 表面弧度算法

2.3.1,曲面变形公式:

在这里插入图片描述

2.3.2,代码实现

function addSurfaceCurvature(geometry) {
    const position = geometry.attributes.position;
    for (let i = 0; i < position.count; i++) {
        const x = position.getX(i);
        const y = position.getY(i);
        const z = position.getZ(i) + 0.01 * Math.sqrt(x*x + y*y);
        position.setXYZ(i, x, y, z);
    }
    geometry.computeVertexNormals();
}

2.3.3,原理说明

  • 0.01为曲率系数,值越大曲面越凸
  • 法线重计算确保光照反射正确,算法复杂度为O(n)
  • 该变形等效于将平面映射到旋转抛物面:
    在这里插入图片描述
    其中 p=25 控制抛物面开口大小。

2.4,动画系统

2.4.1,心跳脉冲函数数学公式:

在这里插入图片描述

2.4.2,代码实现

// 在animate()函数中
const pulse = Math.sin(time * 3) * 0.2 + 1;
heart.scale.set(pulse, pulse, pulse);

2.4.3,原理说明

  • 频率参数3:每秒完成3/(2π)≈0.477次心跳
  • 振幅0.2:尺寸在0.8~1.2倍之间波动
  • 基准值1:确保缩放不出现负值

2.5,粒子系统

粒子系统的实现通过使用Three.js的BufferGeometry来优化性能和内存使用。我们生成了1500个粒子,每个粒子的坐标在 [−50,50的范围内均匀分布,这意味着每个坐标轴上的位置是随机的。这样,粒子的平均密度为 0.015 粒子/单位立方体。BufferGeometry的使用相比于传统的Geometry减少了约70%的内存占用,因为它允许直接在GPU上存储和操作顶点数据,从而提高了渲染效率和性能。这种方法特别适合于需要处理大量粒子的场景,如模拟星空或烟雾效果。

2.5.1,位置随机分布函数

在这里插入图片描述

2.5.2,代码实现

for (let i = 0; i < 1500; i++) {
    positions.push(
        (Math.random() - 0.5) * 100, // x
        (Math.random() - 0.5) * 100, // y 
        (Math.random() - 0.5) * 100  // z
    );
}

2.5.3,原理说明,

  • U(-50,50)表示均匀分布
  • 粒子数1500时,平均密度为:
    在这里插入图片描述
  • 使用BufferGeometry减少内存占用约70%(相比普通Geometry)

三、光照模型实现

在光照模型中,点光源的衰减通过物理模型来实现,使得光源的强度随着距离的增加而减弱。在Three.js中,可以通过配置点光源的初始强度和衰减半径来实现这一效果。在代码中,new THREE.PointLight(0xff77aa, 1, 50) 设置了光源的初始强度为1,衰减半径为50。这意味着当距离达到50时,光照强度会减弱到一半。这种衰减模型使得光源在场景中更具真实感,模拟了现实中光线随着距离减弱的效果。,

3.1,点光源衰减物理公式:

在这里插入图片描述

3.2,代码实现

new THREE.PointLight(0xff77aa, 1, 50) // distance=50

四、性能优化

4.1,矩阵更新优化渲染循环:

function animate() {
    requestAnimationFrame(animate);
    // 仅更新变换矩阵
    renderer.render(scene, camera); 
}

4.2,原理说明

  • Three.js采用矩阵惰性更新机制
  • 当修改object.position等属性时,仅标记需要更新矩阵
  • 在渲染前统一计算世界矩阵,复杂度从O(n²)降至O(n)

五、扩展应用示例

5.1,数学原理

实时修改曲率系数k时,顶点位置更新公式:
在这里插入图片描述

5.2,代码实现

// 添加GUI控件
const gui = new dat.GUI();
gui.add(curveParams, 'factor', 0, 0.05).onChange(v => {
    heart.traverse(child => {
        if (child.isMesh) {
            addSurfaceCurvature(child.geometry, v);
        }
    });
});

六,总结

本文利用Three.js实现了一个3D曲面爱心动画,包含场景初始化、光源配置、心形模型创建、粒子背景生成和动画效果。通过数学公式生成心形路径,并使用ExtrudeGeometry进行三维挤出,形成具有曲面弧度的心形模型。添加环境光和双色点光源提供立体照明,利用BufferGeometry和PointsMaterial创建动态粒子背景,模拟星空效果。动画部分实现了心形的脉动和旋转,以及粒子背景的缓慢运动,并通过监听窗口大小变化实现响应式设计,确保在不同设备上正常显示。
任何问题,源码获取请私信留言。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

linux asio网络编程理论及实现

最近在B站看了恋恋风辰大佬的asio网络编程&#xff0c;质量非常高。在本章中将对ASIO异步网络编程的整体及一些实现细节进行完整的梳理&#xff0c;用于复习与分享。大佬的博客&#xff1a;恋恋风辰官方博客 Preactor/Reactor模式 在网络编程中&#xff0c;通常根据事件处理的触…

多目标优化策略之一:非支配排序

多目标优化策略中的非支配排序是一种关键的技术,它主要用于解决多目标优化问题中解的选择和排序问题,确定解集中的非支配解(也称为Pareto解)。 关于什么是多目标优化问题,可以查看我的文章:改进候鸟优化算法之五:基于多目标优化的候鸟优化算法(MBO-MO)-CSDN博客 多目…

电子电气架构 --- 在智能座舱基础上定义人机交互

我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 简单&#xff0c;单纯&#xff0c;喜欢独处&#xff0c;独来独往&#xff0c;不易合同频过着接地气的生活…

Autosar-Os是怎么运行的?(时间保护)

写在前面&#xff1a; 入行一段时间了&#xff0c;基于个人理解整理一些东西&#xff0c;如有错误&#xff0c;欢迎各位大佬评论区指正&#xff01;&#xff01;&#xff01; 1.功能概述 AUTOSAR OS 的四大可定制类型凸显了时间保护&#xff08;Timing Protection&#xff09;…

一种用于低成本水质监测的软传感器开源方法:以硝酸盐(NO3⁻)浓度为例

论文标题 A Soft Sensor Open-Source Methodology for Inexpensive Monitoring of Water Quality: A Case Study of NO3− Concentrations 作者信息 Antonio Jess Chaves, ITIS Software, University of Mlaga, 29071 Mlaga, Spain Cristian Martn, ITIS Software, Universi…

5分钟带你获取deepseek api并搭建简易问答应用

目录 1、获取api 2、获取base_url和chat_model 3、配置模型参数 方法一&#xff1a;终端中临时将加入 方法二&#xff1a;创建.env文件 4、 配置client 5、利用deepseek大模型实现简易问答 deepseek-v3是截止博文撰写之日&#xff0c;无论是国内还是国际上发布的大模型中…

算法基础学习——二分查找(附带Java模板)

有单调性的数列一定可以使用二分&#xff0c;没有单调性的题目也可能可以使用二分&#xff1b; &#xff08;一&#xff09;整数二分 二分的本质&#xff1a; 在某个整数区间内&#xff0c;存在某种性质使得区间内左半边的数都不满足该性质&#xff1b;而右半边的数都满足该性…

python-leetcode-路径总和

112. 路径总和 - 力扣&#xff08;LeetCode&#xff09; # Definition for a binary tree node. # class TreeNode: # def __init__(self, val0, leftNone, rightNone): # self.val val # self.left left # self.right right class Solution:de…

乐理笔记——DAY01

三分钟音乐社视频地址&#xff1a; 【四川音乐学院作曲硕士】零基础自学音乐学乐理合集-第二季&#xff08;最终版&#xff09;/已完结https://www.bilibili.com/video/BV14p4y1e7TV?spm_id_from333.788.videopod.episodes&vd_source0a2d366696f87e241adc64419bf12cab&am…

使用DeepSeek技巧:提升内容创作效率与质量

一、引言 在当今快节奏的数字时代&#xff0c;内容创作的需求不断增加&#xff0c;无论是企业营销、个人博客还是学术研究&#xff0c;高效且高质量的内容生成变得至关重要。DeepSeek作为一款先进的人工智能写作助手&#xff0c;凭借其强大的语言生成能力&#xff0c;为创作者…

视频编辑系列——Shotcut如何裁切视频黑边并放大画面导出

会议录屏经常出现不满屏的现象&#xff08;图1&#xff09;&#xff0c;通过本方法可以调整为图2。 图1 图2 打开shotcut&#xff0c;将待裁剪视频导入&#xff0c;将视频拖到时间线。顶部菜单栏点击“滤镜”&#xff0c;新建一个“尺寸、位置与旋转”的滤镜&#xff0c;然后…

FastAPI + GraphQL + SQLAlchemy 实现博客系统

本文将详细介绍如何使用 FastAPI、GraphQL&#xff08;Strawberry&#xff09;和 SQLAlchemy 实现一个带有认证功能的博客系统。 技术栈 FastAPI&#xff1a;高性能的 Python Web 框架Strawberry&#xff1a;Python GraphQL 库SQLAlchemy&#xff1a;Python ORM 框架JWT&…

昆仑万维Java开发面试题及参考答案

进程和线程的区别是什么? 进程和线程都是操作系统中非常重要的概念,它们在多个方面存在显著的区别。 从定义上看,进程是操作系统进行资源分配和调度的基本单位。每个进程都有自己独立的内存空间,包括代码段、数据段、堆栈段等。例如,当你在电脑上同时打开浏览器和音乐播放…

DeepSeek R1-Zero vs. R1:强化学习推理的技术突破与应用前景

&#x1f4cc; 引言&#xff1a;AI 推理的新时代 近年来&#xff0c;大语言模型&#xff08;LLM&#xff09; 的规模化扩展成为 AI 研究的主流方向。然而&#xff0c;LLM 的扩展是否真的能推动 通用人工智能&#xff08;AGI&#xff09; 的实现&#xff1f;DeepSeek 推出的 R1…

Linux《基础指令》

在之前的Linux《Linux简介与环境的搭建》当中我们已经初步了解了Linux的由来和如何搭建Linux环境&#xff0c;那么接下来在本篇当中我们就要来学习Linux的基础指令。在此我们的学习是包括两个部分&#xff0c;即指令和关于Linux的基础知识&#xff1b;因此本篇指令和基础知识的…

DeepSeek-R1 模型及GRPO算法学习

总结DeepSeek-R1 模型算法&#xff0c;并对其中的GRPO算法做一些学习补充。 DeepSeek-R1 论文总结 提出了通过强化学习提升大语言模型推理能力的方法&#xff0c;开发出 DeepSeek-R1-Zero 和 DeepSeek-R1 模型&#xff0c;在多个推理任务上表现出色&#xff0c;并开源模型推动…

爬虫基础(二)Web网页的基本原理

一、网页的组成 网页由三部分构成&#xff1a;HTML、JavaScript、CSS。 &#xff08;1&#xff09;HTML HTML 相当于网页的骨架&#xff0c;它通过使用标签来定义网页内容的结构。 举个例子&#xff1a; 它把图片标签为img、把视频标签为video&#xff0c;然后组合到一个界面…

Kotlin开发(六):Kotlin 数据类,密封类与枚举类

引言 想象一下&#xff0c;你是个 Kotlin 开发者&#xff0c;敲着代码忽然发现业务代码中需要一堆冗长的 POJO 类来传递数据。烦得很&#xff1f;别急&#xff0c;Kotlin 贴心的 数据类 能帮你自动生成 equals、hashCode&#xff0c;直接省时省力&#xff01;再想想需要多种状…

openssl 生成证书 windows导入证书

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 源码指引&#xff1a;github源…

AJAX笔记入门篇

黑马程序员视频地址&#xff1a; 黑马程序员前端AJAX入门到实战全套教程https://www.bilibili.com/video/BV1MN411y7pw?vd_source0a2d366696f87e241adc64419bf12cab&spm_id_from333.788.videopod.episodes&p2https://www.bilibili.com/video/BV1MN411y7pw?vd_source…