当前位置: 首页 > news >正文

CSS3DRenderer, CSS3DSprite API 使用案例demo

CSS3DRenderer, CSS3DSprite API 使用案例demo


<!DOCTYPE html>
<html><head><title>three.js css3d - sprites</title><meta charset="utf-8"><meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0"><link type="text/css" rel="stylesheet" href="main.css"><style>body {background-color: #fff;color: #000;}a {color: #48f;}</style></head><body><div id="info"><a href="https://threejs.org" target="_blank" rel="noopener">three.js</a> css3d - sprites</div><div id="container"></div><script type="importmap">{"imports": {"three": "../build/three.module.js","three/addons/": "./jsm/"}}</script><script type="module">import * as THREE from 'three';import TWEEN from 'three/addons/libs/tween.module.js';import { TrackballControls } from 'three/addons/controls/TrackballControls.js';import { CSS3DRenderer, CSS3DSprite } from 'three/addons/renderers/CSS3DRenderer.js';let camera, scene, renderer;let controls;const particlesTotal = 512;const positions = [];const objects = [];let current = 0;init();animate();function init() {camera = new THREE.PerspectiveCamera( 75, window.innerWidth / window.innerHeight, 1, 5000 );camera.position.set( 600, 400, 1500 );camera.lookAt( 0, 0, 0 );scene = new THREE.Scene();const image = document.createElement( 'img' );image.addEventListener( 'load', function () {for ( let i = 0; i < particlesTotal; i ++ ) {const object = new CSS3DSprite( image.cloneNode() );object.position.x = Math.random() * 4000 - 2000,object.position.y = Math.random() * 4000 - 2000,object.position.z = Math.random() * 4000 - 2000;scene.add( object );objects.push( object );}transition();} );image.src = 'textures/sprite.png';// Planeconst amountX = 16;const amountZ = 32;const separationPlane = 150;const offsetX = ( ( amountX - 1 ) * separationPlane ) / 2;const offsetZ = ( ( amountZ - 1 ) * separationPlane ) / 2;for ( let i = 0; i < particlesTotal; i ++ ) {const x = ( i % amountX ) * separationPlane;const z = Math.floor( i / amountX ) * separationPlane;const y = ( Math.sin( x * 0.5 ) + Math.sin( z * 0.5 ) ) * 200;positions.push( x - offsetX, y, z - offsetZ );}// Cubeconst amount = 8;const separationCube = 150;const offset = ( ( amount - 1 ) * separationCube ) / 2;for ( let i = 0; i < particlesTotal; i ++ ) {const x = ( i % amount ) * separationCube;const y = Math.floor( ( i / amount ) % amount ) * separationCube;const z = Math.floor( i / ( amount * amount ) ) * separationCube;positions.push( x - offset, y - offset, z - offset );}// Randomfor ( let i = 0; i < particlesTotal; i ++ ) {positions.push(Math.random() * 4000 - 2000,Math.random() * 4000 - 2000,Math.random() * 4000 - 2000);}// Sphereconst radius = 750;for ( let i = 0; i < particlesTotal; i ++ ) {const phi = Math.acos( - 1 + ( 2 * i ) / particlesTotal );const theta = Math.sqrt( particlesTotal * Math.PI ) * phi;positions.push(radius * Math.cos( theta ) * Math.sin( phi ),radius * Math.sin( theta ) * Math.sin( phi ),radius * Math.cos( phi ));}//renderer = new CSS3DRenderer();renderer.setSize( window.innerWidth, window.innerHeight );document.getElementById( 'container' ).appendChild( renderer.domElement );//controls = new TrackballControls( camera, renderer.domElement );//window.addEventListener( 'resize', onWindowResize );}function onWindowResize() {camera.aspect = window.innerWidth / window.innerHeight;camera.updateProjectionMatrix();renderer.setSize( window.innerWidth, window.innerHeight );}function transition() {const offset = current * particlesTotal * 3;const duration = 2000;for ( let i = 0, j = offset; i < particlesTotal; i ++, j += 3 ) {const object = objects[ i ];new TWEEN.Tween( object.position ).to( {x: positions[ j ],y: positions[ j + 1 ],z: positions[ j + 2 ]}, Math.random() * duration + duration ).easing( TWEEN.Easing.Exponential.InOut ).start();}new TWEEN.Tween( this ).to( {}, duration * 3 ).onComplete( transition ).start();current = ( current + 1 ) % 4;}function animate() {requestAnimationFrame( animate );TWEEN.update();controls.update();const time = performance.now();for ( let i = 0, l = objects.length; i < l; i ++ ) {const object = objects[ i ];const scale = Math.sin( ( Math.floor( object.position.x ) + time ) * 0.002 ) * 0.3 + 1;object.scale.set( scale, scale, scale );}renderer.render( scene, camera );}</script></body>
</html>

