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

news2024/11/19 4:38:10

系列文章目录

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显示功能,后续文章,我将带大家慢慢深入了解。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/159777.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ES6 课程概述⑤

文章目录9-1. Fetch Api 概述9-2. 基本使用参数返回值9-3 **Response 对象**9-4 Request 对象9-5 Headers 对象9-6 文件上传10-1 迭代器背景知识JS 中的迭代器可迭代协议 与 for-of 循环可迭代协议for-of 循环展开运算符与可迭代对象生成器 (Generator)set 集合9-1. Fetch Api …

Unity 之 Addressable可寻址系统 -- 代码加载介绍

Unity 之 可寻址系统 -- 代码加载介绍 -- 进阶&#xff08;一&#xff09;一&#xff0c;可寻址系统代码加载1.1 回调形式1.2 异步等待1.3 面板赋值1.4 同步加载二&#xff0c;可寻址系统分标签加载2.1 场景搭建2.2 代码示例2.3 效果展示三&#xff0c;代码加载可寻址的解释概述…

算法第九期——DFS(深度优先搜索)的树上应用

树 树是一种特殊的图 。 特点&#xff1a; 若树有n个点,则有n-1条边。树有连通性但没有回路。从一个点出发可以到达任意一个&#xff0c;而且路径是唯一的。树的重心u&#xff08;最平衡的点&#xff09;: 以树上任意一个结点为根计算它的子树的结点数&#xff0c;如果结点…

二部图和匈牙利算法

1.二分图最大匹配 设G为二分图,若在G的子图M中,任意两条边都没有公共节点,那么称M为二分图G的一组匹配。在二分图中,包含边数最多的一组匹配称为二分图的最大匹配。 交替路:从一个未匹配点出发,依次经过非匹配边、匹配边、非匹配边…形成的路径叫交替路。 …

【算法】深度优先搜索 (DFS)

目录1.概述2.代码实现3.应用1.概述 &#xff08;1&#xff09;深度优先遍历 (Depth First Search, DFS)&#xff0c;是图的搜索算法之一&#xff0c;本质其实就是一个递归的过程&#xff0c;它就像是一棵树的前序遍历。 &#xff08;2&#xff09;DFS 从图中某个顶点 start 出…

游戏如何解决注入挂难题

游戏黑灰产的攻击角度除了常见的内存修改、模拟点击、破解等作弊手段&#xff0c;还有门槛相对较高的「专用插件类」。 专用插件类外挂是指针对特定游戏定制的外挂&#xff0c;其在实现方式上&#xff0c;类似插件&#xff0c;也称“定制挂”、“注入挂”。 游戏面临多样化的安…

招聘老师的最佳实践及工作交流坊

香港 — 如果你在招聘外籍老师途中遇到极大的挑战&#xff0c;你并不是孤独的。由于新冠肺炎的限制及对于外籍老师的需求增加&#xff0c;招聘及留住高质量的外籍老师对于学校来说已经越来越困难。在疫情之下&#xff0c; 许多学校展现了非凡的韧性来确保他们的教学质量及学习供…

【HCIA-openEuler】实验手册—04【openEuler用户及权限管理】

文章目录一、实验介绍1、关于本实验2、实验目的二、实验任务配置1、配置步骤&#xff08;1&#xff09;用户和用户组的管理步骤1&#xff1a;who命令是显示目前登录系统的用户信息步骤2&#xff1a;id命令用于显示用户的ID&#xff0c;以及所属群组的ID步骤3&#xff1a;以root…

Vivado 错误代码 [Place 30-574]解决思路

问题描述 最近利用手头的开发板作UDP通信的设计。准备生成比特流时&#xff0c;出现这个错误&#xff1a; 具体信息&#xff1a; [Place 30-574] Poor placement for routing between an IO pin and BUFG. If this sub optimal condition is acceptable for this design, you …

Java(105):Java通过键盘(Scanner)输入数据

Java通过键盘(Scanner)输入数据 在Java中&#xff0c;我们可以使用Scanner 类来获取用户的输入。 Java 中添加了java.util.Scanner类&#xff0c;这是一个用于扫描输入文本的新的实用程序。相比于其他获取用户输入的方式&#xff0c;Scanner是非常方便的。 如果使用Scanner&…

