跳动的爱心代码--李峋爱心代码(完整源码)

本文章分为两部分:
第一部分为实现效果展示,第二部分是实现跳动爱心源码。
关注微信公众号: 先取个名字吧

跳动的爱心效果展示

在这里插入图片描述
关注微信公众号(先取个名字吧)获取完整源码,回复爱心代码

实现步骤

1.建一个html文件,代码如下:

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><title>爱心跳动,3D拖拽搬</title><link rel="stylesheet" href="./css/style.css"></head><body><script src='./js/three.min.js'></script><!-- <script src='./js/MeshSurfaceSampler.js'></script> --><script src='./js/TrackballControls.js'></script><script src='./js/simplex-noise.js'></script><script src='./js/OBJLoader.js'></script><script src='./js/gsap.min.js'></script><script src="./js/script.js"></script><script>(function () {const _face = new THREE.Triangle();const _color = new THREE.Vector3();class MeshSurfaceSampler {constructor(mesh) {let geometry = mesh.geometry;if (!geometry.isBufferGeometry || geometry.attributes.position.itemSize !== 3) {throw new Error('THREE.MeshSurfaceSampler: Requires BufferGeometry triangle mesh.');}if (geometry.index) {console.warn('THREE.MeshSurfaceSampler: Converting geometry to non-indexed BufferGeometry.');geometry = geometry.toNonIndexed();}this.geometry = geometry;this.randomFunction = Math.random;this.positionAttribute = this.geometry.getAttribute('position');this.colorAttribute = this.geometry.getAttribute('color');this.weightAttribute = null;this.distribution = null;}setWeightAttribute(name) {this.weightAttribute = name ? this.geometry.getAttribute(name) : null;return this;}build() {const positionAttribute = this.positionAttribute;const weightAttribute = this.weightAttribute;const faceWeights = new Float32Array(positionAttribute.count / 3); // Accumulate weights for each mesh face.for (let i = 0; i < positionAttribute.count; i += 3) {let faceWeight = 1;if (weightAttribute) {faceWeight = weightAttribute.getX(i) + weightAttribute.getX(i + 1) + weightAttribute.getX(i + 2);}_face.a.fromBufferAttribute(positionAttribute, i);_face.b.fromBufferAttribute(positionAttribute, i + 1);_face.c.fromBufferAttribute(positionAttribute, i + 2);faceWeight *= _face.getArea();faceWeights[i / 3] = faceWeight;} // Store cumulative total face weights in an array, where weight index// corresponds to face index.this.distribution = new Float32Array(positionAttribute.count / 3);let cumulativeTotal = 0;for (let i = 0; i < faceWeights.length; i++) {cumulativeTotal += faceWeights[i];this.distribution[i] = cumulativeTotal;}return this;}setRandomGenerator(randomFunction) {this.randomFunction = randomFunction;return this;}sample(targetPosition, targetNormal, targetColor) {const cumulativeTotal = this.distribution[this.distribution.length - 1];const faceIndex = this.binarySearch(this.randomFunction() * cumulativeTotal);return this.sampleFace(faceIndex, targetPosition, targetNormal, targetColor);}binarySearch(x) {const dist = this.distribution;let start = 0;let end = dist.length - 1;let index = - 1;while (start <= end) {const mid = Math.ceil((start + end) / 2);if (mid === 0 || dist[mid - 1] <= x && dist[mid] > x) {index = mid;break;} else if (x < dist[mid]) {end = mid - 1;} else {start = mid + 1;}}return index;}sampleFace(faceIndex, targetPosition, targetNormal, targetColor) {let u = this.randomFunction();let v = this.randomFunction();if (u + v > 1) {u = 1 - u;v = 1 - v;}_face.a.fromBufferAttribute(this.positionAttribute, faceIndex * 3);_face.b.fromBufferAttribute(this.positionAttribute, faceIndex * 3 + 1);_face.c.fromBufferAttribute(this.positionAttribute, faceIndex * 3 + 2);targetPosition.set(0, 0, 0).addScaledVector(_face.a, u).addScaledVector(_face.b, v).addScaledVector(_face.c, 1 - (u + v));if (targetNormal !== undefined) {_face.getNormal(targetNormal);}if (targetColor !== undefined && this.colorAttribute !== undefined) {_face.a.fromBufferAttribute(this.colorAttribute, faceIndex * 3);_face.b.fromBufferAttribute(this.colorAttribute, faceIndex * 3 + 1);_face.c.fromBufferAttribute(this.colorAttribute, faceIndex * 3 + 2);_color.set(0, 0, 0).addScaledVector(_face.a, u).addScaledVector(_face.b, v).addScaledVector(_face.c, 1 - (u + v));targetColor.r = _color.x;targetColor.g = _color.y;targetColor.b = _color.z;}return this;}}THREE.MeshSurfaceSampler = MeshSurfaceSampler;})();</script><script>(function () {const _object_pattern = /^[og]\s*(.+)?/; // mtllib file_referenceconst _material_library_pattern = /^mtllib /; // usemtl material_nameconst _material_use_pattern = /^usemtl /; // usemap map_nameconst _map_use_pattern = /^usemap /;const _vA = new THREE.Vector3();const _vB = new THREE.Vector3();const _vC = new THREE.Vector3();const _ab = new THREE.Vector3();const _cb = new THREE.Vector3();function ParserState() {const state = {objects: [],object: {},vertices: [],normals: [],colors: [],uvs: [],materials: {},materialLibraries: [],startObject: function (name, fromDeclaration) {// If the current object (initial from reset) is not from a g/o declaration in the parsed// file. We need to use it for the first parsed g/o to keep things in sync.if (this.object && this.object.fromDeclaration === false) {this.object.name = name;this.object.fromDeclaration = fromDeclaration !== false;return;}const previousMaterial = this.object && typeof this.object.currentMaterial === 'function' ? this.object.currentMaterial() : undefined;if (this.object && typeof this.object._finalize === 'function') {this.object._finalize(true);}this.object = {name: name || '',fromDeclaration: fromDeclaration !== false,geometry: {vertices: [],normals: [],colors: [],uvs: [],hasUVIndices: false},materials: [],smooth: true,startMaterial: function (name, libraries) {const previous = this._finalize(false); // New usemtl declaration overwrites an inherited material, except if faces were declared// after the material, then it must be preserved for proper MultiMaterial continuation.if (previous && (previous.inherited || previous.groupCount <= 0)) {this.materials.splice(previous.index, 1);}const material = {index: this.materials.length,name: name || '',mtllib: Array.isArray(libraries) && libraries.length > 0 ? libraries[libraries.length - 1] : '',smooth: previous !== undefined ? previous.smooth : this.smooth,groupStart: previous !== undefined ? previous.groupEnd : 0,groupEnd: - 1,groupCount: - 1,inherited: false,clone: function (index) {const cloned = {index: typeof index === 'number' ? index : this.index,name: this.name,mtllib: this.mtllib,smooth: this.smooth,groupStart: 0,groupEnd: - 1,groupCount: - 1,inherited: false};cloned.clone = this.clone.bind(cloned);return cloned;}};this.materials.push(material);return material;},currentMaterial: function () {if (this.materials.length > 0) {return this.materials[this.materials.length - 1];}return undefined;},_finalize: function (end) {const lastMultiMaterial = this.currentMaterial();if (lastMultiMaterial && lastMultiMaterial.groupEnd === - 1) {lastMultiMaterial.groupEnd = this.geometry.vertices.length / 3;lastMultiMaterial.groupCount = lastMultiMaterial.groupEnd - lastMultiMaterial.groupStart;lastMultiMaterial.inherited = false;} // Ignore objects tail materials if no face declarations followed them before a new o/g started.if (end && this.materials.length > 1) {for (let mi = this.materials.length - 1; mi >= 0; mi--) {if (this.materials[mi].groupCount <= 0) {this.materials.splice(mi, 1);}}} // Guarantee at least one empty material, this makes the creation later more straight forward.if (end && this.materials.length === 0) {this.materials.push({name: '',smooth: this.smooth});}
.....
</body></html>
  1. 建立一个css文件
body {background: rgb(0, 0, 0);overflow: hidden;margin: 0;/* background-color: #000 !important; */
}
  1. 运行html文件
    在这里插入图片描述

获取源码直接运行

在这里插入图片描述

关注微信公众号「 先取个名字吧
更多惊喜等待你的发掘

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

火爆了的爱心代码

请下载Visual Studio Code或者HBuilder&#xff08;我最喜欢用这个因为是中文版的&#xff09;复制然后粘贴之后用浏览器运行就行然后也可以复制出来发到微信手机也可以打开 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML> &l…

跳动爱心代码-李峋爱心代码(手把手教学)

电视剧 点燃我&#xff0c;温暖你 打火机与公主裙 李洵爱心跳动效果。 获取完整代码&#xff0c;公众号「先取个名字吧」 回复爱心代码。 本文分为两种方式讲解如何运行代码&#xff0c;第一种方式比较简单推荐新手&#xff08;完全不懂编程的&#xff09;&#xff0c;第二种…

chatgpt赋能python:Python怎么让输出结果用空格断开

Python怎么让输出结果用空格断开 介绍 Python是一种高级编程语言&#xff0c;语法简洁、易读、易维护&#xff0c;非常适合初学者和中级开发者。在Python编程中&#xff0c;我们经常需要输出结果&#xff0c;而如果我们需要让输出结果用空格断开&#xff0c;该怎么做呢&#…

chatgpt智能提效职场办公-ppt怎么转pdf文件

作者&#xff1a;虚坏叔叔 博客&#xff1a;https://xuhss.com 早餐店不会开到晚上&#xff0c;想吃的人早就来了&#xff01;&#x1f604; 要将PPT转为PDF文件&#xff0c;可以按照以下步骤操作&#xff1a; 1.打开PPT文件&#xff0c;点击“文件”菜单&#xff0c;选择“导出…

善借ChatGPT提效,Cursor四问答设计业务简一概念模型示例

作为一个程序员&#xff0c;对新事物不好奇&#xff0c;没有学习新技术的自觉意识&#xff0c;不知道如何更好地运用工具来提升自己的效率&#xff0c;又如何保持自己的竞争力呢 上一次文字创作&#xff1a;梦&#xff0c;仰望星空&#xff1b;路&#xff0c;脚踏实地 今天看…

chatgpt赋能python:Python游戏——一场崭新的冒险

Python游戏——一场崭新的冒险 Python作为一种简单易用的编程语言&#xff0c;已被广泛应用于各种领域。其中&#xff0c;Python游戏开发逐渐成为了热门话题。通过使用Python语言&#xff0c;我们可以轻松地创建各种有趣的游戏。在本文中&#xff0c;我们将一起探讨Python游戏…

人工智能已经到来,但这项技术在 2023 年面临重大挑战

来源&#xff1a;ScienceAI 尽管人工智能已经出现在我们的生活中多年&#xff0c;但 2022 年是该技术的主要试验场。在 ChatGPT、AI 艺术一代和拥抱 AI 的好莱坞之间&#xff0c;AI 在公众中找到了一种新的立足点和炒作。但随之而来的是对隐私和道德的新一轮担忧。 美国东北大学…

大模型与人类的未来 | 基于认知神经科学的大模型论坛精彩回顾

导读 6 月 10 日&#xff0c;智源大会“基于认知神经科学的大模型论坛”召开&#xff0c;本次论坛邀请到了认知神经、脑科学领域非常有建树的专家&#xff0c;深度讨论大模型的能力与局限性&#xff0c;包括对未来人工智能发展方向的讨论。论坛主席是清华大学脑与智能实验室首席…

大语言模型的创意能力到底几何?探索从GPT-2到GPT-4的演进

编者按&#xff1a;大语言模型可以提供许多创意性内容&#xff0c;如写诗、写小说等。那么到底应该如何评估大语言模型生成的创意性内容的水平呢&#xff1f; 本文探讨了GPT-2到GPT-4的创造性&#xff0c;并分析了这些模型在不同创造性测试中的表现。作者使用了三种测试来衡量模…

【EmailCamel外贸邮件群发】一对一发送,投递率高

说到邮件群发可能有很多客户会理解为&#xff0c;如在QQ里可以加多人的邮箱进行邮件群发&#xff0c;这样收件人看到的这封邮件是群发邮件&#xff0c;可以看到其它的收件人。EmailCamel外贸邮件群发&#xff0c;是模拟人工手动一对一发送&#xff0c;客户收到邮件和通过手动发…

【EmailCamel外贸邮件群发】让邮件不进入垃圾邮件箱的实用方法-建立独立发信域!

很多人不知道邮件为什么会进垃圾箱&#xff1f;之前写过一篇文章“邮件到达收件箱系列文章16&#xff1a;企业邮箱发邮件进垃圾箱怎么办?” 。里面提到了5个建议。今天我们再介绍从硬件方面&#xff0c;如何减少进垃圾箱&#xff01; 做外贸避免不了需要群发开发信&#xff08…

他居然发邮件请我去吃饭——邮件伪造那些事儿

他居然发邮件请我去吃饭——邮件伪造那些事儿 今天中午吃午饭的时候&#xff0c;突然收到一封邮件&#xff0c;我一看&#xff0c;不得了啊&#xff0c;居然是美国前总统给我发来的邮件&#xff0c;还说要我助他一臂之力成为新总统。下午再看他的新闻&#xff0c;感觉他现在都自…

邮件代发、国外邮件代发、外贸邮件代发平台,送达率、打开率高的秘密

邮件营销、邮件推广已发展几十年了&#xff0c;对于一家企业而言邮件营销也是必须的。比如新产品推广、价格折扣、活动推广、交易类邮件、跟进邮件、客户关怀等都离不开邮件。它是开发客户、维系客户的重要渠道之一。 对于外贸企业、出海企业而言&#xff0c;邮件&#xff08;…

做外贸业务发邮件时邮件被退信,是什么原因?

客户咨询&#xff1a; 答: 从对方服务器的提示来看&#xff0c;是对方的该邮件地址不存在了&#xff0c;因为时隔一个月&#xff0c;该员工可能离职&#xff0c;或者其它原因&#xff0c;该邮件地址账号已从服务器上删除了。 发邮件&#xff0c;邮件提示是最好的说明。针对上面…

如何进行邮件群发营销?外贸邮件怎么进行邮件群发推广?

众所周知&#xff0c;国际业务往来都要依靠邮件收发。对于创业公司来说&#xff0c;常常要开发、拓展客户&#xff0c;让客户了解我们的产品和提供的服务。在拓展客户阶段&#xff0c;需要给客户提供到资料&#xff0c;但是一封一封邮件发送太慢了&#xff0c;所以可以选择群发…

春节期间外贸老鸟们都会掌握的那些事(内含祝福话术及邮件模板)

中国外贸规模在长期疫情的大环境下&#xff0c;外贸业界克服诸多困难&#xff0c;实现了量稳质升。随着我们迈入2023年&#xff0c;外贸人除了需要继续“强身健体”外&#xff0c;同时也将面临更多的挑战&#xff0c;本期Boom将从四个维度给大家分享临近中国春节期间&#xff0…

外贸开发信群发邮件打开率PK进垃圾箱?

PK赛&#xff0c;外贸开发信群发应该关注是否到达垃圾箱还是更应该关注客户邮件打开率&#xff1f; 部分客户所持观点&#xff1a;EmailCamel提供海外群邮试用版&#xff0c;有些客户拿到试用版后&#xff0c;给自己的gmail,hotmail或者企业邮箱发邮件&#xff0c;发现进垃圾箱…

如何做好外贸邮件营销?记住这几件不要!

在生活中&#xff0c;说起外贸邮件营销&#xff0c;我相信很多人都会说这个我也会&#xff0c;但是问道如何做好外贸邮件营销&#xff0c;相信不少人都没有像前面那样自信说会了吧。那么&#xff0c;如何做好外贸邮件营销呢&#xff1f;下面就让摩杜云小杜来跟大家详细的介绍一…

外贸邮件常用的一些标准表达

Loop sb. in 把某人拉进&#xff08;对话/邮件/圈子&#xff09; To make or keep one informed about something. eg. please loop me in on any developments. eg. I would like to loop the xxx team in for further assistance. Could you please advise on xxx 请你对…

推荐一款好用的外贸公司邮件群发软件,你想要了解的都在这里

外贸企业、外贸工厂或者SOHO发开发信越来越难了! 为什么越来越难发了&#xff1f; 1. 发开发信是通过邮件技术&#xff0c;而邮件技术已发展50年了。世界上第一封邮件由美国BBN公司工程师Tomlinson 在 1971 年发送。先后出现了海内外各种邮件服务提供商&#xff0c;比如海外的…