Three.js 冰面教程
冰面 ·Ice Floor· ▶ 在线运行案例案例合集三维可视化功能案例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 threeimport { OrbitControls } from three/examples/jsm/controls/OrbitControls.jsconst box document.getElementById(box)const scene new THREE.Scene()const camera new THREE.PerspectiveCamera(75, box.clientWidth / box.clientHeight, 0.1, 100000)camera.position.set(5, 5, 5)const renderer new THREE.WebGLRenderer({ antialias: true, alpha: true, logarithmicDepthBuffer: true })renderer.setSize(box.clientWidth, box.clientHeight)box.appendChild(renderer.domElement)const controls new OrbitControls(camera, renderer.domElement) controls.enableDamping true// https://github.com/rock-biter/ice-trails const textureLoader new THREE.TextureLoader() const crackMap textureLoader.load(FILE_HOST images/shader/cracks.png) crackMap.wrapS THREE.RepeatWrapping crackMap.wrapT THREE.RepeatWrapping const perlinMap textureLoader.load(FILE_HOST images/shader/smokeMap.png) perlinMap.wrapS THREE.RepeatWrapping perlinMap.wrapT THREE.RepeatWrapping const groundMaterial new THREE.ShaderMaterial({ vertexShader:uniform float uParallaxDistance;varying vec2 vParallax; varying vec2 vUv;void main() {vUv uv;vec3 pos position; vec4 wPos modelMatrix * vec4(pos, 1.0);mat3 tbn mat3(vec3(1.,0,0), vec3(0,0.,-1.), vec3(0.,1.,0.)); tbn transpose(tbn);vec3 viewDir normalize(wPos.xyz - cameraPosition); vec3 tbnViewDir tbn * viewDir;vParallax tbnViewDir.xy; vParallax * uParallaxDistance / dot(-tbnViewDir, vec3(0.0,0.0,1.0));gl_Position projectionMatrixviewMatrixwPos;}, fragmentShader:uniform sampler2D uCracksMap; uniform sampler2D uTrailMap; uniform sampler2D uPerlin;varying vec2 vParallax; varying vec2 vUv;void main() {float perlin texture(uPerlin, vUv).r; float perlin2 texture(uPerlin, vUv * 10.).r; vec3 trail texture(uTrailMap, vUv).rgb; float cracks texture(uCracksMap, vUv * 4.).r; float nomalization 1.0;vec3 colorBlue vec3(0.0,0.2,0.25); vec3 colorDeepBlue vec3(0.0,0.01,0.03); vec3 colorGreen vec3(0.1,0.2,0.35);float accumulateFrosted 0.;for (int i 0; i 50; i) { float aplitude float(70 - i) / 1.; vec2 uv vUv4. vParallax0.002 * float(i 1);float currCrack (1. - texture(uCracksMap, uv ).r) * aplitude;float currTrail texture(uTrailMap, vUv vParallax0.0025float(i 1)).r;currCrack currCrack * step(0.7, 1. - pow(currTrail,0.7));cracks currCrack; nomalization aplitude;accumulateFrosted currTrail * aplitude; } cracks / nomalization; accumulateFrosted / nomalization; cracks pow(1. - texture(uCracksMap, vUv4.).r, 3.)3. * step(0.92, 1. - pow(trail.r,0.6)); vec3 cracksParallax texture(uCracksMap, vUv2. vParallax0.1).rgb; // color 1. - cracks; // color 1.0 - cracksParallax;vec3 frosted colorBlue3. perlin0.6 perlin2 * 0.6; vec3 cracksColor mix(colorBlue, colorGreen, pow(cracks,1.) * 1.); cracksColor pow(cracks,1.) * 2.; cracksColor perlin8. * colorBlue; cracksColor pow(cracks,1.) * 0.5; // cracksColor perlin24.;vec3 prxCracksColor mix(colorDeepBlue, colorBlue, pow(1. - cracksParallax.r,3.) * 10.); prxCracksColor * perlin; cracksColor mix(cracksColor, prxCracksColor, 0.3);// vec3 color mix(cracksColor, frosted, pow(trail.r,0.5)); // cracksColor mix(cracksColor, vec3(0.1,0.7,0.7), pow(accumulateFrosted,1.5)); vec3 deepColor mix(vec3(0.1,0.7,0.7),vec3(0., 0.3, 1.), 1. - pow(accumulateFrosted,1.5)); cracksColor mix(cracksColor, deepColor, pow(accumulateFrosted,1.5)); vec3 color mix(cracksColor, frosted, pow(trail.r,0.5) ); // color mix( color, colorBlue * frosted, pow(trail.r,3.));vec2 uv vUv - 0.5; uv * 2.0; color mix(color, vec3(0.0, 0.01, 0.02), smoothstep(0.2,1.,length(pow(abs(uv), vec2(1.)))));// 添加边缘透明度处理剔除边缘纯色部分 float edgeDistance length(uv); float alpha 1.0 - smoothstep(0.8, 1.0, edgeDistance);gl_FragColor vec4(color, alpha);#include #include }, transparent: true, side: THREE.DoubleSide, uniforms: { uTrailMap: new THREE.Uniform(), uCracksMap: new THREE.Uniform(crackMap), uPerlin: new THREE.Uniform(perlinMap), uParallaxDistance: new THREE.Uniform(1), }, })const groundGeometry new THREE.PlaneGeometry(15, 15) groundGeometry.rotateX(-Math.PI * 0.5) const ground new THREE.Mesh(groundGeometry, groundMaterial) scene.add(ground)animate()function animate() {controls.update() requestAnimationFrame(animate) renderer.render(scene, camera)}window.onresize () {renderer.setSize(box.clientWidth, box.clientHeight) camera.aspect box.clientWidth / box.clientHeight camera.updateProjectionMatrix()}完整源码GitHub小结本文提供冰面完整 Three.js 源码与在线 Demo建议先运行案例再改 uniform/参数做二次实验更多 Three.js 实战案例见 three-cesium-examples 合集 与 GitHub 开源仓库