本内容来源于小豆包,想要更多内容请跳转小豆包 》

相关文章:

CSS3DRenderer, CSS3DSprite API 使用案例demo

CSS3DRenderer, CSS3DSprite API 使用案例demo <!DOCTYPE html> <html><head><title>three.js css3d - sprites</title><meta charset"utf-8"><meta name"viewport" content"widthdevice-width, user-scalabl…...

河马优化算法(HO)-2024年Nature子刊新算法 公式原理详解与性能测评 Matlab代码免费获取

声明&#xff1a;文章是从本人公众号中复制而来&#xff0c;因此&#xff0c;想最新最快了解各类智能优化算法及其改进的朋友&#xff0c;可关注我的公众号&#xff1a;强盛机器学习&#xff0c;不定期会有很多免费代码分享~ 目录 原理简介 一、种群初始化 二、河马在河流或…...

SLAM 算法综述

LiDAR SLAM 其主要思想是通过两个算法&#xff1a;一个高频激光里程计进行低精度的运动估计&#xff0c;即使用激光雷达做里程计计算两次扫描之间的位姿变换&#xff1b;另一个是执行低频但是高精度的建图与校正里程计&#xff0c;利用多次扫描的结果构建地图&#xff0c;细化位…...

搭建Hadoop3.x完全分布式集群

零、资源准备 虚拟机相关&#xff1a; VMware workstation 16&#xff1a;虚拟机 > vmware_177981.zipCentOS Stream 9&#xff1a;虚拟机 > CentOS-Stream-9-latest-x86_64-dvd1.iso Hadoop相关 jdk1.8&#xff1a;JDK > jdk-8u261-linux-x64.tar.gzHadoop 3.3.6&am…...

linux常用命令(二)

目录 前言 常用命令 1.ls命令 2. cd命令 3.pwd命令 4.mkdir 命令 5. rmdir 命令 6.rm 命令 7.cp命令 8.mv命令 9.touch命令 10.cat命令 11.more命令 12.less命令 13.head命令 14.tail命令 15.tail命令 16.find命令 17.tar命令 18.gzip命令 19.gunzip命令 …...

【Vue】Request模块 - axios 封装Vuex的持久化存储

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;Vue ⛺️稳中求进&#xff0c;晒太阳 Request模块 - axios 封装 使用axios来请求后端接口&#xff0c;一般会对axios进行一些配置&#xff08;比如配置基础地址&#xff0c;请求响应拦截器…...

【2024第一期CANN训练营】4、AscendCL推理应用开发

文章目录 【2024第一期CANN训练营】4、AscendCL推理应用开发1. 创建代码目录2. 构建模型2.1 下载原始模型文件2.2 使用ATC工具转换模型2.3 注意事项 3. 模型加载3.1 示例代码 4. 模型执行4.1 获取模型描述信息4.2 准备输入/输出数据结构4.3 执行模型推理4.4 释放内存和数据类型…...

Rust 构建开源 Pingora 框架可以与nginx媲美

一、概述 Cloudflare 为何弃用 Nginx&#xff0c;选择使用 Rust 重新构建新的代理 Pingora 框架。Cloudflare 成立于2010年&#xff0c;是一家领先的云服务提供商&#xff0c;专注于内容分发网络&#xff08;CDN&#xff09;和分布式域名解析。它提供一系列安全和性能优化服务…...

MediaCodec源码分析 ACodec状态详解

前言 本文分析ACodec状态机,ACodec是MediaCodec的底层实现,在MediaCodec命令下切换不同状态进行编解码,基于7.0代码。 ACodec状态介绍 UninitializedState:未初始化状态。 在业务层调用MediaCodec. createByCodecName 完成后切换到LoadedState。 LoadedState:表示解码器…...

【Elasticsearch】windows安装elasticsearch教程及遇到的坑

