Three.js 建筑渐变教程
建筑渐变 ·Building Gradient· ▶ 在线运行案例案例合集三维可视化功能案例threehub.cn开源仓库github地址https://github.com/z2586300277/three-cesium-examples400个案例代码:网盘链接你将学到什么ShaderMaterial 自定义着色器实现核心视觉效果OrbitControls 相机轨道交互glTF/Draco 模型加载与优化requestAnimationFrame渲染循环与resize自适应效果说明本案例演示建筑渐变效果基于 WebGL 实现「建筑渐变」可视化效果附完整可运行源码核心用到 ShaderMaterial、OrbitControls、glTF/Draco。建议先打开文首在线案例查看动态画面再对照下方源码逐步理解。核心概念Scene / Camera / WebGLRenderer构成最小渲染闭环大场景可开logarithmicDepthBuffer缓解 Z-fighting。ShaderMaterial通过uniforms 自定义 GLSL 控制逐像素/逐点效果透明粒子常配合depthTest: false。OrbitControls提供轨道旋转/缩放开启enableDamping后需在 animate 中controls.update()。实现步骤搭建 Scene、PerspectiveCamera、WebGLRenderer挂载 canvas 并处理resize异步加载模型 / 3D Tiles / GeoJSON 等资源并加入 scene 或 entities定义 uniforms / onBeforeCompile 或 ShaderMaterial编写 GLSL 与材质参数创建 OrbitControls及 Raycaster 等交互控件若源码包含在requestAnimationFrame循环中更新状态并 renderCesium 为viewer.render或自动渲染代码要点import * as THREE from threeimport { OrbitControls } from three/examples/jsm/controls/OrbitControls.js import { GLTFLoader } from three/examples/jsm/loaders/GLTFLoader.js import { GUI } from three/examples/jsm/libs/lil-gui.module.min.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(1, 1, 1)const renderer new THREE.WebGLRenderer({ antialias: true, alpha: true , logarithmicDepthBuffer: true }) renderer.setSize(box.clientWidth, box.clientHeight) renderer.setPixelRatio(window.devicePixelRatio) box.appendChild(renderer.domElement)new OrbitControls(camera, renderer.domElement)const shaderMaterial new THREE.ShaderMaterial({ vertexShader:uniform vec3 uColorBottom; uniform vec3 uColorTop; uniform float uMinY; uniform float uMaxY; uniform float uTime; varying vec3 vColor; varying vec2 vUv; varying vec3 vNormal; varying vec3 vPosition; void main() { // 设置UV坐标类似原始着色器中的缩放方式 vUv vec2(position.x / 80.0, position.y / 250.0); vNormal normalize(normalMatrix * normal); vPosition position; // 基础渐变效果 float factor smoothstep(uMinY, uMaxY, position.y); vColor mix(uColorBottom, uColorTop, factor); gl_Position projectionMatrixmodelViewMatrixvec4(position, 1.0); }, fragmentShader:uniform vec3 uColorBottom; uniform vec3 uColorTop; uniform vec3 uSweepColor; uniform float uTime; uniform vec3 uLightDir; uniform float uScanWidth; uniform float uScanSoftness; varying vec3 vColor; varying vec2 vUv; varying vec3 vNormal; varying vec3 vPosition; // 随机函数与原始着色器相同 float random(vec2 st) { return fract(sin(dot(st.xy, vec2(12.9898, 78.233))) * 43758.5453123); } // 叠加混合函数 - 让扫描颜色与基础渐变叠加 vec3 blendOverlay(vec3 base, vec3 blend) { vec3 result; result.r (base.r 0.5) ? (2.0base.rblend.r) : (1.0 - 2.0(1.0 - base.r)(1.0 - blend.r)); result.g (base.g 0.5) ? (2.0base.gblend.g) : (1.0 - 2.0(1.0 - base.g)(1.0 - blend.g)); result.b (base.b 0.5) ? (2.0base.bblend.b) : (1.0 - 2.0(1.0 - base.b)(1.0 - blend.b)); return result; } void main() { // 基础颜色混合基于Y坐标 vec3 originColor mix(uColorBottom, uColorTop, vUv.y); // 平滑的扫描波动效果 float scanPos fract(uTime * 0.2); // 扫描位置 (0-1循环) float scanLine 1.0 - abs(vUv.y - scanPos) / uScanWidth; scanLine smoothstep(0.0, uScanSoftness, scanLine); // 计算扫描颜色 - 简化处理移除彩虹选项 vec3 finalSweepColor uSweepColor; // 添加轻微的噪声获得更自然的效果 float noise random(vUv10.0 uTime0.1) * 0.03 0.97; // 计算最终扫描颜色 vec3 sweepColor finalSweepColor * noise; // 简化的光照效果 float diffuse dot(normalize(uLightDir), vNormal); diffuse clamp(-diffuse, 0.0, 0.45); // 应用最终效果 - 使用叠加混合而非简单混合 vec3 color originColor; // 叠加混合扫描效果 - 根据扫描线强度 vec3 overlayColor blendOverlay(originColor, sweepColor); color mix(color, overlayColor, scanLine * 0.8); // 添加额外的扫描光亮效果 color sweepColorscanLine0.2; // 添加轻微边缘发光 - 也使用叠加效果 float edge 1.0 - max(0.0, dot(vNormal, vec3(0.0, 0.0, 1.0))); vec3 edgeColor blendOverlay(originColor, sweepColor * edge); color mix(color, edgeColor, edge * 0.3); // 添加发光效果 vec3 emissive vec3(diffuse) * 0.5; color emissive; gl_FragColor vec4(color, 1.0); }, uniforms: { uColorBottom: { value: new THREE.Color(0x6373b6) }, uColorTop: { value: new THREE.Color(0xffffff) }, uSweepColor: { value: new THREE.Color(0xb1ddec) }, uMinY: { value: 0.0 }, uMaxY: { value: 1.0 }, uTime: { value: 0.0 }, uLightDir: { value: new THREE.Vector3(0.5, 0.5, 0.5).normalize() }, uScanWidth: { value: 0.1 }, uScanSoftness: { value: 0.8 } }, transparent: true, })new GLTFLoader().load(FILE_HOST models/whitebuild.glb, (gltf) { const model gltf.scene; const bounds new THREE.Box3().setFromObject(model); shaderMaterial.uniforms.uMinY.value bounds.min.y; shaderMaterial.uniforms.uMaxY.value bounds.max.y; model.traverse(child { if (child.isMesh) child.material shaderMaterial; }); scene.add(model); });function animate() { requestAnimationFrame(animate); shaderMaterial.uniforms.uTime.value 0.01; renderer.render(scene, camera); } animate()window.onresize () { renderer.setSize(box.clientWidth, box.clientHeight) camera.aspect box.clientWidth / box.clientHeight camera.updateProjectionMatrix() } // 扩展GUI控制 - 移除彩虹选项 const gui new GUI() const colorFolder gui.addFolder(颜色设置) colorFolder.addColor(shaderMaterial.uniforms.uColorBottom, value).name(底部颜色) colorFolder.addColor(shaderMaterial.uniforms.uColorTop, value).name(顶部颜色) colorFolder.addColor(shaderMaterial.uniforms.uSweepColor, value).name(扫描颜色)const effectsFolder gui.addFolder(效果设置) effectsFolder.add(shaderMaterial.uniforms.uTime, value, 0.001, 0.05).name(动画速度).onChange(value { animate function() { requestAnimationFrame(animate) shaderMaterial.uniforms.uTime.value value; renderer.render(scene, camera) } }) effectsFolder.add(shaderMaterial.uniforms.uScanWidth, value, 0.001, 0.3).name(扫描宽度) effectsFolder.add(shaderMaterial.uniforms.uScanSoftness, value, 0.1, 1.0).name(扫描柔和度)完整源码GitHub小结本文提供建筑渐变完整 Three.js 源码与在线 Demo建议先运行案例再改 uniform/参数做二次实验更多 Three.js 实战案例见 three-cesium-examples 合集 与 GitHub 开源仓库

