尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
Three.js 扭曲教程
扭曲 ·Vortex Shader· ▶ 在线运行案例案例合集三维可视化功能案例threehub.cn开源仓库github地址https://github.com/z2586300277/three-cesium-examples400个案例代码:网盘链接你将学到什么ShaderMaterial 自定义着色器实现核心视觉效果OrbitControls 相机轨道交互requestAnimationFrame渲染循环与resize自适应效果说明本案例演示扭曲效果基于 WebGL 实现「扭曲」可视化效果附完整可运行源码核心用到 ShaderMaterial、OrbitControls。建议先打开文首在线案例查看动态画面再对照下方源码逐步理解。核心概念Scene / Camera / WebGLRenderer构成最小渲染闭环大场景可开logarithmicDepthBuffer缓解 Z-fighting。ShaderMaterial通过uniforms 自定义 GLSL 控制逐像素/逐点效果透明粒子常配合depthTest: false。OrbitControls提供轨道旋转/缩放开启enableDamping后需在 animate 中controls.update()。实现步骤搭建 Scene、PerspectiveCamera、WebGLRenderer挂载 canvas 并处理resize定义 uniforms / onBeforeCompile 或 ShaderMaterial编写 GLSL 与材质参数创建 OrbitControls及 Raycaster 等交互控件若源码包含在requestAnimationFrame循环中更新状态并 renderCesium 为viewer.render或自动渲染代码要点import * as THREE from three;import { GUI } from three/addons/libs/lil-gui.module.min.js; import { OrbitControls } from three/addons/controls/OrbitControls.js; import Stats from three/addons/libs/stats.module.js;var container; var scene, camera, renderer; var controls; var stats;var cubeMaterial;init(); update(); createGUI();function init() { container document.getElementById(box);// scene scene new THREE.Scene();// camera camera new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 1, 10000); camera.position.set(1, 1, 1); camera.target new THREE.Vector3(0, 0, 0); scene.add(camera);// renderer renderer new THREE.WebGLRenderer({ antialias: true }); renderer.setSize(window.innerWidth, window.innerHeight); renderer.setPixelRatio(window.devicePixelRatio); container.appendChild(renderer.domElement);controls new OrbitControls(camera, renderer.domElement); controls.enableDamping true; controls.minDistance 2; controls.maxDistance 10; stats new Stats(); document.body.appendChild(stats.dom);// light initLight();// model initModel();// event window.addEventListener(resize, onWindowResize, false); }function initLight() { var light new THREE.DirectionalLight(0xffffff); light.position.set(0, 200, 100); scene.add(light); }// model function initModel() { const cubeShader { uniforms: { tDiffuse: { type: t, value: new THREE.TextureLoader().load(FILE_HOST threeExamples/shader/dlam.jpg) }, vScreenSize: { type: v2, value: new THREE.Vector2(window.innerWidth, window.innerHeight) }, vCenter: { type: v2, value: new THREE.Vector2(window.innerWidth / 2, window.innerHeight / 2) }, fRadius: { type: f, value: window.innerWidth / 2.0 }, fUzuStrength: { type: f, value: 2.0 }, }, vertexShader:varying vec2 vUv; void main(){ vUv uv; gl_Position projectionMatrixmodelViewMatrixvec4(position, 1.0); }, fragmentShader:uniform sampler2D tDiffuse; varying vec2 vUv; uniform vec2 vScreenSize; uniform vec2 vCenter; uniform float fRadius; uniform float fUzuStrength;void main() { vec2 pos (vUv * vScreenSize) - vCenter; float len length(pos); if (len fRadius) { gl_FragColor texture2D(tDiffuse, vUv); return; }float uzu min(max(1.0 - (len / fRadius), 0.0), 1.0) * fUzuStrength; float x pos.xcos(uzu) - pos.ysin(uzu); float y pos.xsin(uzu) pos.ycos(uzu); vec2 retPos (vec2(x, y) vCenter) / vScreenSize; vec4 color texture2D(tDiffuse, retPos); gl_FragColor color; }, }cubeMaterial new THREE.ShaderMaterial({ uniforms: cubeShader.uniforms, vertexShader: cubeShader.vertexShader, fragmentShader: cubeShader.fragmentShader, side: THREE.DoubleSide });var geometry new THREE.PlaneGeometry(); var cube new THREE.Mesh(geometry, cubeMaterial); scene.add(cube); }function update() { requestAnimationFrame(update); renderer.render(scene, camera);controls.update(); stats.update(); }function onWindowResize() { var w window.innerWidth; var h window.innerHeight; camera.aspect w / h; camera.updateProjectionMatrix();renderer.setSize(w, h); }function createGUI() { var gui new GUI(); gui.add(cubeMaterial.uniforms[fRadius], value, 1.0, 1000.0).step(1.0).name(radius); gui.add(cubeMaterial.uniforms[fUzuStrength], value, -4.0, 4.0).step(0.1).name(uzuStrength); }完整源码GitHub小结本文提供扭曲完整 Three.js 源码与在线 Demo建议先运行案例再改 uniform/参数做二次实验更多 Three.js 实战案例见 three-cesium-examples 合集 与 GitHub 开源仓库
RELATED

