【Three.js基础学习】17.imported-models

news2024/11/28 1:38:43

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

课程回顾:

    如何在three.js 中引入不同的模型?

    1. 格式  (不同的格式)

    https://en.wikipedia.org/wiki/List_of_file_formats#3D_graphics // 请用外网打开

    如果想要加载一个模型,必须根据不同的标准选择格式

    OBJ FBX STL PLY 3DS GLTF

    COLLADA

    1.GLTF (使用这个) 会得到PBR材料 ,是基于物理的渲染材料,转化成网格标准材质

    https://github.com/KhronosGroup/glTF-Sample-Models

    // 将所需要的模型放到静态文件中,这取决与你要用什么

    例如:static/models/Duck

    这里有四个文件 对应格式 gltf ,gltf-binary(二进制),gltf-draco和gltf-embedded(嵌入式)

    我们要知道怎么用,这些格式各有特点,取决于我们的需求,可以利用对方的特点和优势

    2.如何在3D使用?

    使用加载器 ,实时上我们之前使用了加载器,如:纹理加载器,字体加载器等

    import {GLTFLoader} from 'three/examples/jsm/loaders/GLTFLoader.js

    gltfLoader.load()

    将模型添加到场景中

    scene.add(gltf.scene)

    3.Draco压缩

    Draco 比默认版本更加轻

    压缩应用于缓冲数据,通常是几何体

    Website: https://google.github.io/draco/

    Git repository: https://github.com/google/draco

    必须在GLTF之前实例化它

    为什么更快?

    draco压缩会将一部分js代码放到CPU上执行 使用WebAssembly和工人。

    相当于两个线程一起工作

    setDecoderPath

    4.将DracoLoader实例给予glTFLoader加载器

    setDRACOLoader

    5. 什么时候使用draco版本

    首先要DRACOLoader.js这个类,其次 在静态中把draco文件copy上去(解码器)

    文件更大时候,更适合使用,这样压缩版本使用 文件更小,节约

    6.冻结

    若是一个巨大的几何体,使用WebAssembly和工人时候,会加载好几秒,也就是冻结

    7.animations

    如何处理动画

    要播放动画需要 动画混合器

    new THREE.AnimationMixer()

    8.three.js3D编辑器

    搜索three.js.edito,点击第一个 或者

    https://threejs.org/editor/

    在这个微型在线模型编辑器中,可以将模型文件拖到这里 快速查看模板是否符合自己需要

    Duck.glb


一、代码

import * as THREE from 'three'
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls.js'
import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js'
import { DRACOLoader } from 'three/examples/jsm/loaders/DRACOLoader.js'
import * as dat from 'lil-gui'


/**
 * Base
 */
// Debug
const gui = new dat.GUI()

// Canvas
const canvas = document.querySelector('canvas.webgl')

// Scene
const scene = new THREE.Scene()

/* 
    Models
*/
const dracoLoader = new DRACOLoader()
dracoLoader.setDecoderPath('/draco/')  // 要将models中的文件放到静态文件中 (注意要将数据放到models下)

const gltfLoader = new GLTFLoader()
gltfLoader.setDRACOLoader(dracoLoader)

let mixer = null

gltfLoader.load(
    // '/models/Duck/glTF/Duck.gltf', // 2.
    // '/models/FlightHelmet/glTF/FlightHelmet.gltf', // 会遇到将模型放到场景中,显示不全 1. 2.
    // '/models/Duck/glTF-Draco/Duck.gltf',  // draco 压缩 版本 2.
    '/models/Fox/glTF/Fox.gltf',  // 实现动画 会动的狐狸
    (gltf)=>{
        console.log(gltf)
        // 这里注意若使用 for of 会造成循环混乱
        // 1.初级使用, 让我们知道gltf 加载了什么,怎么加载
        // 所以可以使用white 或者拓展运算符
        // const children = [...gltf.scene.children]
        // for(const child of children){
        //     scene.add(child)
        // }

        // 2.当然上面是为了理解,也可以一行代码搞定
        // scene.add(gltf.scene)

        // 3.实现狐狸动画
        mixer = new THREE.AnimationMixer(gltf.scene) // 动画混合器
        const action = mixer.clipAction(gltf.animations[2]) // 动画剪辑器 clipAction  animations[0] 通过控制台可以看到狐狸关键帧数据,抬腿,摇头等等,
        action.play() // 开始 同时需要在更新时间时候 更新关键帧

        gltf.scene.scale.set(0.025,0.025,0.025)
        scene.add(gltf.scene)
    },
    ()=>{
        console.log('progress')
    },
    ()=>{
        console.log('error')
    }
)

/**
 * Floor
 */