一、安装参考 1、安装参考&#xff1a;ES的安装使用(windows版) elasticsearch的下载地址&#xff1a;https://www.elastic.co/cn/downloads/elasticsearch ik分词器的下载地址&#xff1a;https://github.com/medcl/elasticsearch-analysis-ik/releases kibana可视化工具下载…...

如何快速搭建物联网工业云平台

随着物联网技术的快速发展&#xff0c;物联网工业云平台已经成为推动工业领域数字化转型的重要引擎。合沃作为专业的物联网云服务提供商&#xff0c;致力于为企业提供高效、可靠的物联网工业云平台解决方案。本文将深入探讨物联网工业云平台的功能、解决行业痛点的能力以及如何…...

Spring Data访问Elasticsearch----Elasticsearch对象映射

Spring Data访问Elasticsearch----Elasticsearch对象映射 一、元模型(Meta Model)对象映射1.1 映射注解概述1.1.1 控制向Elasticsearch写入和从其读取哪些属性1.1.2 日期格式映射1.1.3 Range类型1.1.4 映射的字段名1.1.5 Non-field-backed属性1.1.6 其他属性注解 1.2 映射规则1…...

Linux之shell循环

华子目录 for循环带列表的for循环格式分析示例shell允许用户指定for语句的步长&#xff0c;格式如下示例 不带列表的for循环示例 基于C语言风格的for循环格式示例注意 while循环格式示例 until循环作用格式示例 循环控制breakcontinue详细语法示例 循环嵌套示例 for循环 for循…...

Python入门教程(一)|基本语法概述

目录 1. 注释 2. 变量和数据类型 3. 控制流 4. 函数 5. 类与对象 6. 异常处理 7. 模块和包 8. 文件操作 1. 注释 在Python中&#xff0c;单行注释以#开始&#xff0c;多行注释使用三个引号 """ 或 。 # 这是单行注释""" 这是 多行 注释…...

Android Studio入门——页面跳转

1.工程目录 2.MainActivity package com.example.demo01;import android.content.Intent; import android.os.Bundle; import android.view.View; import android.widget.TextView;import androidx.appcompat.app.AppCompatActivity;public class MainActivity extends AppCo…...

肝了三天,完成了AIGC工具网站大全,建议收藏再看

说是肝了三天&#xff0c;其实远远不止&#xff0c;前前后后&#xff0c;从资料搜集到最后整理成文&#xff0c;有近一个月了&#xff0c;大家看在整理不易的份上&#xff0c;给点个赞吧&#xff0c;不要光顾着收藏呀&#xff01; 国内网站 AIGC 导航 https://www.aigc.cn 网…...

算法练习:前缀和

目录 1. 一维前缀和2. 二维前缀和3. 寻找数组中心下标4. 除自身以外数组的乘积5. !和为k的子数字6. !和可被k整除的子数组7. !连续数组8. 矩阵区域和 1. 一维前缀和 题目信息&#xff1a; 题目链接&#xff1a; 一维前缀和思路&#xff1a;求前缀和数组&#xff0c;sum dp[r] …...

Kafka MQ 生产者

Kafka MQ 生产者 生产者概览 尽管生产者 API 使用起来很简单&#xff0c;但消息的发送过程还是有点复杂的。图 3-1 展示了向 Kafka 发送消息的主要步骤。 我们从创建一个 ProducerRecord 对象开始&#xff0c;ProducerRecord 对象需要包含目标主题和要发送的内容。我们还可以…...

​​SQLiteC/C++接口详细介绍之sqlite3类(十)

返回目录&#xff1a;SQLite—免费开源数据库系列文章目录 上一篇&#xff1a;SQLiteC/C接口详细介绍之sqlite3类&#xff08;九&#xff09; 下一篇&#xff1a;​​SQLiteC/C接口详细介绍之sqlite3类&#xff08;十一&#xff09; 30.sqlite3_enable_load_extension&#x…...

Vue中nextTick一文详解

什么是 nextTick&#xff1f; 在 Vue 中&#xff0c;当我们修改数据时&#xff0c;Vue 会自动更新视图。但是&#xff0c;由于 JavaScript 的事件循环机制&#xff0c;我们无法立即得知视图更新完成的时机。这时候&#xff0c;我们就需要使用 nextTick 来获取视图更新完成后的…...

一个防止GPT“降智”的简单方法

