news 2026/7/2 19:48:38

Three.js 变换 Box3教程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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 开源仓库
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/2 19:46:24

基于Agentic AI的降维算法自动化调优与可视化评估实践

1. 项目概述:当降维算法遇上“智能体”在数据科学和机器学习的日常工作中,降维算法是我们处理高维数据、进行特征工程和可视化探索的“瑞士军刀”。无论是经典的PCA(主成分分析)、t-SNE,还是UMAP,我们都曾花…

作者头像 李华
网站建设 2026/7/2 19:42:54

TELAPA框架:基于策略档案与共享潜空间的持续强化学习实践

1. 从“灾难性遗忘”到“终身学习”:为什么我们需要TELAPA?如果你在强化学习领域摸爬滚打过一段时间,尤其是尝试过让一个智能体去学习一系列连续但不同的任务,那你大概率遇到过这个令人头疼的问题:智能体学会了新任务&…

作者头像 李华
网站建设 2026/7/2 19:39:33

8位MCU安全连接云端:PIC18F2620与A5000加密芯片实践

1. 项目背景与核心挑战在工业物联网和嵌入式设备领域,安全连接云端服务一直是个棘手问题。我最近用Microchip的PIC18F2620微控制器和A5000加密芯片做了个有意思的项目——让这个8位MCU也能安全地连接公共/私有云。这听起来可能有些反直觉,毕竟PIC18F2620…

作者头像 李华
网站建设 2026/7/2 19:36:38

Anthropic Claude‘归零层’技术解析:语义校验环的架构级移除

1. 项目概述:这不是一次普通更新,而是模型能力边界的悄然坍缩 “Anthropic Just Shipped the Layer That’s Already Going to Zero”——这个标题乍看像一句技术圈的黑色幽默,甚至带点玄学意味。但作为连续跟踪Claude系列模型迭代三年、亲手…

作者头像 李华
网站建设 2026/7/2 19:34:19

GPT-4的‘2%激活‘真相:MoE稀疏推理原理与工程实践

1. 这不是“参数爆炸”,而是“智能精算”:GPT-4参数规模与激活机制的真实逻辑 你肯定在各种技术快讯里见过这句话:“GPT-4有1.8万亿参数,但每次只用2%”。它像一句科技圈的都市传说——足够震撼,却没人告诉你它到底怎么…

作者头像 李华