相关新闻

KMR221与TM4C129ENCPDT在精密电压监控系统中的应用

KMR221与TM4C129ENCPDT在精密电压监控系统中的应用

1. 项目背景与核心器件选型在工业自动化和精密仪器领域,电压管理系统的精度直接决定了设备的可靠性和测量准确性。最近我在设计一套用于医疗设备的电源监控系统时,选择了KMR221电压监控器与TM4C129ENCPDT微控制器的组合方案。这个搭配在3个月的实测中表现…

2026/7/5 13:17:27阅读更多 →
影刀RPA深度教程:飞书生态联动实战

影刀RPA深度教程:飞书生态联动实战

影刀RPA深度教程:飞书生态联动实战 飞书是和影刀联动最深的平台。消息通知、多维表格、审批、日程,全流程都能自动化。 这篇文章把飞书联动讲透,附带3个完整实战案例。 先装好环境 www.yingdao.com 下载,社区版免费。 飞书授权…

2026/7/5 13:17:27阅读更多 →
ALVR无线串流终极指南:3步实现PC VR游戏无线自由体验

ALVR无线串流终极指南:3步实现PC VR游戏无线自由体验

ALVR无线串流终极指南:3步实现PC VR游戏无线自由体验 【免费下载链接】ALVR Stream VR games from your PC to your headset via Wi-Fi 项目地址: https://gitcode.com/gh_mirrors/alvr/ALVR 你是否厌倦了VR游戏时被线缆束缚的感觉?ALVR作为一款免…

2026/7/5 13:17:27阅读更多 →
2026最新AI Agent从零落地实战指南!小白程序员专属企业级开发教程

2026最新AI Agent从零落地实战指南!小白程序员专属企业级开发教程

本文全方位拆解2026年从零开发企业级AI Agent的完整流程、核心技巧与落地避坑经验,摒弃纯理论空谈,聚焦业务落地与工程实战。区别于传统技术科普,全文主打新手友好、实战为王,覆盖Agent产品定位、通用能力局限、交互设计、任务工程…