const floor = new THREE.Mesh(
    new THREE.PlaneGeometry(10, 10),
    new THREE.MeshStandardMaterial({
        color: '#444444',
        metalness: 0,
        roughness: 0.5
    })
)
floor.receiveShadow = true
floor.rotation.x = - Math.PI * 0.5
scene.add(floor)

/**
 * Lights
 */
const ambientLight = new THREE.AmbientLight(0xffffff, 0.8)
scene.add(ambientLight)

const directionalLight = new THREE.DirectionalLight(0xffffff, 0.6)
directionalLight.castShadow = true
directionalLight.shadow.mapSize.set(1024, 1024)
directionalLight.shadow.camera.far = 15
directionalLight.shadow.camera.left = - 7
directionalLight.shadow.camera.top = 7
directionalLight.shadow.camera.right = 7
directionalLight.shadow.camera.bottom = - 7
directionalLight.position.set(5, 5, 5)
scene.add(directionalLight)

/**
 * Sizes
 */
const sizes = {
    width: window.innerWidth,
    height: window.innerHeight
}

window.addEventListener('resize', () =>
{
    // Update sizes
    sizes.width = window.innerWidth
    sizes.height = window.innerHeight

    // Update camera
    camera.aspect = sizes.width / sizes.height
    camera.updateProjectionMatrix()

    // Update renderer
    renderer.setSize(sizes.width, sizes.height)
    renderer.setPixelRatio(Math.min(window.devicePixelRatio, 2))
})

/**
 * Camera
 */
// Base camera
const camera = new THREE.PerspectiveCamera(75, sizes.width / sizes.height, 0.1, 100)
camera.position.set(2, 2, 2)
scene.add(camera)

// Controls
const controls = new OrbitControls(camera, canvas)
controls.target.set(0, 0.75, 0)
controls.enableDamping = true

/**
 * Renderer
 */
const renderer = new THREE.WebGLRenderer({
    canvas: canvas
})
renderer.shadowMap.enabled = true
renderer.shadowMap.type = THREE.PCFSoftShadowMap
renderer.setSize(sizes.width, sizes.height)
renderer.setPixelRatio(Math.min(window.devicePixelRatio, 2))

/**
 * Animate
 */
const clock = new THREE.Clock()
let previousTime = 0

const tick = () =>
{
    const elapsedTime = clock.getElapsedTime()
    const deltaTime = elapsedTime - previousTime
    previousTime = elapsedTime

    // Updata mixer
    if(mixer != null){
        mixer.update(deltaTime)
    }
    

    // Update controls
    controls.update()

    // Render
    renderer.render(scene, camera)

    // Call tick again on the next frame
    window.requestAnimationFrame(tick)
}

tick()

二、知识点

1.格式以及引用模型

    OBJ FBX STL PLY 3DS GLTF

    COLLADA

 有不同的格式这里使用GLTF

GLTF

对应格式 gltf ,gltf-binary(二进制),gltf-draco和gltf-embedded(嵌入式)

如何使用

   import {GLTFLoader} from 'three/examples/jsm/loaders/GLTFLoader.js

    gltfLoader.load()

    将模型添加到场景中

    scene.add(gltf.scene)

2.Draco压缩

如何使用

import { DRACOLoader } from 'three/examples/jsm/loaders/DRACOLoader.js'

const dracoLoader = new DRACOLoader()

dracoLoader.setDecoderPath('/draco/')  // 要将models中的文件放到静态文件中 (注意要将数据放到models下)

3.动画

 new THREE.AnimationMixer() 动画混合器

clipAction 动画剪辑器

play 更新关键帧 同时要配合更新的时间使用

4.效果

1.鸭子关键代码 ,没有用到draco压缩

// models

const gltfLoader = new GLTFLoader()


gltfLoader.load(
    '/models/Duck/glTF/Duck.gltf', // 2.
   (gltf)=>{
    console.log(gltf)
    //    const children = [...gltf.scene.children]
    //     for(const child of children){
    //         scene.add(child)
    //     }

    scene.add(gltf.scene)


   }
)

2.人像

const gltfLoader = new GLTFLoader()
// gltfLoader.setDRACOLoader(dracoLoader)

let mixer = null

gltfLoader.load(
    // '/models/Duck/glTF/Duck.gltf', // 2.
   '/models/FlightHelmet/glTF/FlightHelmet.gltf', // 会遇到将模型放到场景中,显示不全 1. 2.
   (gltf)=>{
    console.log(gltf)
    //    const children = [...gltf.scene.children]
        for(const child of gltf.scene.children){
            scene.add(child)
        }

   }
)

会看到加载进去的不完整

const gltfLoader = new GLTFLoader()
// gltfLoader.setDRACOLoader(dracoLoader)

