three.js 实现一个心形的着色器

news2024/10/24 5:18:57

three.js 实现一个心形的着色器

源链接:https://z2586300277.github.io/three-cesium-examples/#/codeMirror?navigation=ThreeJS&classify=shader&id=heartShader

国内站点预览:http://threehub.cn

github地址: https://github.com/z2586300277/three-cesium-examples

在这里插入图片描述

import * as THREE from 'three'
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls.js'
import { UnrealBloomPass } from 'three/examples/jsm/postprocessing/UnrealBloomPass.js';
import { EffectComposer } from 'three/examples/jsm/postprocessing/EffectComposer.js';
import { RenderPass } from 'three/examples/jsm/postprocessing/RenderPass.js';

const box = document.getElementById('box')

const scene = new THREE.Scene()

const camera = new THREE.PerspectiveCamera(75, box.clientWidth / box.clientHeight, 0.1, 1000)

camera.position.set(0, 0, 20)

const renderer = new THREE.WebGLRenderer()

renderer.setSize(box.clientWidth, box.clientHeight)

box.appendChild(renderer.domElement)

new OrbitControls(camera, renderer.domElement)

const composer = new EffectComposer(renderer);

const renderPass = new RenderPass(scene, camera);

composer.addPass(renderPass);

const bloomPass = new UnrealBloomPass(new THREE.Vector2(window.innerWidth, window.innerHeight), 5, 1.2, 0)

composer.addPass(bloomPass);

window.onresize = () => {

    renderer.setSize(box.clientWidth, box.clientHeight)

    camera.aspect = box.clientWidth / box.clientHeight

    camera.updateProjectionMatrix()

}

class HeartCurve extends THREE.Curve {
    constructor(scale = 1) {
        super();
        this.scale = scale;
    }

    getPoint(a, optionalTarget = new THREE.Vector3()) {
        const t = a * Math.PI * 2;
        const tx = 16 * Math.pow(Math.sin(t), 3);
        const ty = 13 * Math.cos(t) - 5 * Math.cos(2 * t) - 2 * Math.cos(3 * t) - Math.cos(4 * t);
        const tz = 0;

        return optionalTarget.set(tx, ty, tz).multiplyScalar(this.scale);
    }
}

const geometry = new THREE.TubeGeometry(new HeartCurve(0.5), 100, 0.1, 30, false);

const vertexShader = `
    varying vec2 vUv;
    void main(void) {
        vUv = uv;
        gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
    }`;
const fragmentShader = `
    varying vec2 vUv;
    uniform float uSpeed;
    uniform float uTime;
    uniform vec2 uFade;
    uniform vec3 uColor;
    uniform float uDirection;
    void main() {
    vec3 color =uColor;
    float s=0.0;
    float v=0.0;
    if(uDirection==1.0){
    v=vUv.x;
    s=-uTime*uSpeed;
    }else{
    v= -vUv.x;
    s= -uTime*uSpeed;
    }
    float d=mod(  (v + s) ,1.0) ;
    if(d>uFade.y)discard;
    else{
    float alpha = smoothstep(uFade.x, uFade.y, d);
    if (alpha < 0.0001) discard;
    gl_FragColor =  vec4(color,alpha);
    }
} `;

const getMaterial = (uniforms) => {
    return new THREE.ShaderMaterial({
        uniforms,
        vertexShader,
        fragmentShader,
        transparent: true
    });
}

const material1 = getMaterial({
    uColor: { value: new THREE.Color('pink') },
    uTime: { value: 0 },
    uDirection: { value: 1 },
    uSpeed: { value: 1 },
    uFade: { value: new THREE.Vector2(0, 0.5) },
    uDirection: { value: 1 },
    uSpeed: { value: 1 }
})

const material2 = getMaterial({
    uColor: { value: new THREE.Color('#00BFFF') },
    uTime: { value: 0.5 },
    uDirection: { value: 1 },
    uSpeed: { value: 1 },
    uFade: { value: new THREE.Vector2(0, 0.5) },
    uDirection: { value: 1 },
    uSpeed: { value: 1 }
})


const mesh = new THREE.Mesh(geometry, material1)
const mesh2 = new THREE.Mesh(geometry, material2)

scene.add(mesh);

scene.add(mesh2)


animate()