2026/7/5 14:17:32阅读更多 →
终极便携式Windows C/C++开发工具链:w64devkit完全指南

终极便携式Windows C/C++开发工具链:w64devkit完全指南

终极便携式Windows C/C开发工具链:w64devkit完全指南 【免费下载链接】w64devkit Portable C and C Development Kit for x64 (and x86) Windows 项目地址: https://gitcode.com/gh_mirrors/w6/w64devkit 你是否厌倦了Visual Studio那庞大的安装包&#xff1…

2026/7/5 14:17:32阅读更多 →
Modbus工控安全渗透测试:Smod框架实战与防御指南

Modbus工控安全渗透测试:Smod框架实战与防御指南

1. 项目概述:当工业控制网络遇上渗透测试在工业自动化领域,Modbus协议就像普通话一样通用,几乎所有的可编程逻辑控制器(PLC)、传感器和监控系统都支持它。然而,这种广泛性也带来了巨大的安全隐患。想象一下…

2026/7/5 14:17:32阅读更多 →
收藏!2026年企业决胜关键:AI智能体(小白程序员必看)

收藏!2026年企业决胜关键:AI智能体(小白程序员必看)

本文深入浅出地解释了AI智能体(Agent)的概念及其重要性,指出2026年将是AI智能体应用的关键转折点。文章强调AI智能体不同于传统的对话工具,如ChatGPT,它能够自主执行任务,调用其他工具,并具有目…

2026/7/5 14:17:32阅读更多 →
pytest中文教程:从入门到实战的自动化测试框架指南

pytest中文教程:从入门到实战的自动化测试框架指南

1. 项目概述:为什么你需要一份高质量的 pytest 中文文档如果你正在学习或使用 Python 进行自动化测试,那么pytest这个名字你一定不陌生。它几乎是 Python 测试领域的“事实标准”,以其简洁的语法、强大的功能和丰富的插件生态,让编…

2026/7/5 14:17:32阅读更多 →
终极指南:如何使用Flowframes轻松实现视频AI智能插帧,让画面流畅度翻倍

终极指南:如何使用Flowframes轻松实现视频AI智能插帧,让画面流畅度翻倍

终极指南:如何使用Flowframes轻松实现视频AI智能插帧,让画面流畅度翻倍 【免费下载链接】flowframes Flowframes Windows GUI for video interpolation using DAIN (NCNN) or RIFE (CUDA/NCNN) 项目地址: https://gitcode.com/gh_mirrors/fl/flowframe…

2026/7/5 14:12:32阅读更多 →
从GitHub安全案例解析常见漏洞与防护实践

从GitHub安全案例解析常见漏洞与防护实践

1. 项目概述:从GitHub Trending看安全实战 最近在GitHub Trending上看到一个项目,叫 skills4/skills ,它因为一些安全漏洞案例被大家讨论。这其实是一个挺典型的场景:一个旨在展示或教授某种技能的仓库,本身却成了安…

2026/7/5 0:01:08阅读更多 →
MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

# MLT 2026启示:因果推理与概率建模驱动下一代LLM应用## 一、背景与挑战:从“黑箱预测”到“可信推理”2026年6月,第7届机器学习与趋势国际会议(MLT 2026)将在悉尼召开。会议议程中,“因果与可解释机器学习…

2026/7/5 0:01:08阅读更多 →
通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

1. 项目概述与漏洞背景最近在梳理一些历史OA系统的安全风险时,通达OA v11.6版本中的一个老漏洞又进入了我的视线。这个漏洞位于/general/bi_design/appcenter/report_bi.func.php文件中,是一个典型的SQL注入点。虽然这个漏洞的利用方式看起来并不复杂&am…

2026/7/5 0:01:08阅读更多 →
从GitHub安全案例解析常见漏洞与防护实践

从GitHub安全案例解析常见漏洞与防护实践

1. 项目概述:从GitHub Trending看安全实战 最近在GitHub Trending上看到一个项目,叫 skills4/skills ,它因为一些安全漏洞案例被大家讨论。这其实是一个挺典型的场景:一个旨在展示或教授某种技能的仓库,本身却成了安…

2026/7/5 0:01:08阅读更多 →
MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

# MLT 2026启示:因果推理与概率建模驱动下一代LLM应用## 一、背景与挑战:从“黑箱预测”到“可信推理”2026年6月,第7届机器学习与趋势国际会议(MLT 2026)将在悉尼召开。会议议程中,“因果与可解释机器学习…

2026/7/5 0:01:08阅读更多 →
通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

1. 项目概述与漏洞背景最近在梳理一些历史OA系统的安全风险时,通达OA v11.6版本中的一个老漏洞又进入了我的视线。这个漏洞位于/general/bi_design/appcenter/report_bi.func.php文件中,是一个典型的SQL注入点。虽然这个漏洞的利用方式看起来并不复杂&am…

2026/7/5 0:01:08阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/5 1:30:27阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/5 3:48:10阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/5 3:48:09阅读更多 →