gltfLoader.load(
    // '/models/Duck/glTF/Duck.gltf', // 2.
   '/models/FlightHelmet/glTF/FlightHelmet.gltf', // 会遇到将模型放到场景中,显示不全 1. 2.
   (gltf)=>{
    console.log(gltf)
       const children = [...gltf.scene.children]
        for(const child of children){
            scene.add(child)
        }
        // scene.add(gltf.scene) //两种方式都可以
   }
)

3.draco压缩使用 鸭子

const dracoLoader = new DRACOLoader()
dracoLoader.setDecoderPath('/draco/') 

const gltfLoader = new GLTFLoader()
gltfLoader.setDRACOLoader(dracoLoader)

// let mixer = null

gltfLoader.load(
    '/models/Duck/glTF-Draco/Duck.gltf',  // draco 压缩 版本 2., // 会遇到将模型放到场景中,显示不全 1. 2.
   (gltf)=>{
    console.log(gltf)
    //    const children = [...gltf.scene.children]
        // for(const child of children){
        //     scene.add(child)
        // }
        scene.add(gltf.scene)
   }
)

4.狐狸


// models
const dracoLoader = new DRACOLoader()
dracoLoader.setDecoderPath('/draco/') 

const gltfLoader = new GLTFLoader()
gltfLoader.setDRACOLoader(dracoLoader)

let mixer = null

gltfLoader.load(
    // '/models/Duck/glTF/Duck.gltf', // 2.
//    '/models/FlightHelmet/glTF/FlightHelmet.gltf', // 会遇到将模型放到场景中,显示不全 1. 2.
'/models/Fox/glTF/Fox.gltf',  // 实现动画 会动的狐狸
   (gltf)=>{
        console.log(gltf)
        mixer = new THREE.AnimationMixer(gltf.scene) // 动画混合器
        const action = mixer.clipAction(gltf.animations[2]) // 动画剪辑器 clipAction  animations[0] 通过控制台可以看到狐狸关键帧数据,抬腿,摇头等等,
        action.play() // 开始 同时需要在更新时间时候 更新关键帧

        gltf.scene.scale.set(0.025,0.025,0.025)
        scene.add(gltf.scene)
   }
)

注意更新时间

const tick = () =>
{
    const elapsedTime = clock.getElapsedTime()
    const deltaTime = elapsedTime - previousTime
    previousTime = elapsedTime

    // Updata mixer
    if(mixer != null){
        mixer.update(deltaTime)
    }

    // Update controls
    controls.update()

    // Render
    renderer.render(scene, camera)

    // Call tick again on the next frame
    window.requestAnimationFrame(tick)
}

综合

效果


总结

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

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

相关文章

基于单片机控制的升降式焊接工作台的设计

摘 要: 设计一种基于单片机控制的升降式焊接工作台,由机械系统和单片机控制系统组成 。 采用 STC89C51 单片机为电路控制核心,独立键盘和共阴极 7 段数码管显示器作为外设,对升降式焊接工作台单片机控制系统中的主控电路 、 显示电路、 键…

精选3款屏幕录制软件,总有一款适合你

随着技术的不断发展,屏幕录制已成为我们生活中不可或缺的一部分,无论是录制在线会议、制作教程、游戏直播还是分享演示文稿,屏幕录制软件都发挥着重要作用。本文将详细介绍3款主流的屏幕录制工具,并分步骤阐述它们的使用方法&…

CogVideo 实测,智谱「清影」AI视频生成,全民免费,连 API 都开放了!

不得不说,AI 视频生成界最近非常火热~ 前有快手「可灵」开放内测,一下子带火了老照片修复,全网刷屏: 怕是你还没拿到内测资格,被称为 “国货之光” 的「可灵」就结束了免费无限量模式。每天只有66点的免费额度&#x…

小程序的运营方法:从入门到精通

随着科技的快速发展,小程序已成为我们日常生活和工作中不可或缺的一部分。小程序无需下载安装,即用即走的特点深受用户喜爱。那么,如何运营好一个小程序呢?下面就为大家分享一些小程序的运营方法。 一、明确目标用户 在运营小程序…

sqlserver 连接数据4064

用sa登录,找到对应的登录名,右键属性,设置默认数据库

Android APP 音视频(03)CameraX预览与MediaCodec编码

说明: 此CameraX预览和编码实操主要针对Android12.0系统。通过CameraX预览获取yuv格式数据,将yuv格式数据通过mediacodec编码输出H264码流(使用ffmpeg播放),存储到sd卡上。 1 CameraX 和 MediaCodec简介 1.1 CameraX…

【区块链】如何发行自己的加密货币到以太坊测试网络,remixIDE发行自己的数字货币

如何发行自己的加密货币到以太坊测试网络 环境 reminx在线编辑器:https://remix.ethereum.org/安装有小狐狸钱包插件(MetaMask) 如何部署代币? 创建一个名字叫做HelloMyToken.sol的文件。编写好智能合约,这边我要发…

