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

Three.js一学就会系列:05 加载3D模型

系列文章目录

Three.js一学就会系列:01 第一个3D网站
Three.js一学就会系列:02 画线
Three.js一学就会系列:03 炫酷3D划线
Three.js一学就会系列:04 炫酷3D文字


文章目录

  • 系列文章目录
  • 前言
  • 一、核心代码讲解
    • 引入插件
    • 轨道控制器
    • 加载3D文件
  • 完整代码
  • 效果
  • 二、3D模型资源
  • 总结


前言

最近开始入坑前端3D建站,跟大家一起慢慢深入three.js做网站3D

这篇文章给大家讲下 如何加载一个3D模型


一、核心代码讲解

引入插件

  import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader'
  import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls'
  import { DRACOLoader } from 'three/examples/jsm/loaders/DRACOLoader'

GLTFLoader :
加载GLTF加载器,glTF(gl传输格式)是一种开放格式的规范 (open format specification), 用于更高效地传输、加载3D内容。该类文件以JSON(.gltf)格式或二进制(.glb)格式提供, 外部文件存储贴图(.jpg、.png)和额外的二进制数据(.bin)
OrbitControls :
轨道控制器(OrbitControls)Orbit controls(轨道控制器)可以使得相机围绕目标进行轨道运动。
DRACOLoader :
一个加载器的几何压缩与Draco库。Draco是一个开源库,用于压缩和解压缩3D网格和点云。压缩后的几何图形可以显著变小,代价是在客户端设备上花费额外的解码时间。

轨道控制器

this.controls = new OrbitControls(camera, renderer.domElement)
this.controls.target = new THREE.Vector3(0, 0, 0)

controls.target:设置控制器的焦点,.object的轨道围绕它运行

加载3D文件

const loader = new GLTFLoader()
const dracoLoader = new DRACOLoader()
dracoLoader.setDecoderPath('https://threejs.org/examples/jsm/libs/draco/')
dracoLoader.preload()
loader.setDRACOLoader(dracoLoader)

loader.load('https://threejs.org/examples/models/gltf/LittlestTokyo.glb', (gltf) => {
  scene.add(gltf.scene)
  renderer.render(scene, camera)
}, (xhr) => {
  console.log((xhr.loaded / xhr.total) * 100 + '% loaded')
}, (error) => {
  console.error(error)
})

setDecoderPath:设置draco文件地址
loader.load(‘https://threejs.org/examples/models/gltf/LittlestTokyo.glb’) 加载3D模型

完整代码

<template>
  <section>
    <section id="container"></section>
  </section>
</template>

<script>
  import * as THREE from 'three'
  import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader'
  import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls'
  import { DRACOLoader } from 'three/examples/jsm/loaders/DRACOLoader'
  let camera, scene, renderer
  export default {
    data() {
      return {
      }
    },
    mounted() {
      this.init()
      this.animate()
    },
    methods: {
      init() {
        const container = document.getElementById('container')
        camera = new THREE.PerspectiveCamera(90, container.clientWidth / container.clientHeight, 0.1, 10000)
        renderer = new THREE.WebGLRenderer({ antialias: true })

        camera.position.set(50, 200, 500)

        scene = new THREE.Scene()

        renderer.setClearColor(new THREE.Color(0xF7F2F1))
        renderer.setSize(container.clientWidth, container.clientHeight)
        renderer.shadowMap.enabled = true

        container.appendChild(renderer.domElement)

        this.controls = new OrbitControls(camera, renderer.domElement)
        this.controls.target = new THREE.Vector3(0, 0, 0)

        this.loadLight()
        this.load3D()
      },
      load3D() {
        const loader = new GLTFLoader()
        const dracoLoader = new DRACOLoader()
        dracoLoader.setDecoderPath('https://threejs.org/examples/jsm/libs/draco/')
        dracoLoader.preload()
        loader.setDRACOLoader(dracoLoader)

        loader.load('https://threejs.org/examples/models/gltf/LittlestTokyo.glb', (gltf) => {
          scene.add(gltf.scene)
          renderer.render(scene, camera)
        }, (xhr) => {
          console.log((xhr.loaded / xhr.total) * 100 + '% loaded')
        }, (error) => {
          console.error(error)
        })
      },
      loadLight() {
        // 环境光
        const ambient = new THREE.AmbientLight(0xFFFFFF)
        scene.add(ambient)
        const pointLight = new THREE.PointLight( 0xffffff, 0.5 );
        pointLight.position.set( 100, 200, 500 );
        pointLight.color.setHSL( 255, 255, 255 );
        scene.add( pointLight );
      },
      animate() {
        requestAnimationFrame(this.animate)
        renderer.render(scene, camera)
      }
    }
  }
</script>

<style>
body,html {
  padding: 0;
  margin: 0;
}
</style>

<style scoped>
  #container {
    width: 100%;
    height: calc(100vh);
  }