如何理解鲁棒性?为什么robustness会翻译为鲁棒性?

鲁棒性&#xff0c;英文为Robustness&#xff08;承受故障和干扰的能力&#xff09;&#xff0c;是许多复杂系统&#xff08;包括复杂网络&#xff09;的关键属性。复杂网络的鲁棒性研究对许多领域都非常重要。本文着重介绍了鲁棒性的基本定义、命名起源、分类区别、提升方法和…

一图读懂mybatis插件plugin原理

插件是用来改变或者扩展mybatis的原有的功能&#xff0c;mybaits的插件就是通过继承Interceptor拦截器实现的;mybatis中能使用插件进行拦截的 可以进行拦截的 接口和方法如下: Executor (update、query 、 flushStatment 、 commit 、 rollback 、 getTransaction 、 close 、…

机试_1_暴力求解_习题

暴力求解——习题 学习完第一章–暴力求解之后&#xff0c;当然要做相应地练习啦~ https://blog.csdn.net/Window_mouse/article/details/128632426 注&#xff1a;上述习题都可以在牛客进行测试。 例如&#xff0c;第9题链接&#xff1a;xxx定律_牛客题霸_牛客网 (nowcode…

近几年美赛B题分析

美赛B题概述&#xff1a; 美赛赛题类型美国大学生数学建模竞赛目前分为两种类型&#xff0c;MCM&#xff08;Mathematical Contest In Modeling&#xff09;和 ICM&#xff08;Interdisciplinary Contest In Modeling)&#xff0c;两种类型竞赛采用统一标准进行&#xff0c;竞…

金融风控04

特征工程 Filter 1&#xff09;移除低方差特征 假设某特征的特征值只有0和1&#xff0c;并且在所有输入样本中&#xff0c;95%的实例的该特征取值都是1&#xff0c;那就可以认为这个特征作用不大。如果100%都是1&#xff0c;那这个特征就没意义了。当特征值都是离散型变量的…

攻克强化学习技术难题记录

一共经过了5次迭代。 第1次迭代的设计思路&#xff1a; 强化学习demo游戏“cartpole”重述 游戏目标&#xff1a;向左/右移动小车cart&#xff0c;保证杆pole始终在小车上方&#xff0c;是大多数强化学习入门教材都会介绍的一个经典案例。 强化学习要素分析&#xff1a; 智…

【项目实战】Nacos下发路由配置实现Spring Cloud Gateway的动态路由

Spring Cloud Gateway网关的使用和Nacos下发路由配置实现Spring Cloud Gateway的动态路由 一、微服务网关概述 1.1 微服务网关诞生背景 不同的微服务一般会有不同的网络地址&#xff0c;而外部客户端可能需要调用多个服务的接口才能完成一个业务需求&#xff0c;如果让客户端…

泰凌微被暂缓审议:利润下滑遭关注,实控人王维航存在大额负债

1月12日&#xff0c;上海证券交易所披露的信息显示&#xff0c;泰凌微电子&#xff08;上海&#xff09;股份有限公司&#xff08;下称“泰凌微”&#xff09;的首发申请被科创板上市委暂缓审议。据贝多财经了解&#xff0c;上市委现场问题对该公司提出多个问题。 根据申请文件…

用详细实例说明和典型案例实现对分治法进行全面分析 | C++

第一篇 分治法 目录 第一篇 分治法 ●前言 ●一、分治法是什么&#xff1f; 1.简要介绍 2.生活实例 ●二、分治法的典型案例——硬币问题 1.具体问题 2.代码展示&#xff08;C&#xff09; 3.程序代码结果展示 ●总结 前言 简单的来说&#xff0c;算法就是用计算机程序代…

菲中工商贸投资合作签约活动在京举办

2023年1月3日至5日&#xff0c;中菲两国元首亲切会谈后&#xff0c;共同发布了成果丰硕的二十八条内容的联合声明。1月3日至9日&#xff0c;由菲律宾菲中人民友好促进会与中国联合国采购促进会在京联合举办了“菲中工商贸投资合作签约仪式”及“中菲合作项目对接洽谈周”活动。…