一条自由游动的鲸鱼

news2024/11/19 4:30:23

先看效果:
在这里插入图片描述
再看代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>鲸鱼</title>
    <style>
        #canvas-container {
            width: 100%;
            height: 100vh;
            overflow: hidden;
        }

    </style>
</head>
<body>
<div id="canvas-container"></div>
<script async src="https://ga.jspm.io/npm:es-module-shims@1.6.3/dist/es-module-shims.js" crossorigin="anonymous"></script>
<script type="importmap">
	{
    "imports": {
      "three": "https://unpkg.com/three@0.154.0/build/three.module.js",
      "three/addons/": "https://unpkg.com/three@0.154.0/examples/jsm/"
    }
  }
</script>
<script async src="https://ga.jspm.io/npm:es-module-shims@1.6.3/dist/es-module-shims.js" crossorigin="anonymous"></script>
<script type="importmap">
	{
    "imports": {
      "three": "https://unpkg.com/three@0.154.0/build/three.module.js",
      "three/addons/": "https://unpkg.com/three@0.154.0/examples/jsm/"
    }
  }
</script>
</body>
<script type="module">
    import * as THREE from "three";
    import { OrbitControls } from "three/addons/controls/OrbitControls.js";
    import { GLTFLoader } from "three/addons/loaders/GLTFLoader.js";
    import { UnrealBloomPass } from "three/addons/postprocessing/UnrealBloomPass.js";
    import { EffectComposer } from "three/addons/postprocessing/EffectComposer.js";
    import { RenderPass } from "three/addons/postprocessing/RenderPass.js";
    import { OutputPass } from "three/addons/postprocessing/OutputPass.js";

    let composer, scene, camera, renderer, group;

    const params = {
        threshold: 0,
        strength: 0.1,
        radius: 0,
        exposure: 1
    };

    let allGeometry = [];

    function init() {
        scene = new THREE.Scene();
        scene.background = new THREE.Color(0x000000);

        camera = new THREE.PerspectiveCamera(
            75,
            window.innerWidth / window.innerHeight,
            0.1,
            1000
        );

        renderer = new THREE.WebGLRenderer({ alpha: true });

        const controls = new OrbitControls(camera, renderer.domElement);
        renderer.setSize(window.innerWidth, window.innerHeight);

        document.getElementById("canvas-container").appendChild(renderer.domElement);

        const sprite = new THREE.TextureLoader().load(
            "https://assets.codepen.io/10590426/disc.png"
        );
        sprite.colorSpace = THREE.SRGBColorSpace;

        const renderScene = new RenderPass(scene, camera);

        const bloomPass = new UnrealBloomPass(
            new THREE.Vector2(window.innerWidth, window.innerHeight),
            1.5,
            0.4,
            0.85
        );
        bloomPass.threshold = params.threshold;
        bloomPass.strength = params.strength;
        bloomPass.radius = params.radius;

        const outputPass = new OutputPass(THREE.ReinhardToneMapping);
        group = new THREE.Group();

        composer = new EffectComposer(renderer);
        composer.addPass(renderScene);
        composer.addPass(bloomPass);
        composer.addPass(outputPass);

        // load the model
        const loader = new GLTFLoader();
        loader.load(
            "https://assets.codepen.io/10590426/Whale+Poly.glb",
            function (gltf) {
                gltf.scene.traverse(function (child) {
                    const geometry = child.geometry;
                    const material = new THREE.PointsMaterial({
                        // color: 0x0378ff,
                        size: 0.6,
                        alphaTest: 0.5,
                        transparent: true,
                        blending: THREE.AdditiveBlending,
                        map: sprite,
                        vertexColors: true
                    });
                    const whale = new THREE.Points(geometry, material);
                    const wireframe = new THREE.WireframeGeometry(geometry);

                    const line = new THREE.LineSegments(wireframe);
                    line.material.depthTest = false;
                    line.material.opacity = 0.006;
                    line.material.transparent = true;

                    group.add(line);
                    group.add(whale);
                    scene.add(group);

                    allGeometry.push(line);
                    allGeometry.push(whale);
                });
            }
        );

        camera.position.y = -25;
        camera.position.z = 12;
        camera.position.x = 10;

        controls.update();
    }

    let elapsed = 0;

    const clamp = (num, min, max) => Math.min(Math.max(num, min), max);

    function animate() {
        requestAnimationFrame(animate);

        scene.rotation.z += 0.004;

        renderer.render(scene, camera);

        elapsed += 0.02;

        for (const particles of allGeometry) {
            const positions = particles?.geometry?.attributes?.position?.array;

            let colors = [];
            if (positions) {
                for (let i = 0; i < positions.length; i += 3) {
                    let waveY =
                        0.03 *
                        Math.cos(0.1 * (positions[i] / 2) + positions[i + 2] / 12 + elapsed);

                    positions[i + 1] = positions[i + 1] + waveY;

                    // 基于y位置创建颜色
                    let color = new THREE.Color(0x0378ff);

                    color.setHSL(
                        0.65 * clamp(Math.sin(0.1 * positions[i + 2] + elapsed), 0.6, 1),
                        1,
                        0.4
                    );
                    colors.push(color.r, color.g, color.b);
                }
                particles.geometry.setAttribute(
                    "color",
                    new THREE.Float32BufferAttribute(colors, 3)
                );
                particles.geometry.attributes.position.needsUpdate = true;
                particles.geometry.attributes.color.needsUpdate = true;
            }
        }
        composer.render();
    }

    init();
    animate();