</style>

效果

在这里插入图片描述

二、3D模型资源

公共领域的glTF文件可以在网上找到,例如 Sketchfab,或者很多工具包含了glTF的导出功能:
Blender by the Blender Foundation
Substance Painter by Allegorithmic
Modo by Foundry
Toolbag by Marmoset
Houdini by SideFX
Cinema 4D by MAXON
COLLADA2GLTF by the Khronos Group
FBX2GLTF by Facebook
OBJ2GLTF by Analytical Graphics Inc

更多请参考:https://threejs.org/docs/index.html#manual/zh/introduction/Loading-3D-models

总结

以上就是今天要讲的内容,本文仅仅简单介绍了three.js的加载3D模型,而three.js提供了非常多的3D显示功能,后续文章,我将带大家慢慢深入了解。

如果觉得有用欢迎点赞关注
有问题私信我!!~~

相关文章:

  • Python2.x和3.x主要差异总结
  • Vue中引入react组件
  • python的8大核心语句,你确定不来看看嘛,那格局就小啦
  • windows排查问题常用命令
  • 2023年网络安全比赛--跨站脚本攻击中职组(超详细)
  • SkyEye:针对飞行模拟器的仿真解决方案
  • 基于Python + Django 的密码自助平台项目(完整代码)
  • 写作的“收益”超乎想象
  • 前端号外—2022年明星项目居然是它,Node.js危已?
  • 六道算法基础题详解
  • 【Linux】在Linux上写一个进度条小程序
  • C生万物 | 函数的讲解与剖析【内附众多案例详解】
  • Spring为什么这么火 之 Spring蕴含的设计思想
  • 来自一位双非本科大二学生的?自我救赎:堕落——蜕变
  • 看完RabbitMQ了的几种消息模型,我对RabbitMQ有了新的认识
  • 《网管员必读——网络组建》(第2版)电子课件下载
  • 【Under-the-hood-ReactJS-Part0】React源码解读
  • C++11: atomic 头文件
  • CSS选择器——伪元素选择器之处理父元素高度及外边距溢出
  • iOS高仿微信项目、阴影圆角渐变色效果、卡片动画、波浪动画、路由框架等源码...
  • JS基础之数据类型、对象、原型、原型链、继承
  • js数组之filter
  • LeetCode算法系列_0891_子序列宽度之和
  • Material Design
  • QQ浏览器x5内核的兼容性问题
  • Rancher-k8s加速安装文档
  • Twitter赢在开放,三年创造奇迹
  • 彻底搞懂浏览器Event-loop
  • 从@property说起(二)当我们写下@property (nonatomic, weak) id obj时,我们究竟写了什么...
  • 树莓派 - 使用须知
  • 数据科学 第 3 章 11 字符串处理
  • 正则与JS中的正则
  • 你对linux中grep命令知道多少?
  • FaaS 的简单实践
  • 好程序员web前端教程分享CSS不同元素margin的计算 ...
  • %3cli%3e连接html页面,html+canvas实现屏幕截取
  • (1)bark-ml
  • (分布式缓存)Redis分片集群
  • (附源码)springboot工单管理系统 毕业设计 964158
  • (附源码)SSM环卫人员管理平台 计算机毕设36412
  • (六)激光线扫描-三维重建
  • (十五)devops持续集成开发——jenkins流水线构建策略配置及触发器的使用
  • .equal()和==的区别 怎样判断字符串为空问题: Illegal invoke-super to void nio.file.AccessDeniedException
  • .NET CF命令行调试器MDbg入门(二) 设备模拟器
  • .NET Core SkiaSharp 替代 System.Drawing.Common 的一些用法
  • .Net Framework 4.x 程序到底运行在哪个 CLR 版本之上
  • .NET gRPC 和RESTful简单对比
  • .net wcf memory gates checking failed
  • .net 验证控件和javaScript的冲突问题
  • [ MSF使用实例 ] 利用永恒之蓝(MS17-010)漏洞导致windows靶机蓝屏并获取靶机权限
  • [ 常用工具篇 ] AntSword 蚁剑安装及使用详解
  • [.NET]桃源网络硬盘 v7.4
  • [Android Studio 权威教程]断点调试和高级调试
  • [BZOJ1010] [HNOI2008] 玩具装箱toy (斜率优化)
  • [C#]无法获取源 https://api.nuge t.org/v3-index存储签名信息解决方法