相关新闻

高精度ADC MCP3551与MK24FN256VDC12 MCU的嵌入式系统设计

高精度ADC MCP3551与MK24FN256VDC12 MCU的嵌入式系统设计

1. 项目背景与核心组件解析在嵌入式系统开发中,模拟信号到数字信号的转换(ADC)是连接物理世界与数字世界的关键桥梁。MCP3551作为Microchip公司推出的22位Δ-Σ型ADC芯片,以其高精度和低噪声特性在工业测量、传感器接口等领域广受…

2026/7/8 0:12:49 阅读更多 →
像MUJI中国这样的线下门店型品牌小程序怎么做?2026全球5款AI/SAAS门店小程序开发工具:0代码做小程序,含零代码SAAS、AI编程、源码定制交付

像MUJI中国这样的线下门店型品牌小程序怎么做?2026全球5款AI/SAAS门店小程序开发工具:0代码做小程序,含零代码SAAS、AI编程、源码定制交付

一、汇总表工具/组合更适合谁价格开发方式核心特点餐宝盈适合所有行业的商家,尤其是拥有自己实体门店的商家,如餐饮、茶饮、烘焙、便利店、生鲜、社区零售门店、教培门店,尤其适合先把点单、预约、会员、发券和复购做起来的老板。99/年模板SA…

2026/7/8 0:08:49 阅读更多 →
基于TPS61170与STM32的高效DC-DC升压系统设计

基于TPS61170与STM32的高效DC-DC升压系统设计

1. 项目背景与核心器件选型在工业控制、医疗设备和实验室仪器等领域,经常需要将低压直流电源转换为高压直流电源。传统方案采用分立元件搭建升压电路,存在设计复杂、效率低下和稳定性差等问题。TPS61170作为德州仪器推出的高压升压转换芯片,配…

2026/7/8 0:06:48 阅读更多 →

最新新闻

PIC18LF25K40与PAM8904构建智能音频报警系统

PIC18LF25K40与PAM8904构建智能音频报警系统

1. 项目概述:基于PIC18LF25K40与PAM8904的智能通知系统在工业控制、智能家居和安防监控等领域,可靠的事件通知机制是保障系统安全运行的关键环节。本项目采用Microchip的PIC18LF25K40单片机作为控制核心,搭配PAM8904音频驱动芯片,…

