news 2026/7/2 20:15:02

Three.js 模型视图教程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Three.js 模型视图教程

模型视图 ·Model Views· ▶ 在线运行案例

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

你将学到什么

  • Box3 + FOV反算「刚好框住模型」的相机距离
  • 绕 Y/X 轴旋转观察方向得到六视图位置
  • gsap 切换camera.positioncontrols.target

效果说明

加载电脑模型,GUI 按钮前视图 / 右视图 / 上视图,相机平滑飞到对应标准视角,target 始终为模型中心。

核心概念

const box = new THREE.Box3().setFromObject(object);

const center = box.getCenter(new THREE.Vector3()); const radius = box.max.clone().sub(box.min).length() / 2;

// 距离 = 半径 / tan(fov/2) const distance = radius / Math.tan(Math.PI * fov / 360); const dir = object.getWorldDirection(new THREE.Vector3()); const frontView = dir.clone().multiplyScalar(distance).add(center);

// 右视图:方向绕 Y 转 90° const rightView = dir.clone() .applyAxisAngle(new THREE.Vector3(0, 1, 0), Math.PI / 2) .add(center);

这是 CAD/编辑器「正视图」「俯视图」按钮的常用算法。

代码要点

import * as THREE from 'three'

import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls.js' import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js' import { GUI } from 'dat.gui' import gsap from 'gsap'

const box = document.getElementById('box')

const scene = new THREE.Scene()

const camera = new THREE.PerspectiveCamera(75, box.clientWidth / box.clientHeight, 0.1, 100000)

camera.position.set(5, 5, 5)

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

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

box.appendChild(renderer.domElement)

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

controls.enableDamping = true

window.onresize = () => {

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

camera.aspect = box.clientWidth / box.clientHeight

camera.updateProjectionMatrix()

}

let model

const gui = new GUI()

new GLTFLoader().load(

FILE_HOST + 'models/glb/computer.glb',

gltf => {

model = scene.add(gltf.scene)

const { frontView, target, rightView, topView, bottomView, backView, maxView } = getObjectViews(model)

const setView = view => {

createGsapAnimation(controls.object.position, view)

createGsapAnimation(controls.target, target)

}

gui.add({ '前视图': () => setView(frontView) }, '前视图')

gui.add({ '右视图': () => setView(rightView) }, '右视图')

gui.add({ '上视图': () => setView(topView) }, '上视图')

}

)

animate()

function animate() {

requestAnimationFrame(animate)

controls.update()

renderer.render(scene, camera)

}

function getObjectViews(object, fov = 50) {

const box = new THREE.Box3().setFromObject(object)

const { max, min } = box

const center = new THREE.Vector3()

box.getCenter(center)

const radius = new THREE.Vector3().subVectors(max, min).length() / 2

const dir = object.getWorldDirection(new THREE.Vector3()) // 物体方向

const distance = radius / Math.tan(Math.PI * fov / 360) // 根据半径和相机视角 计算出距离

const vector = dir.multiplyScalar(distance) // 方向距离向量

const frontView = vector.clone().add(center)

const leftView = vector.clone().applyAxisAngle(new THREE.Vector3(0, 1, 0), -Math.PI / 2).add(center)

const rightView = vector.clone().applyAxisAngle(new THREE.Vector3(0, 1, 0), Math.PI / 2).add(center)

const topView = vector.clone().applyAxisAngle(new THREE.Vector3(1, 0, 0), -Math.PI / 2).add(center)

const bottomView = vector.clone().applyAxisAngle(new THREE.Vector3(1, 0, 0), Math.PI / 2).add(center)

const backView = vector.clone().applyAxisAngle(new THREE.Vector3(0, 1, 0), Math.PI).add(center)

return { frontView, leftView, rightView, topView, bottomView, backView, target: center }

}

function createGsapAnimation(position, position_) {

return gsap.to(

position,

{

...position_,

duration: 1,

ease: 'none',

repeat: 0,

yoyo: false,

yoyoEase: true,

}

)

}

完整源码:GitHub

小结

  • 本文提供模型视图完整 Three.js 源码与在线 Demo,建议先运行案例再改 uniform/参数做二次实验
  • 更多 Three.js 实战案例见 three-cesium-examples 合集 与 GitHub 开源仓库
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/2 20:14:07

生成式引擎优化GEO哪个解决方案好

随着人工智能技术的快速发展,生成式引擎优化(GEO, Generative Engine Optimization)已成为许多企业和开发者关注的焦点。GEO可以帮助企业在内容创作、客户服务、产品设计等多个领域实现自动化和智能化,从而提高效率和降低成本。本…

作者头像 李华
网站建设 2026/7/2 20:08:56

PEO113-PVP44-PS45三嵌段共聚物PS45-PVP44-PEO113

一、基本参数: 1. 结构全称 Polystyrene-block-poly(4-vinylpyridine)-block-poly(ethylene oxide) 聚苯乙烯 - b - 聚 4 - 乙烯基吡啶 - b - 聚环氧乙烷(行业简写 PS-P4VP-PEO,常简称 PS-PVP-PEO) 下标数字 各嵌段重复单元数&…

作者头像 李华
网站建设 2026/7/2 20:07:18

数字控制振荡器(DCO)原理与LTC6903应用设计

1. 数字控制振荡器的基础概念与选型考量数字控制振荡器(DCO)是现代电子系统中实现精确频率合成的核心模块,相比传统压控振荡器(VCO),它通过数字接口直接编程控制输出频率,具有更高的灵活性和可重…

作者头像 李华
网站建设 2026/7/2 20:07:10

CodeAgent 技术架构简易介绍

一、不同Code Agent架构及商业设计 不同 Code Agent 有不同的设计架构,不都强依赖云端服务。商业化产品(如 Claude Code、Cursor)通常依赖云端服务提供完整能力,而开源方案(如 OpenCode)则被设计为可在本地…

作者头像 李华
网站建设 2026/7/2 20:03:28

工作中用AI省时又省力?小心“影子AI”导致数据泄露!

“影子AI”:职场棘手的AI问题你是否有过让ChatGPT润色工作邮件或总结会议记录的经历?乍一看似乎没危害,但用错工具或提供错误信息,可能引发大问题。“影子AI”指员工在未获公司批准、监督或安全审查的情况下,在工作中使…

作者头像 李华