function animate() {

    material1.uniforms.uTime.value += 0.002
    material2.uniforms.uTime.value += 0.002

    requestAnimationFrame(animate)

    renderer.render(scene, camera)

    composer.render();

}

/**
 * 名称: 心
 * 作者: 优雅永不过时 https://github.com/z2586300277
 * 参照来源:https://github.com/xiaolidan00/my-earth?tab=readme-ov-file 
 */

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

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

相关文章

天若OCR识别软件 使用教程 软件下载

F4&#xff08;FnF4&#xff09;快捷键打开软件&#xff0c;找到要识别的图片&#xff0c;直接选中要识别的区域&#xff0c;可直接识别出来。 如果识别失败&#xff0c;就在右键菜单里&#xff0c;重新识别

数据管理,数据治理,数据中心,数据中台,数据湖都是什么意思,有什么关系?

这些术语都与数据管理和处理相关&#xff0c;但它们各自关注的方面不同。下面我将逐一解释这些概念&#xff0c;并简要说明它们之间的关系。 数据管理 (Data Management) 数据管理是指规划、控制和提供数据及信息资产的过程。它包括了数据的获取、验证、存储、保护以及加工等一…

论文翻译 | LARGE LANGUAGE MODELS ARE HUMAN-LEVELPROMPT ENGINEERS

摘要 通过在自然语言指令上进行调节&#xff0c;大型语言模型&#xff08;LLMs&#xff09;已经展现出了作为通用计算机的惊人能力。然而&#xff0c;任务表现很大程度上取决于用于引导模型提示的质量&#xff0c;而最有效的提示通常是由人工精心设计的。受到经典程序合成和人类…

ppt在线生成工具有哪些?6个好用的做ppt软件盘点!

现代PPT作为工作和学习中的信息传递与展示工具&#xff0c;已被广泛使用。在商业或学术场景中&#xff0c;一个具备出色设计和内容的PPT幻灯片&#xff0c;能够最大限度吸引观众目光&#xff0c;同时提升信息传达效果。 然而同样不容忽视的是&#xff0c;传统的制作过程耗费时…

(接口测试)day01接口测试理论 http理论 接口测试流程 接口文档解析

一.接口测试理论 1.接口和接口测试 服务器为客户端开了一个验证接口&#xff08;接口本质&#xff1a;函数方法&#xff09;客户端向服务器传送的消息可以相当于函数的参数&#xff0c;接口是用来让客户端传递数据的 接口&#xff1a;相当于开了一个通道 当服务器要给客户端响…

什么!FPGA可以自行二次开发了?

问&#xff1a;什么~FPGA可以自行二次开发了? 答&#xff1a;目前市场上的标准采集卡通常不支持用户自行开发FPGA。但因为应用环境的需要&#xff0c;不仅仅只需要单一的数据采集流程&#xff0c;往往还需要在其中嵌入更复杂的运行和分析逻辑。为了解决这类问题&#xff0c;我…

【原创】java+springboot+mysql疫苗追踪管理系统设计与实现

个人主页&#xff1a;程序猿小小杨 个人简介&#xff1a;从事开发多年&#xff0c;Java、Php、Python、前端开发均有涉猎 博客内容&#xff1a;Java项目实战、项目演示、技术分享 文末有作者名片&#xff0c;希望和大家一起共同进步&#xff0c;你只管努力&#xff0c;剩下的交…

【STM32单片机_(HAL库)】6-6-1【串口通信UART、USART】【蓝牙遥控插座项目】HC-08蓝牙模块实验

通信示意图 1.硬件 STM32单片机最小系统HC-08蓝牙模块 2.软件 bluetooth驱动文件添加main.c程序 #include "sys.h" #include "delay.h" #include "led.h" #include "uart1.h" #include "bluetooth.h"int main(void) {…

日本IT|事务与IT营业岗位分别是什么?

在日本IT行业中&#xff0c;“事务”与“IT营业”是两个不同的岗位&#xff0c;它们各自承担着不同的职责。以下是对这两个岗位的详细解释&#xff1a; 一、事务岗位 定义与工作内容&#xff1a; 事务岗位通常指的是处理公司日常事务的职位&#xff0c;这些事务可能涉及IT派遣…

零基础搭建QQ机器人(Ⅱ)