</script>
</html>

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

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

相关文章

Linux(二)---------网络命令学习(ifconfig命令)

1.ifconfig命令 用于配置网卡ip地址信息&#xff0c;等网络参数信息&#xff0c;或者查看显示网络接口信息&#xff0c;类似于windows的ipconfig命令&#xff0c;还能够临时性的配置ip地址&#xff0c;子网掩码&#xff0c;广播地址&#xff0c;网关信息等。 注意ifconfig命令…

配置GIt账号、配置公钥

1.设置账号和邮箱 打开终端输入以下命令&#xff1a; git config --global --unset-all user.name git config --global --unset-all user.email然后输入以下命令来设置新的账号和邮箱&#xff1a; git config --global user.name "your_username" git config --glo…

整理了250个shell脚本,拿来即用!

无论是系统运维&#xff0c;还是应用运维&#xff0c;均可分为“纯手工”→ “脚本化”→ “自动化”→“智能化”几个阶段&#xff0c;其中自动化阶段&#xff0c;主要是将一些重复性人工操作和运维经验封装为程序或脚本&#xff0c;一方面避免重复性操作及风险&#xff0c;另…

【音视频SDK测评】线上K歌软件开发技术选型

摘要 在线K歌软件的开发有许多技术难点&#xff0c;需考虑到音频录制和处理、实时音频传输和同步、音频压缩和解压缩、设备兼容性问题等技术难点外&#xff0c;此外&#xff0c;开发者还应关注音乐版权问题&#xff0c;确保开发的应用合规合法。 前言 前面写了几期关于直播 …

qt系列-qt6在线安装慢的问题

.\qt-unified-windows-x64-online.exe --mirror https://mirrors.aliyun.com/qt/下载速度飞快

剑指offer19.正则表达式

这道题我一看就有印象&#xff0c;我室友算法课设抽到这题&#xff0c;他当时有个bug让我帮他看一下&#xff0c;然后我就大概看了一下他的算法&#xff0c;他是用动态规划写的&#xff0c;用了一个二维数组&#xff0c;然后我就试着按照这个思路去写&#xff0c;想了一会还是没…

输入筛选框搜索

文章目录 输入筛选框实现效果图需求前端工具版本添加依赖main.js导入依赖 代码 后端代码对应 sql对应 mapper.xml 文件的动态 sql 输入筛选框实现 效果图 需求 通过筛选框&#xff0c;选择公司&#xff0c;传入后端&#xff0c;后端根据公司名称去文章的内容中进行模糊查询 …

flask响应

介绍 在flask中&#xff0c;响应的方式有很多种&#xff0c;可以是普通字符串、json数据、html文本、模板或者是重定向。视图函数的返回值会自动转换为一个响应对象 当响应对象是字符串时 根据这个字符串和缺省参数自动生成一个用于返回的 响应对象 app.route("/test&q…

使用Debate Dynamics在知识图谱上进行推理(2020)7.31+8.1+8.2

