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

Three.js 生成模型底座教程

生成模型底座 ·Model Base· ▶ 在线运行案例

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

你将学到什么

  • OrbitControls 相机轨道交互
  • glTF/Draco 模型加载与优化
  • 监听窗口resize同步更新 camera 与 renderer

效果说明

本案例演示生成模型底座效果:基于 WebGL 实现「生成模型底座」可视化效果,附完整可运行源码;核心用到 OrbitControls、glTF/Draco。建议先打开文首在线案例查看动态画面,再对照下方源码逐步理解。

核心概念

  • Loader异步加载模型;glTF 返回gltf.scene,加载后注意scale与坐标系。Draco 需配置DRACOLoader
  • OrbitControls轨道旋转缩放;开enableDamping时每帧需controls.update()
  • CubeTexture六面贴图作scene.backgroundscene.environment供 PBR 材质反射。

实现步骤

  • 搭建 Scene / Camera / Renderer 与 OrbitControls
  • Loader 异步加载模型/纹理资源
  • rAF 循环中 update 并 render
  • 代码要点

    import * as THREE from 'three';

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

    var scene = new THREE.Scene(); scene.background = new THREE.Color('gainsboro');

    var camera = new THREE.PerspectiveCamera(30, innerWidth / innerHeight); camera.position.set(0, 4, 4); 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.enableDamping = true; controls.autoRotate = true;

    var light = new THREE.DirectionalLight('white', 3); light.position.set(1, 1, 1); scene.add(light);

    let group

    const loader = new GLTFLoader()

    loader.setDRACOLoader(new DRACOLoader().setDecoderPath(FILE_HOST + 'js/three/draco/'))

    loader.load(

    HOST + '/files/model/car.glb',

    function (gltf) {

    group = gltf.scene

    scene.add(group) add_model_base() }

    )

    // 模型底座 function add_model_base(){ const box = new THREE.Box3() box.setFromObject(group) // const helper = new THREE.Box3Helper(box) // scene.add(helper) const center = box.getCenter(new THREE.Vector3()) const size = box.getSize(new THREE.Vector3()) const shape = new THREE.Shape() shape.moveTo(center.x,center.z) // 底座大小在这控制 这里取半径的根号2倍 let radius = Math.max(size.x,size.z) / 2 * Math.sqrt(2) shape.arc(0,0,radius,0,Math.PI * 2) let m = new THREE.MeshBasicMaterial({color:'red',side:2}) const geo = new THREE.ShapeGeometry(shape,32) const mesh = new THREE.Mesh(geo,m) geo.center() mesh.rotateX(-Math.PI / 2) scene.add(mesh) }

    完整源码:GitHub

    小结

    • 本文提供生成模型底座完整 Three.js 源码与在线 Demo,建议先运行案例再改 uniform/参数做二次实验
    • 更多 Three.js 实战案例见 three-cesium-examples 合集 与 GitHub 开源仓库
http://www.jsqmd.com/news/1085807/

相关文章:

  • 告别macOS滚动混乱:Scroll Reverser终极设备控制方案
  • 如何高效使用PowerToys中文版:提升Windows效率的完整指南
  • 从递归到深搜:拆解分解因数问题的双重视角 | 信息学奥赛解题精讲
  • 瑞萨RA2L2开发板FSP示例项目实战:从环境搭建到外设开发
  • Playwright实战:告别繁琐句柄,三步搞定浏览器多标签页精准操控
  • 百度网盘秒传链接工具终极指南:三步掌握文件闪电转存
  • 联想拯救者工具箱:三步掌握笔记本性能优化的终极免费方案
  • RH850/U2C开发板外围电路与接口配置实战指南
  • CST实战指南:从零构建空心电感模型与RLC求解器深度解析
  • 5分钟掌握猫抓:如何高效捕获网页音视频资源?
  • Box86终极指南:如何在ARM设备上轻松运行x86游戏和应用
  • 从RGB数值到视觉呈现:一份给开发者的实用色彩指南
  • ADB Explorer:如何用Windows应用轻松管理Android设备的终极指南
  • 3步快速上手uesave:Unreal引擎存档编辑终极指南
  • RK3568 网络远程唤醒(WOL)实战:从硬件配置到跨网段唤醒
  • AI已超越人类,但文明还在17世纪——贾子理论大厦白皮书
  • 从OSM路网到坐标点:一条数据提取与坐标转换的实践路径
  • AMD内存性能终极优化指南:3步掌握ZenTimings完整监控教程
  • [智能体-575]:数字人的全量分类、对应的产品以及未来发展路径
  • 某茄小说 a_bogus 逆向之JSVMP核心逻辑提取与本地化
  • 终极指南:如何构建跨平台NES模拟器Mesen的完整技术解析
  • 如何用视觉AI实现跨平台UI自动化测试:Midscene.js完整指南
  • Unity Toggle组件:从基础配置到高级交互状态管理
  • 从零构建HMM中文分词器:训练、预测与实战解析
  • 基于SpringBoot与Netty构建高可靠MQTT客户端:从连接管理到消息重发
  • 实战指南:Python 爬虫高效下载并解密 AES 加密的 m3u8 视频流
  • WPR系列机器人仿真平台:从SLAM建图到多模态操作的全栈解决方案
  • 岳阳高口碑黄金铂金回收白银回收实体老店排行 5 家靠谱门店电话地址全收录
  • 网盘直链下载助手:高效获取真实下载地址的专业指南
  • 从RTL到流片:深入解析数字后端物理设计全流程与关键检查点