当前位置: 首页 > 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.jsqmd.com/news/1110903/

相关文章:

  • Agent Runtime:AI 应用的“操作系统时刻”已到来
  • 扎根向下、向阳而上:植物感知重力的分子密码
  • 这是关于选择器
  • 经济模型预测控制在周期性最优运行中的稳定性与性能分析
  • 计算机Java毕设实战-基于 SpringBoot 的瑜伽普拉提综合会馆运营管理系统 基于 SpringBoot 的健身会所课程预约管理系统【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • 良率工程实战:从72%到89%的完整爬坡路径
  • AI增强型SOC工作流:三层架构实现人机协同实战
  • 山西干冰医用冷藏
  • 【Java从入门到精通】第11篇:内部类的四种形态——成员内部类、静态内部类、局部内部类与匿名内部类
  • 基于边缘计算与多模态AI的认知症护理机器人系统设计与实践
  • PyCaret 低代码机器学习库简介
  • 前端响应式原理与DOM优化实战:从defineProperty到虚拟DOM
  • 从Samba漏洞到Jenkins沦陷:CVE-2017-7494攻击链深度剖析与防御实践
  • 2026毕业季救星!6款AI论文工具实测,从框架到初稿一路畅写
  • 微信小程序抓包实战:从原理到工具配置与安全分析
  • 深度兴趣网络与时间感知在实时推荐系统中的工程实践
  • 企业AI提效五大实操场景:本地化、零API、合规落地
  • 换新手机怕私密笔记、证件照全丢失?这款不上云保险箱一键导出加密备份
  • 3步掌握安卓应用管理神器:APKMirror安卓客户端终极指南
  • Java 微服务向 AI 原生演进:从 Spring Cloud 到 Agentic Platform 的技术路线
  • EmbodiedClaw:对话式工作流如何革新具身智能开发范式
  • 大语言模型如何理解表格数据:表示学习与检索增强生成实践
  • 2026 年求职招聘新变量:AI 重塑行业逻辑,个人开发者机会几何?
  • 112、hypothesis 属性测试:让机器自动生成测试用例,发现你从未想过的边界
  • AI武器化风险与硬件出口控制的动态评估框架
  • BiliDownloader终极指南:简单快速免费下载B站视频的完整教程
  • 暑期旅游邮件营销深度拆解:你的促销邮件为什么没人看?
  • SpringBoot 整合 WebSocket 实现校园二手平台私信聊天,环境配置 + 踩坑记录
  • 帐号注册与帐号登陆互联
  • 毕设查重率高的 8 个高危写法(附降重改写示例)