基于 PythonSDK 和 三方协议 开发搭建QQ机器人 [交流QQ群]&#xff1a;QQ官方机器人交流群csdn 文章目录 基于 PythonSDK 和 三方协议 开发搭建QQ机器人接受消息并发送内容接受消息hello后发送语音接受消息hello后发送文件接受消息hello后发送视频接受消息hello后发送骰子/猜拳…

操作系统——位示图

这里写目录标题 前言基础说明相关计算题目一题目二题目三 前言 基础说明 位示图是一种用来表示文件和目录在磁盘上存储位置的图形化表示方法。它通过使用一系列的位来表示文件或目录所占用的磁盘块&#xff0c;从而显示出磁盘上的存储情况。 位示图通常是一个位向量&#xf…

FileInputStream类

目录 1.案例代码&#xff1a; 2.注意细节 3.FileInputStream循环读取 1.案例代码&#xff1a; 准备的txt文件 结果&#xff1a; 如果需要输出原本的字母&#xff0c;强制转换为char即可&#xff1a; 结果&#xff1a; 2.注意细节 &#xff08;1&#xff09;如果文件不存在…

RandLA-Net 基于 Tensorflow , 训练自定义数据集

搭建 RandLA-Net 训练环境, 生成自定义训练数据集, 训练自定义数据集. Code: https://github.com/QingyongHu/RandLA-Net 搭建训练环境 Clone the repositorygit clone --depth=1 https://github.com/QingyongHu

Transformer学会有手就行?这本 Transformer自然语言处理实战 书无敌了

在人工智能领域&#xff0c;Transformer架构、大模型是当下最激动人心的话题之一。它们不仅推动了技术的极限&#xff0c;还重新定义了我们与机器交互的方式。Transformer模型最初由Google的研究人员在2017年提出&#xff0c;它是一种基于自注意力机制的深度学习模型&#xff0…

4K变倍镜头特点

1、高分辨率成像&#xff1a; ① 能够呈现清晰、细腻的图像&#xff0c;可清晰快速地识别出被测物体的微小细节、特征以及潜在的缺陷等。例如在芯片外观瑕疵检测中&#xff0c;能清晰地分辨出芯片上的刮痕、污渍、破损、引脚缺失等问题。 ② 相比传统的变倍镜头&#xff0c;在…

【华为】配置NAT访问互联网

1.AR1&#xff1a; int g0/0/0 ip ad 64.1.1.2 255.255.255.0 int g0/0/1 ip ad 110.242.68.1 255.255.255.02.AR2: (1)配置端口ip: int g0/0/1 ip ad 10.3.1.2 255.255.255.0 int g0/0/0 ip ad 64.1.1.1 255.255.255.0(2)配置默认路由&#xff1a; ip route-static 0.0.0.0 0.…

JavaWeb之监听器

在JavaWeb开发中&#xff0c;常见的监听器&#xff08;Listener&#xff09;用于监听Web应用程序、会话&#xff08;Session&#xff09;、请求&#xff08;Request&#xff09;的生命周期或属性的变化。 应用域监听器&#xff1a; 应用域监听器&#xff08;也称为ServletCon…

2023年中国环境统计年鉴(EXCEL)

2023年中国环境统计年鉴(EXCEL) 1、时间&#xff1a;2023年 2、《Z国环境统计年鉴》是一本重要的年度参考资料&#xff0c;全面反映了Z国的环境状况与发展趋势。本年鉴收集整理了大量来自各级环境保护部门、科研机构以及相关领域的数据和统计信息&#xff0c;内容涵盖了大气、…

APB接口协议

APB 简介信号传输时序WriteWrite stobesReadError responseWrite transferRead transferMapping of PSLVERRProtection unit support 状态机 简介 APB&#xff08;Advanced Peripheral Bus&#xff09;是AMBA总线的一部分&#xff0c;从1998年第一版至今共有3个版本。 AMBA2 …

【专题】计算机网络概述

1. 计算机网络的作用及其发展史 1.1. 计算机网络的作用 二十一世纪的一些重要特征就是数字化、网络化和信息化&#xff0c;它是一个以网络为核心的信息时代。 网络现在已经成为信息社会的命脉和发展知识经济的重要基础。 信息时代以网络为核心。 (1) 网络 “网络”是一个统称…