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

Three.js 随机城市白膜教程

随机城市白膜 ·White Model· ▶ 在线运行案例

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

你将学到什么

  • OrbitControls 相机轨道交互
  • 监听窗口resize同步更新 camera 与 renderer

效果说明

本案例演示随机城市白膜效果:生成仿真城市白膜;核心用到 OrbitControls。建议先打开文首在线案例查看动态画面,再对照下方源码逐步理解。

核心概念

  • Scene / Camera / WebGLRenderer构成最小渲染闭环;大场景可开logarithmicDepthBuffer缓解 Z-fighting。
  • OrbitControls提供轨道旋转/缩放;开启enableDamping后需在 animate 中controls.update()
  • 阅读下方完整源码时,建议从init/load/animate三条主线入手,再深入 shader 与工具函数。

实现步骤

  • 搭建灯光与环境(如有)
  • requestAnimationFrame 循环 update + render
  • 代码要点

    import * as THREE from 'three';

    import { OrbitControls } from "three/examples/jsm/Addons.js"; const DOM = document.getElementById('box')

    var scene = new THREE.Scene();

    var camera = new THREE.PerspectiveCamera(60, innerWidth / innerHeight); camera.position.set(-1, 0.5, 1).setLength(75);

    camera.lookAt(scene.position);

    var renderer = new THREE.WebGLRenderer({ antialias: true }); renderer.setSize(innerWidth, innerHeight); renderer.setAnimationLoop(animationLoop); function animationLoop() { renderer.render(scene, camera); } DOM.appendChild(renderer.domElement);

    window.addEventListener("resize", () => { camera.aspect = innerWidth / innerHeight; camera.updateProjectionMatrix(); renderer.setSize(innerWidth, innerHeight); });

    var controls = new OrbitControls(camera, renderer.domElement); controls.target.set(0, 12, 0);

    controls.update(); controls.enableDamping = true; controls.autoRotate = true;

    var light = new THREE.DirectionalLight('white', 3); light.position.set(1, 1, 1); scene.add(light); import { Mesh, MathUtils, PlaneGeometry, Color,BoxGeometry,MeshBasicMaterial } from 'three';

    /**

    • 生成仿真城市白膜
    */ const buildingGeometry = new BoxGeometry(1, 1, 1); buildingGeometry.translate(0, 0.5, 0); // 调整几何中心点 const buildingMaterial = new MeshBasicMaterial({ color: 0xcccccc }); function generateCityModel() { const citySize = 50; // 城市范围 const spacing = 10; // 建筑间隔 const maxDistance = citySize * spacing; // 最大影响范围 const plane = new PlaneGeometry(maxDistance2, maxDistance2); plane.rotateX(-Math.PI / 2) scene.add(new Mesh(plane)) for (let z = -citySize; z < citySize; z++) { for (let x = -citySize; x < citySize; x++) { // 跳过城市中心一定区域,避免过密 if (Math.abs(x) < 5 && Math.abs(z) < 5) continue;

    // 计算建筑位置 const positionX = x * spacing; const positionZ = z * spacing; const distanceFromCenter = Math.sqrt(positionX2 + positionZ2);

    // 根据距离中心的远近调整建筑高度和生成概率 const distanceFactor = 1 - MathUtils.clamp(distanceFromCenter / maxDistance, 0, 1); const heightScale = Math.pow(distanceFactor, 4); // 高度衰减曲线

    if (Math.random() < distanceFactor) { // 随机生成的概率 const building = new Mesh(buildingGeometry, buildingMaterial);

    // 设置建筑位置 let offset = (Math.random()0.5 - 1)spacing building.position.set(positionX + offset, 0, positionZ + offset);

    // 设置建筑缩放 building.scale.set( MathUtils.randInt(1, 4), // 宽度随机 1 + Math.floor(Math.random()heightScale35), // 高度与距离中心相关 MathUtils.randInt(1, 4) // 深度随机 ); // 随机红色 if (Math.random() < 0.1) { building.material = building.material.clone(); building.material.color = new Color('red'); } scene.add(building); } } } }

    generateCityModel()

    完整源码:GitHub

    小结

    • 本文提供随机城市白膜完整 Three.js 源码与在线 Demo,建议先运行案例再改 uniform/参数做二次实验
    • 更多 Three.js 实战案例见 three-cesium-examples 合集 与 GitHub 开源仓库
http://www.gsyq.cn/news/1616173.html

相关文章:

  • 2026年大模型“开源海啸”下,锥形语言模型零成本提升性能!
  • 煮饺子与docker、kubernetes之间的关系
  • 音频设备有底噪?选对音频变压器是关键
  • Three.js 优雅永不过时教程
  • GPT-5.6登场硬刚Claude Mythos 5,跑分互有胜负却因作弊被严控!
  • LG 发布新款扫地机器人,充电基座可藏厨房橱柜,或不进美国市场
  • 字节跳动All in AI:从C端到B端,双端下注能否跑通AI战略?
  • pdf盖章软件
  • 记录Linux线程(信号量函数)
  • Linux Wireless之WiFi Beacon Hint 流程分析
  • 对称加密算法实战指南:从AES到SM4,原理、选型与安全实践
  • 老牌顶刊跌下神坛,为何IF和分区双双“失守”?
  • 9-LLTrack:用于二维多目标跟踪的并行关联框架
  • OpenTelemetry 多租户分流怎么做:按服务名路由 traces 的实战方案
  • 三步打造个人数字图书馆:novel-downloader小说下载器终极指南
  • Grok 4.5私测,马斯克AI战略是转型还是出清?
  • ESim电工制图图文介绍
  • Linux 系统编程 04:进程基础
  • 3分钟免费解锁全皮肤:R3nzSkin国服换肤终极指南
  • 贾扬清从英伟达离职,7 亿美元收购一年告终,AI Infra 赛道面临挑战
  • 深度解析SDINBDA6-128G-ZA1:闪迪128GB车规级eMMC 5.1存储芯片
  • 嵌入式交流群
  • 大宅门中式建筑,已按人物标准升高修改
  • 产业园区两轮车乱象难治理?观芯AI摄像头专项实测方案
  • 案例分析:100GigE高速相机的出现助力创新生物医学诊断
  • MC6470与TM4C1299NCZAD的硬件协同与6DOF数据融合实战
  • Vibe Coding 避坑指南:3 张提示词模板,把烂尾率从 80% 打下来
  • 2026滁州黄金回收白银回收铂金回收旧料回收怎么选?五家高实价铂金白银线下门店测评清单 + 联系方式
  • Resource 体系纵深实战:构建动态模板化代码片段的资源服务器
  • 为什么你的IDEA多模块项目永远跑不通?揭秘被官方文档隐藏的6个IDEA专属Maven生命周期陷阱