尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

Three.js 蘑菇教程

Three.js 蘑菇教程
📅 发布时间:2026/7/7 10:59:00

蘑菇 ·Mushroom· ▶ 在线运行案例

  • 案例合集:三维可视化功能案例(threehub.cn)
  • 开源仓库github地址:https://github.com/z2586300277/three-cesium-examples
  • 400个案例代码:网盘链接

你将学到什么

  • 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循环中更新状态并 render(Cesium 为viewer.render或自动渲染)
  • 代码要点

    import * as THREE from "three";

    import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls.js'

    const DOM = document.getElementById('box')

    const scene = new THREE.Scene()

    const camera = new THREE.PerspectiveCamera(50, DOM.clientWidth / DOM.clientHeight, 0.1, 100000) camera.position.set(10, 10, 10) scene.add(camera);

    const renderer = new THREE.WebGLRenderer({ antialias: true, alpha: true, logarithmicDepthBuffer: true }) renderer.setSize(DOM.clientWidth, DOM.clientHeight) renderer.setPixelRatio(window.devicePixelRatio * 2) renderer.setClearColor(0x000000) DOM.appendChild(renderer.domElement) new OrbitControls(camera, renderer.domElement)

    const uniforms = { Mouse: { type: 'v2', value: new THREE.Vector2(0, 0) }, Resolution: { type: 'v2', value: new THREE.Vector2(window.innerWidth, window.innerHeight) }, Time: { type: 'f', value: 1.0 } }

    DOM.addEventListener('mousemove', (event) => uniforms.Mouse.value = new THREE.Vector2( (event.offsetX / event.target.clientWidth) * 2 - 1, -(event.offsetY / event.target.clientHeight) * 2 + 1 )) const geometry = new THREE.BoxGeometry(10, 10, 10);

    var material = new THREE.ShaderMaterial({ uniforms: uniforms, vertexShader:varying vec2 vUv; void main(){ gl_Position=projectionMatrixmodelViewMatrixvec4(position,1.); vUv=uv; }, fragmentShader:#ifdef GL_ES precision mediump float; #endif uniform vec2 Resolution; uniform vec3 Mouse; uniform float Time; varying vec2 vUv; mat2 rot2D(float angle){ float s=sin(angle); float c=cos(angle); return mat2(c,-s,s,c); } float sdCutHollowSphere(vec3 p,float r,float h,float t) { float w=sqrt(rr-hh); vec2 q=vec2(length(p.xz),p.y); return((hq.xq.y)?length(q-vec2(w,h)): abs(length(q)-r))-t; } vec4 sdstripe(vec3 p,vec3 color){ p.xz=abs(p.xz); float d1=sdCutHollowSphere(p-vec3(.0,-3.3,0.),.8,.01,.01); float d2=sdCutHollowSphere(p-vec3(.9,-3.3,.9),.5,.005,.01); float d=min(d1,d2); return vec4(d,color); } vec4 sdCutSphere(vec3 p,float r,float h,vec3 color) { float w=sqrt(rr-hh); vec2 q=vec2(length(p.xz),p.y); float s=max((h-r)q.xq.x+ww(h+r-2.q.y),hq.x-w*q.y); float d=(s<0.)?length(q)-r: (q.x pabababa); float cax=max(0.,x-((paba<.5)?ra:rb)); float cay=abs(paba-.5)-.5; float k=rba*rba+baba; float f=clamp((rba(x-ra)+pabababa)/k,0.,1.); float cbx=x-ra-f*rba; float cby=paba-f; float s=(cbx<0.&&cay<0.)?-1.:1.; return vec4(ssqrt(min(caxcax+caycaybaba, cbxcbx+cbycby*baba)),color); } float smin(float d1,float d2,float k){ float h=clamp(.5+.5*(d2-d1)/k,0.,1.); return mix(d2,d1,h)-kh(1.-h); } vec4 colorMin(vec4 a,vec4 b){ if(a.x 100.||d.x<.001){ break; } color=vec4(td.yzw.13,1.); } gl_FragColor=color; }, uniforms });

    material.side = THREE.DoubleSide

    var mesh = new THREE.Mesh(geometry, material); mesh.scale.set(1, -1, 1) scene.add(mesh);

    render() function render() { uniforms.Time.value += 0.005; renderer.render(scene, camera) requestAnimationFrame(render) }

    完整源码:GitHub

    小结

    • 本文提供蘑菇完整 Three.js 源码与在线 Demo,建议先运行案例再改 uniform/参数做二次实验
    • 更多 Three.js 实战案例见 three-cesium-examples 合集 与 GitHub 开源仓库

相关新闻

  • DHDMS-Lang v4.0:经典-量子混合编译、形式化验证与AI原生编程范式
  • 2026年AI大模型接口加速站全网实测排行榜:五大主流平台硬核数据全方位权威对比指南
  • G-Helper:华硕笔记本性能调校的轻量级解决方案

最新新闻

  • Agent产品的工程化落地:从Demo到可交付系统的关键路径
  • Cursor高阶实战:Slash Command意图编译与Plan决策链路解析
  • WinBtrfs完整指南:在Windows上无缝访问Linux Btrfs文件系统
  • 连续与离散系统频率特性对比:3类滤波器零极点配置规律总结
  • 系统分析师案例分析题常考知识点
  • Gemini 3.5 辅助单元测试实战:Jacoco+JUnit5 实现覆盖率从40%到90%跃升

日新闻

  • Android逆向分析全能助手:集成化工具链与自动化工作流设计
  • 面搜索(Faceted Search)原理与工程实践指南
  • 神经网络调参避坑指南:从5个常见Loss曲线形态定位超参数问题

周新闻

  • 基于YOLOv12的番茄成熟度智能检测系统开发
  • 终极RimWorld模组管理指南:用RimSort告别模组冲突烦恼
  • AI Agent框架开发:从理论到实践的完整指南

月新闻

  • 2026年6月公司网站搭建最新热门渠道测评:四大低成本/零代码平台对比+避坑
  • 【Linux】Linux arm 编译QT程序,出现expected “}“报错
  • 【MATLAB例程】四基站二维AOA定位与距离辅助增强对比仿真。基于角度观测和测距修正的固定目标平面定位精度分析

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号