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

Three.js 变换 Box3教程

变换 Box3 ·Box3 Helper· ▶ 在线运行案例

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

你将学到什么

  • Box3.setFromObject计算物体世界空间 AABB
  • Box3Helper可视化黄色包围盒
  • TransformControlschange事件驱动包围盒刷新

效果说明

Fox 模型挂载 TransformControls,拖拽时黄色线框包围盒跟随更新,直观看到物体占用空间。

核心概念

const box3 = new THREE.Box3();

const box3Helper = new THREE.Box3Helper(box3, 0xffff00); scene.add(box3Helper);

transformControls.addEventListener('change', () => { box3Helper.box = box3.setFromObject(transformControls.object); });

AABB(轴对齐包围盒)不随物体旋转而旋转,始终与世界轴平行,适合碰撞粗测、视图 fit。

代码要点

import * as THREE from 'three'

import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls.js' import { GLTFLoader } from "three/addons/loaders/GLTFLoader.js" import { TransformControls } from 'three/examples/jsm/controls/TransformControls.js' import { RGBELoader } from 'three/examples/jsm/loaders/RGBELoader.js' import { GUI } from "three/addons/libs/lil-gui.module.min.js";

const box = document.getElementById('box')

const scene = new THREE.Scene()

const camera = new THREE.PerspectiveCamera(50, box.clientWidth / box.clientHeight, 0.1, 1000)

camera.position.set(0, 3, 6)

const renderer = new THREE.WebGLRenderer({ antialias: true, alpha: true, logarithmicDepthBuffer: true })

renderer.setSize(box.clientWidth, box.clientHeight)

renderer.shadowMap.needsUpdate = true

renderer.shadowMap.enabled = true

box.appendChild(renderer.domElement)

const controls = new OrbitControls(camera, renderer.domElement)

controls.enableDamping = true

const folder = new GUI()

// 变换控制器 const transformControls = new TransformControls(camera, renderer.domElement)

folder.add(transformControls, 'mode', ['translate', 'rotate', 'scale']).name('模式')

const transformControlsRoot = transformControls.getHelper()

transformControls.addEventListener('dragging-changed', event => controls.enabled = !event.value)

const box3 = new THREE.Box3()

const box3Helper = new THREE.Box3Helper(box3, 0xffff00)

scene.add(box3Helper)

transformControls.addEventListener('change', () => box3Helper.box = box3.setFromObject(transformControls.object))

scene.add(transformControlsRoot)

// 模型 const texture = new RGBELoader().load(FILE_HOST + '/files/hdr/1k.hdr', t => t.mapping = THREE.EquirectangularReflectionMapping)

new GLTFLoader().load(GLOBAL_CONFIG.getFileUrl('files/model/Fox.glb'), (gltf) => {

const model = gltf.scene

model.scale.set(0.01, 0.01, 0.01)

model.traverse((child) => child.isMesh && (child.material.envMap = texture))

scene.add(model)

transformControls.attach(model)

})

animate()

function animate() {

requestAnimationFrame(animate)

controls.update()

renderer.render(scene, camera)

}

完整源码:GitHub

小结

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

相关文章:

  • 基于Agentic AI的降维算法自动化调优与可视化评估实践
  • TELAPA框架:基于策略档案与共享潜空间的持续强化学习实践
  • 8位MCU安全连接云端:PIC18F2620与A5000加密芯片实践
  • Anthropic Claude‘归零层’技术解析:语义校验环的架构级移除
  • GPT-4的‘2%激活‘真相:MoE稀疏推理原理与工程实践
  • 期权量化交易系列教程(四):经典方向性策略——备兑、保护性看跌与价差组合
  • Angular端到端测试实战:用TestCafe替代Protractor
  • Ubuntu 14.04下MongoDB备份恢复与迁移实战指南
  • Flask生产部署:Gunicorn+Nginx在Ubuntu 20.04上的完整实践
  • 告别手动抢购烦恼:Campus-iMaoTai智能茅台预约系统完全指南
  • 语义一致性仲裁系统:ADK契约引擎+Agent SDK协同验证
  • Debian 8 上安全部署 Django 1.11 的完整实践指南
  • PCF8591与PIC18LF25J11的硬件协同设计与信号处理优化
  • 从简历到offer:Java面试的全流程攻略
  • Mythos动态闸门:Claude 3.5的语义栅栏与可信推理机制
  • Gemini 3.0全家桶如何重塑前端开发工作流
  • MuleSoft如何实现企业级AI编排:LLM与业务系统的语义融合
  • 医院智慧后勤数字化建设技术方案
  • Claude语义保真度校验环归零:确定性推理架构解析
  • 2026必看:两款主流AI编程工具深度实测对比
  • Transformer词嵌入层深度解剖:语义校准、位置耦合与梯度调控
  • Mac发烫如何解决?智能温控系统实现设备性能优化与硬件保护
  • Java核心考点:final/finally/finalize与对象4种引用全解析
  • Anthropic新架构:认知链路压缩为原子操作
  • 终极Windows风扇控制指南:如何用FanControl实现智能散热与静音平衡
  • AI数学家:数学实践范式的迁移与可验证工作流
  • 【CSDN首发】PTC加热器医疗应用技术指南:原理、选型与工程实践
  • Semantic Kernel+Neo4j轻量级知识问答系统实战
  • VS Code通过SSH远程开发Ubuntu虚拟机实战指南
  • Anthropic Claude‘归零层’解析:语义保真度校验环的工程消除