2026/7/8 0:59:07 阅读更多 →
PyTorch 2.0+ 张量维度转换:view、reshape、permute 等8种方法性能对比与内存分析

PyTorch 2.0+ 张量维度转换:view、reshape、permute 等8种方法性能对比与内存分析

PyTorch 2.0 张量维度转换:8种核心方法性能对比与内存优化指南在深度学习模型开发中,张量维度转换是最基础却至关重要的操作。PyTorch提供了多达8种维度操作方法,但它们的性能特征和内存行为却大相径庭。本文将深入剖析view、reshape、permut…

2026/7/8 0:55:06 阅读更多 →
多代理配置:如何让OpenClaw的不同Agent使用不同的代理出口?

多代理配置:如何让OpenClaw的不同Agent使用不同的代理出口?

在多代理场景下,每个 Agent 独立代理出口的核心价值在于 实现彻底的账号与身份隔离。当你需要同时运营多个社交媒体账号、管理不同客户群体的咨询,或让不同 Agent 负责不同业务线时,如果所有流量都从一个 IP 出口发出,平台的风控系…

2026/7/8 0:55:06 阅读更多 →
高性能APK解析与零配置部署架构解析:实现Windows平台Android应用无缝运行

高性能APK解析与零配置部署架构解析:实现Windows平台Android应用无缝运行

高性能APK解析与零配置部署架构解析:实现Windows平台Android应用无缝运行 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 在移动应用开发与跨平台工作流日益…

2026/7/8 0:55:06 阅读更多 →
Parsec VDD高性能虚拟显示器驱动:Windows游戏串流与远程办公终极指南

Parsec VDD高性能虚拟显示器驱动:Windows游戏串流与远程办公终极指南

Parsec VDD高性能虚拟显示器驱动:Windows游戏串流与远程办公终极指南 【免费下载链接】parsec-vdd ✨ Perfect virtual display for game streaming 项目地址: https://gitcode.com/gh_mirrors/pa/parsec-vdd Parsec VDD(Virtual Display Driver&…

2026/7/8 0:51:06 阅读更多 →
计算机毕业设计之健身器材企业内部管理信息系统分析与设计

计算机毕业设计之健身器材企业内部管理信息系统分析与设计

健身器材企业内部管理信息系统分析与设计的目的是让使用者可以更方便的将人、设备和场景更立体的连接在一起。能让用户以更科幻的方式使用产品,体验高科技时代带给人们的方便,同时也能让用户体会到与以往常规产品不同的体验风格。与安卓,iOS相…

2026/7/8 0:49:05 阅读更多 →

日新闻

3大核心能力重塑《明日方舟》游戏体验:MAA自动化助手的革命性突破

3大核心能力重塑《明日方舟》游戏体验:MAA自动化助手的革命性突破

3大核心能力重塑《明日方舟》游戏体验:MAA自动化助手的革命性突破 【免费下载链接】MaaAssistantArknights 《明日方舟》小助手,全日常一键长草!| A one-click tool for the daily tasks of Arknights, supporting all clients. 项目地址: …

2026/7/8 0:00:48 阅读更多 →
MyBatis 批量操作深度优化——从 N+1 到批处理的全路径

MyBatis 批量操作深度优化——从 N+1 到批处理的全路径

MyBatis 批量操作深度优化——从 N1 到批处理的全路径 一、从"功能正确"到"性能可接受"——MyBatis 批量操作的三段式进化 MyBatis 在日常增删改查场景中几乎是无感的——实体映射直观、SQL 控制灵活。但当数据量从千级上升到十万级、百万级,许…

2026/7/8 0:00:48 阅读更多 →
工业负载控制方案:TPD2015FN与PIC18F45K22应用解析

工业负载控制方案:TPD2015FN与PIC18F45K22应用解析

1. 工业负载控制方案概述在工业自动化、电机驱动和照明控制等高需求场景中,可靠地控制电感和电阻负载是核心挑战之一。TPD2015FN作为东芝的8通道高端智能功率开关IC,配合PIC18F45K22微控制器,能够构建一套稳定、高效的负载控制系统。这套组合…

2026/7/8 0:02:48 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/7 14:24:45 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/7 12:34:47 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/7 15:59:06 阅读更多 →

月新闻