GPT客户端容易“降智”&#xff1f;教你一个简单解决办法 正文 最近一直感觉 GPT 手机客户端有点“降智”&#xff0c;回答质量不太稳定。 后来我拿同一账号做了对比&#xff0c;发现用手机浏览器登录网页版时&#xff0c;整体会正常不少&#xff0c;所以来给大家分享一下。 我…...

tao-8k Embedding模型部署教程:支持中文长文本的高兼容性向量服务

tao-8k Embedding模型部署教程&#xff1a;支持中文长文本的高兼容性向量服务 你是不是遇到过这样的问题&#xff1f;想把一段很长的中文文档&#xff0c;比如一篇技术报告、一份产品说明书&#xff0c;甚至是一本小说的章节&#xff0c;转换成计算机能理解的向量&#xff0c;…...

告别Edge收藏夹翻页烦恼!用这个免费插件实现多列平铺,效率翻倍

Edge浏览器收藏夹效率革命&#xff1a;多列平铺插件实战指南 每次打开Edge浏览器&#xff0c;面对那串长得仿佛没有尽头的单列收藏夹&#xff0c;你是不是也感到一阵无力&#xff1f;滚动、翻页、再滚动——找个书签比找停车位还费劲。作为一名每天要和上百个书签打交道的效率控…...

SDXL 1.0绘图工坊应用案例:如何用AI为你的自媒体快速生成高质量配图

SDXL 1.0绘图工坊应用案例&#xff1a;如何用AI为你的自媒体快速生成高质量配图 1. 自媒体配图创作的痛点与解决方案 每天更新自媒体内容时&#xff0c;你是否也为寻找合适的配图而烦恼&#xff1f;传统方式要么耗时费力地拍摄&#xff0c;要么在版权图库中大海捞针&#xff…...

Escornabot-lib:面向教育机器人的Arduino语义化控制库

1. Escornabot-lib 库概述Escornabot-lib 是一个专为 Escornabot 教育机器人设计的 Arduino C 类库&#xff0c;由 ROBOteach 团队维护&#xff0c;采用 GNU GPL v3.0 开源协议。该库并非仅提供抽象接口&#xff0c;而是完整封装了 Escornabot 硬件平台的全部底层驱动、状态管理…...

AI模型评估指标:InstantID在各项基准测试中的表现

AI模型评估指标&#xff1a;InstantID在各项基准测试中的表现 【免费下载链接】InstantID 项目地址: https://ai.gitcode.com/hf_mirrors/InstantX/InstantID InstantID作为一款领先的AI模型&#xff0c;在多项基准测试中展现出卓越性能。本文将深入解析其在各项评估指…...

OpenClaw+Qwen2.5-VL-7B省钱方案:自建多模态接口替代GPT-4V

OpenClawQwen2.5-VL-7B省钱方案&#xff1a;自建多模态接口替代GPT-4V 1. 为什么选择本地多模态方案 去年我在开发一个智能内容管理工具时&#xff0c;频繁调用GPT-4V处理截图和文档解析&#xff0c;每月账单轻松突破2000元。最痛心的是&#xff0c;80%的简单图片识别任务其实…...

AI赋能开发:让快马平台智能生成基于contextmenumanager的动态条件式右键菜单代码

最近在做一个电商项目时&#xff0c;遇到了一个有趣的交互需求&#xff1a;需要为不同类型的商品卡片实现智能化的右键菜单。这个需求让我发现了InsCode(快马)平台的AI辅助开发功能特别实用&#xff0c;尤其是对于contextmenumanager这种需要动态逻辑的场景。 需求分析 页面上有…...

JAVA重点基础、进阶知识及易错点总结(15)缓冲流 + 转换流

&#x1f680; Java 巩固进阶 第15天 主题&#xff1a;缓冲流 转换流 —— 高效 IO 与编码安全的终极方案&#x1f4c5; 进度概览&#xff1a;今天学习 生产环境真正在用的流组合&#xff01;掌握缓冲流 转换流&#xff0c;你的文件操作代码才能达到"标准、高效、不乱码…...

构建企业级AI智能体:LangGraph多智能体框架实战指南

构建企业级AI智能体&#xff1a;LangGraph多智能体框架实战指南 【免费下载链接】langgraph Build resilient language agents as graphs. 项目地址: https://gitcode.com/GitHub_Trending/la/langgraph 在当今AI应用开发中&#xff0c;开发者面临着一个核心挑战&#x…...