相关推荐

3PEAK思瑞浦 T74L1G17Q-SC5R-S SOT353 缓冲器和收发器

3PEAK思瑞浦 T74L1G17Q-SC5R-S SOT353 缓冲器和收发器

特性 宽电源电压范围,从1.65V到5.5V1/0容差输入至5.5V 所有输入均带施密特触发器输入 CMOS低功耗特性 1/OOFF支持部分断电保护 静电放电保护:4kVHE3M型号,1kVCDM型号 锁存性能超过JESD78标准,II类 符合汽车应用的AEC-Q100标准,等级…

📅 2026/8/25 11:21:34
3PEAK思瑞浦 T74L1G126Q-SC5R-S SOT353 缓冲器和收发器

3PEAK思瑞浦 T74L1G126Q-SC5R-S SOT353 缓冲器和收发器

特性 宽电源电压范围,从1.65V到5.5V 输入端子耐压高达5.5V 所有输入具有Schmitt触发动作 CMOS低功耗特性IOFF支持部分断电保护 ESD保护:4kVHEM型号,1kVCDM型号 闩锁性能超过JESD78标准,II类,每通道100mA 符合汽车应用的AEC-Q100标…

📅 2026/10/15 1:49:23
Python深入浅出:从入门到工程实践14

Python深入浅出:从入门到工程实践14

第 14 章:异步编程:asyncio 学习目标: 理解协程、事件循环和 Task 三者的关系 掌握 async/await 语法和 asyncio 核心API 能用 TaskGroup 编写结构化并发程序 知道何时该用异步、何时该用线程/进程 14.0 从同步到异步:一个性能问题 回顾第13章的电商场景——串行请求 5 个…

📅 2026/10/2 6:02:15
MORE NEWS

更多资讯

📰

从制度到行动:业务连续性管理办法的RTO/RPO与演练实践

简介:这是一份可直接落地的业务连续性管理办法文档,主要面向金融类服务平台、企业风险管理与运维团队,用于构建覆盖事前预防、事中处置、事后恢复的完整机制。压缩包内仅含1个docx文件,体积约27KB,轻量实用&#xff0c…

📰

Now Playing 检测不到歌曲?5 大音频设备与平台切换排查技巧

【免费下载链接】now-playing-service 一款全能的「正在播放」歌曲展示工具。支持检测 20 款音乐软件的歌曲信息,内置精美歌曲组件、歌词组件、播放器,提供 API 接口。适配 OBS 等直播软件以及日常桌面使用。 项目地址: https://gitcode.com/…

📰

网络分析仪校准全解析:12项误差模型与Smart Cal实践

简介:面向射频与微波测试工程师、仪器操作人员及相关专业师生的校准操作文档,围绕Keysight E5080B网络分析仪展开,并兼顾多系列统一界面下的基本校准流程。内容从扫描类型、频率范围、扫描点数、中频带宽与输出功率等基本设置切入&#xff0c…

📰

WorkBuddy_新建任务与工作模式13_Plan模式的完整流程

Plan模式的完整流程 摘要 Plan模式是当前主流AI编程助手(如Cursor、Claude Code、Cline等)中一种非常重要的工作机制:在真正动手修改代码之前,先让AI产出一份可审阅的执行方案,由人类确认或调整后再落地执行。本文将围…

📰

基于SSM的机房管理系统源码:设备台账与IP资源全流程管理

简介:这份资源面向计算机相关专业学生与数据库课程设计者,提供一套完整的学院机房管理系统数据库设计方案,帮助解决从需求分析到SQL落地的全流程实践问题。压缩包共3个文件,包含2个doc文档与1个sql脚本,整体约155KB&am…

📰

Stewart平台MATLAB仿真:逆解、动力学与实时可视化全流程实现

简介:本资源是一份面向机器人控制与并联机构研究者的MATLAB实践指南,聚焦Stewart六自由度并联平台的运动学逆解建模、牛顿-欧拉法动力学方程推导及Simscape Multibody三维联合仿真,有效解决奇异位形识别、轨迹规划失稳、雅可比矩阵计算偏差等…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