RedHat9 | Ansible 处理任务失败

环境版本说明 RedHat9 [Red Hat Enterprise Linux release 9.0]Ansible [core 2.13.3]Python [3.9.10]jinja [3.1.2] 1. 忽略任务失败 Ansible评估各任务的返回代码,从而确定任务是成功还是失败通常而言,当任务失败时,Ansible将立即在该主…

【2024年国际高等学校数学建模竞赛IMMCHE】问题 A:金字塔石块的运输 问题分析及数学模型及求解代码

【2024 年国际高等学校数学建模竞赛(IMMCHE)】问题 A:金字塔石块的运输 问题分析及数学模型及求解代码 Problem A: Transportation of Pyramid Stones 1 题目 建造金字塔是古埃及文明的杰出成就之一。它们不仅是建筑奇迹,也是人…

1.C基础_计算机基础知识

计算机构成 计算机是由输入设备、输出设备、内存储器、外存储器、CPU构成,具体框图如下: 输入设备:将其他信号转换为计算机能识别的电信号的设备,如传感器 输出设备:将电信号转换为其他信号,如显示器 存…

SAM与OpenAI发布的CLIP强强联手(SAM2CLIP 和 CLIP2SAM),实现22000类的分割与识别

Abstract CLIP 和 Segment Anything Model(SAM)是卓越的视觉基础模型(VFMs)。SAM 在各种领域的分割任务中表现出色,而 CLIP 以其零样本识别能力而闻名。本文深入探讨了将这两种模型整合到一个统一框架中的方法。具体而…

2024101读书笔记|《飞花令·冬》——三冬雪压千年树,四月花繁百尺藤

2024101读书笔记|《飞花令冬》——三冬雪压千年树,四月花繁百尺藤 《飞花令冬(中国文化古典诗词品鉴)》素心落雪 编著,飞花令得名于唐代诗人韩翃《寒食》中的名句“春城无处不飞花”,类似于行酒令,是文人们…

Java 面试相关问题(下)——JVM相关问题GC相关问题

1. 类加载1.1 类的生命周期说一下?1.2 介绍下生命周期中的加载?1.3 介绍下生命周期中的验证?1.4 介绍下生命周期中的准备?1.5 介绍下生命周期中的解析?1.6 介绍下生命周期中的初始化?1.7 介绍下生命周期中的…

MySQL大框架总结

1.DDL,DML,DQL,DCL的区别 (由于DCL是关乎用户的,以下内容重点讲述数据库,表与数据的操作,所以对DCL不详细赘述) DDL DML DQL DCL 中文/英文 数据库定义语言 data definition language 数据库操作语言 data mani…

04-用户画像+sqoop使用

优点 sqoop的作用是实现数据的导入和导出,主要是对数据库和数据仓库之间的操作 只要是支持jdbc连接的数据库都可以使用sqoop操作 添加Sqoop到环境变量中 export SQOOP_HOME/export/server/sqoop export PATH$PATH:$SQOOP_HOME/bin:$SQOOP_HOME/sbinsource /etc/…

Spark RDD 介绍

什么是 RDD ? 弹性分布式数据集,是 Spark 中最基本的数据处理模型。代码中是一个抽象类,它代表一个弹性的、不可变、可分区、里面的元素可并行计算的集合; 特性: 弹性: 存储弹性:内存与磁盘的…

CentOS 7.x 的 YUM 仓库问题

背景 CentOS Linux 7 的生命周期(EOL)已经于 2024 年 6 月 30 日终止这意味着 CentOS 7.x 的官方镜像站点将不再提供服务,导致在使用 yum 安装或更新程序时可能会遇到 错误。本文将介绍如何解决这一问题,使得你可以继续在 CentOS…

实验八: 彩色图像处理

目录 一、实验目的 二、实验原理 1. 常见彩色图像格式 2. 伪彩色图像 3. 彩色图像滤波 三、实验内容 四、源程序和结果 (1) 主程序(matlab (2) 函数FalseRgbTransf (3) 函数hsi2rgb (4) 函数rgb2hsi (5) 函数GrayscaleFilter (6) 函数RgbFilter 五、结果分析 1. …

shell脚本相关应用

编写一个简单的脚本,以及运行脚本 301 vim helloworld.sh #!/bin/bash echo "hello world!" ls -lh /etc/ 执行的方式如下: 302 bash helloworld.sh 303 sh helloworld.sh 304 chmod x helloworld.sh 305 ./helloworld.sh…

【计算机网络】数据链路层实验

一:实验目的 1:学习WireShark软件的抓包操作,分析捕获的以太网的MAC帧结构。 2:学习网络中交换机互相连接、交换机连接计算机的拓扑结构,理解虚拟局域网(WLAN)的通信机制。 3:学习…