使用Debate Dynamics在知识图谱上进行推理 摘要介绍背景与相关工作我们的方法状态action环境policiesDebate Dynamics裁判奖励报酬最大化和培训计划 实验数据集度量和评估方案结果 总结 摘要 我们提出了一种新的基于 Debate Dynamics 的知识图谱自动推理方法。 其主要思想是将…

2023年DevOps和云趋势报告!

要点 ●云创新已从革命性阶段转变为演进性阶段&#xff0c;重点是迁移和重新架构工作负载。云空间已发展为提供对可扩展资源和托管服务的按需访问&#xff0c;强调简化交互并减少团队的认知负担。 ●人工智能 (AI) 和大型语言模型 (LLM) 可以通过解决认知过载问题并支持即时管…

疯狂收割offer,全网最全接口测试面试题+答案,面试必刷题...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 面试题&#xff1…

网络安全公司校招面试会面试那些问题?

面试官会从那些方面去考察面试者&#xff1f; 以某安全公司的技术支持工程师岗位为例 面试官可能会从网络技术、操作系统、数据库、项目经验、语言表达以及个人擅长技能方面展开 面试官会提出那些问题来考查面试者呢&#xff1f; 网络基础方面的问题&#xff1a;请介绍一下…

Gitlab CI/CD笔记-第一天-GitOps和以前的和jenkins的集成的区别

一、GitOps-CI/CD的流程图 简单解释&#xff1a; 1.提交代码 2.编译构建 3.测试 4.部署 二、gitlab的实现 1、Runer 1.这个就是jenkins里的worker-slave的角色&#xff0c; 2.git-lab server 下发任务&#xff0c;Runner执行。 3.这个R…

JZ67 把字符串转换成整数(atoi)

目录 一、题目 二、易错点代码 一、题目 把字符串转换成整数(atoi)_牛客题霸_牛客网 (nowcoder.com) 二、易错点代码 int类型运算可能出现溢出的现象&#xff0c;因此可采用将int类型数据的运算转换成long long类型 class Solution { public:int is(long long result)//用…

Emacs之编译系统文件cc-mode.el.gz(一百二十四)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

leetcode每日一练-第108题-将有序数组转换为二叉搜索树

一、思路 递归 二、解题方法 在给定中序遍历序列数组的情况下&#xff0c;每一个子树中的数字在数组中一定是连续的&#xff0c;因此可以通过数组下标范围确定子树包含的数字&#xff0c;下标范围记为 [left,right]。对于整个中序遍历序列&#xff0c;下标范围从 left0到 ri…

【MySQL】视图与用户管理

【MySQL】视图 视图视图概念使用基表与视图的相互影响 用户管理新增用户删除修改密码 用户权限授予权限回收权限 视图 视图概念 视图就是一张虚拟表&#xff0c;其内容由查询定义。与真实的表一样&#xff0c;视图包含一系列带有名称的列和行数据。视图的数据变化影响到基表&…

GEE学习02 --设置Jupyter Notebook的打开路径

直接双击Jupyter Notebook 桌面图标运行时&#xff0c;打开的文件路径是默认的&#xff1a;C&#xff1a;\用户\用户名 如果使用python命令提示符打开jupyter notebook &#xff0c; 而我新建的GEE学习文件夹在另一个路径&#xff0c;可以直接修改默认的保存路径&#xff1a;…

Ebay婴儿活动床栏CPC认证 ASTM F2085

活动床栏旨在防止儿童从床上掉落。活动床栏可以安装在床的一侧或床垫表面。活动床栏适用于可以在没有帮助的情况下上下床的儿童&#xff0c;通常为二至五岁的儿童。本政策涵盖泡沫、充气和刚性活动床栏。 根据亚马逊的要求&#xff0c;所有活动床栏均应经过检测&#xff0c;并且…

算法题--找规律(构建乘积数组、剪绳子、圆圈中最后剩下的数字)

目录 找规律 构建乘积数组 原题链接 解析 核心思想 答案 剪绳子 原题链接 解析 核心思想 答案 圆圈中最后剩下的数字 原题链接 解析 核心思想 答案 找规律 需要通过列举多个示例&#xff0c;从多个示例的输入到输出中得到规律去普遍化。 构建乘积数组 给定…