three.js渲染带动画的glb文件

news2024/11/20 7:24:10

1.  准备工作

        将下列文件在three.js的包中找到,注意的是我这里使用的是模块化版本的,这里不知道模块化的,可以先去看一下es6的模块化


控制器: OrbitControls.js

加载器:GLTFLoader.js

材质: RoomEnvironment.js

three.js加载压缩模型: DRACOLoader

模型文件: 我这里用的是glb

2.  演示开始

1. 在body中新建一个div用来承载three.js创建canvas标签

2. 把准备好的文件引入,注意script标签加上type=module

代码:

<body>
  <div id="WebGL-output"></div>
</body>

<script type="module">
  import * as THREE from './js/three.module.js'
  import { OrbitControls } from './js/OrbitControls.js'
  import { GLTFLoader } from './js/GLTFLoader.js'
  import { RoomEnvironment } from './js/RoomEnvironment.js'
  import { DRACOLoader } from './js/DRACOLoader.js'
</script>

 到这里算是准备工作正式完成!

注意:引用文件中有些事件依赖于three.module.js这个文件夹的,需要去源码当中把路径修改,这里举一个例子:

 

3.初始化场景,相机,渲染器,控制器,灯光

  function init() {
    clock = new THREE.Clock()
    // 场景,相机
    scene = new THREE.Scene()

    // 添加场景背景
    const loader11 = new THREE.TextureLoader();
    const bgTexture = loader11.load('./model/111.png');
    scene.background = bgTexture;
    // scene.background = new THREE.Color(0xbbbbbb)

    // 透视相机()
    camera = new THREE.PerspectiveCamera(
      50,
      window.innerWidth / window.innerHeight,
      1,
      2000
    )
    camera.position.set(-230, 100, 300)
    scene.add(camera);

    // 渲染器
    renderer = new THREE.WebGLRenderer()
    renderer.setSize(window.innerWidth, window.innerHeight)
    document.body.appendChild(renderer.domElement)

    // 地表格
    // const grid = new THREE.GridHelper(500, 100, 0xffffff, 0xffffff)
    // grid.material.opacity = 0.5
    // grid.material.depthWrite = false
    // grid.material.transparent = true
    // scene.add(grid)

    // 材质
    // const environment = new RoomEnvironment()
    // const pmremGenerator = new THREE.PMREMGenerator(renderer)
    // scene.environment = pmremGenerator.fromScene(environment).texture

    //   灯光-环境光
    scene.add(new THREE.AmbientLight(0x444444))

    // 灯光-平行光
    const light = new THREE.DirectionalLight(0xffffff)
    light.position.set(0, 20, 20)

    light.castShadow = true
    light.shadow.camera.top = 100
    light.shadow.camera.bottom = -100
    light.shadow.camera.left = -100
    light.shadow.camera.right = 100

    //告诉平行光需要开启阴影投射
    light.castShadow = true
    scene.add(light)

    // 鼠标控制器
    control = new OrbitControls(camera, renderer.domElement)

    // 坐标轴
    // const axesHelper = new THREE.AxesHelper(114)
    // scene.add(axesHelper)
    loader()
    animate()
  }

 4. 加载带动画的glb文件

// glb模型加载
  function loader() {
    const loader = new GLTFLoader()
      .setPath('./model/')
      .setDRACOLoader(new DRACOLoader().setDecoderPath('js/gltf/'))

    loader.load('bbb.glb', function (gltf) {
      gltf.scene.scale.set(80, 80, 80)
      // 动画播放器
      mixer = new THREE.AnimationMixer(gltf.scene)
      mixer.clipAction(gltf.animations[0]).play()
      scene.add(gltf.scene)
    })
  }

  5.animate和render函数

function animate() {
    requestAnimationFrame(animate)
    if (mixer) mixer.update(clock.getDelta())
    control.update() // required if damping enabled
    render()
  }

  function render() {
    renderer.render(scene, camera)
  }

 6.函数调用

init()
animate()

所有代码:

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8" />
  <meta http-equiv="X-UA-Compatible" content="IE=edge" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <title>glb文件渲染</title>
</head>

<body>
  <div id="WebGL-output"></div>
</body>

<script type="module">
  import * as THREE from './js/three.module.js'
  import { OrbitControls } from './js/OrbitControls.js'
  import { GLTFLoader } from './js/GLTFLoader.js'
  import { RoomEnvironment } from './js/RoomEnvironment.js'
  import { DRACOLoader } from './js/DRACOLoader.js'

  let scene, camera, renderer, control, clock, mixer

  function init() {
    clock = new THREE.Clock()
    // 场景,相机
    scene = new THREE.Scene()

    // 添加场景背景
    const loader11 = new THREE.TextureLoader();
    const bgTexture = loader11.load('./model/111.png');
    scene.background = bgTexture;
    // scene.background = new THREE.Color(0xbbbbbb)

    // 透视相机()
    camera = new THREE.PerspectiveCamera(
      50,
      window.innerWidth / window.innerHeight,
      1,
      2000
    )
    camera.position.set(-230, 100, 300)
    scene.add(camera);

    // 渲染器
    renderer = new THREE.WebGLRenderer()
    renderer.setSize(window.innerWidth, window.innerHeight)
    document.body.appendChild(renderer.domElement)

    // 地表格
    // const grid = new THREE.GridHelper(500, 100, 0xffffff, 0xffffff)
    // grid.material.opacity = 0.5
    // grid.material.depthWrite = false
    // grid.material.transparent = true
    // scene.add(grid)

    // 材质
    // const environment = new RoomEnvironment()
    // const pmremGenerator = new THREE.PMREMGenerator(renderer)
    // scene.environment = pmremGenerator.fromScene(environment).texture

    //   灯光-环境光
    scene.add(new THREE.AmbientLight(0x444444))

    // 灯光-平行光
    const light = new THREE.DirectionalLight(0xffffff)
    light.position.set(0, 20, 20)

    light.castShadow = true
    light.shadow.camera.top = 100
    light.shadow.camera.bottom = -100
    light.shadow.camera.left = -100
    light.shadow.camera.right = 100

    //告诉平行光需要开启阴影投射
    light.castShadow = true
    scene.add(light)

    // 鼠标控制器
    control = new OrbitControls(camera, renderer.domElement)

    // 坐标轴
    // const axesHelper = new THREE.AxesHelper(114)
    // scene.add(axesHelper)
    loader()
    animate()
  }

  // glb模型加载
  function loader() {
    const loader = new GLTFLoader()
      .setPath('./model/')
      .setDRACOLoader(new DRACOLoader().setDecoderPath('js/gltf/'))

    loader.load('bbb.glb', function (gltf) {
      gltf.scene.scale.set(80, 80, 80)
      // 动画播放器
      mixer = new THREE.AnimationMixer(gltf.scene)
      mixer.clipAction(gltf.animations[0]).play()
      scene.add(gltf.scene)
    })
  }

  function animate() {
    requestAnimationFrame(animate)
    if (mixer) mixer.update(clock.getDelta())
    control.update() // required if damping enabled
    render()
  }

  function render() {
    renderer.render(scene, camera)
  }

  init()
  animate()
</script>
</html>

右击运行:

结果:

 

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

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

相关文章

学习JAVA打卡第四十八天

Math类 在编写程序时可能需要计算一个数的平方根、绝对值或获取一个随机数等。 Math类的常用方法 BigInteger类 程序如果需要处理特别大的整数就可以用Java.math包中的BigInteger类的对象。 可以构造public BigInteger&#xff08;string val&#xff09;构造一个十进制的B…

Flink+Paimon多流拼接性能优化实战

目录 &#xff08;零&#xff09;本文简介 &#xff08;一&#xff09;背景 &#xff08;二&#xff09;探索梳理过程 &#xff08;三&#xff09;源码改造 &#xff08;四&#xff09;修改效果 1、JOB状态 2、Level5的dataFile总大小 3、数据延迟 &#xff08;五&…

【zookeeper】zookeeper介绍

分布式协调技术 在学习ZooKeeper之前需要先了解一种技术——分布式协调技术。那么什么是分布式协调技术&#xff1f;其实分布式协调技术主要用来解决分布式环境当中多个进程之间的同步控制&#xff0c;让他们有序的去访问某种临界资源&#xff0c;防止造成"脏数据"的…

Joint contrast enhancement and exposure fusion for real-world image dehazing、近红外去雾、(近)红外和可见光数据集

今天给大家分享一篇发表在IEEE TMM上的去雾文章Joint Contrast Enhancement and Exposure Fusion for Real-World Image Dehazing 作者从对比度增强和曝光融合的视角来解决图像去雾问题&#xff0c;在真实场景上取得了较好的去雾效果。此外&#xff0c;作者将所提出的方法应用…

mqtt集群搭建并使用nginx做负载均衡_亲测得结论

mqtt集群搭建 RabbitMQ集群搭建和测试总结_亲测 搭建好RabbitMQ集群,并开启mqtt插件功能,mqtt集群也就搭建好了 nginx配置mqtt负载均衡 #修改rabbitmq1节点ip为1.19的nginx配置 vim /etc/nginx/nginx.confhttp { } #在http外添加如下配置 stream {upstream rabbitmqtt {ser…

OpenCV(十二):图像透视变换

目录 1.透视变换介绍 2.计算透视变换矩阵getPerspectiveTransform(&#xff09; 3.透视变换函数warpPerspective() 4.demo 1.透视变换介绍 透视变换是一种将原始图像映射到目标图像平面上的投影变换&#xff0c;又称为四点变换。 透视变换矩阵的一般形式如下所示&#xff…

城市内涝积水监测预警系统 yolov8

城市内涝积水监测预警系统通过yolov8网络深度学习框架&#xff0c;算法一旦识别到道路出现积水&#xff0c;城市内涝积水监测预警系统会立即发出预警信号。并及时通知相关人员。YOLO检测速度非常快。标准版本的YOLO可以每秒处理 45 张图像&#xff1b;YOLO的极速版本每秒可以处…

具有 70V 总线故障保护功能的ISO1042BQDWVRQ1、ISO1042BQDWVQ1、ISO1042QDWVRQ1汽车类隔离式 CAN 收发器

一、目标应用 • 起动机/发电机 • 电池管理系统 (BMS) • 直流/直流转换器 • 车载充电器 (OBC) 和无线充电器 • 逆变器和电机控制 二、器件规格 1、ISO1042BQDWVRQ1 完全版 收发器&#xff0c;隔离式 1/1 CANbus 8-SOIC 类型&#xff1a;收发器&#xff0c;隔离式 协议&a…

day30 日期转换

一&#xff1a;Date Date类&#xff1a; 这个类是java.util.Date getTime() : 获取内部维护的long值 Date date new Date(); long time date.getTime(); setTime()&#xff1a;按照指定的long值&#xff08;表示的时间&#xff09;设置Date表示的时间 time 60*60*24*1000;…

项目实践:类平面抓取点计算(占位,后面补充)

文章目录 文章目录&#xff1a;3D视觉个人学习目录微信&#xff1a;dhlddxB站: Non-Stop_

贯穿嵌入式开发的编程语言?

有个朋友和我说嵌入式行业中有没有什么神技巧&#xff0c;所谓的一招鲜吃遍天一般&#xff0c;那还真的有&#xff0c;在嵌入式开发中&#xff0c;C语言是最广泛使用的编程语言之一&#xff0c;覆盖范围几乎涵盖了整个领域。视频后方有免费的嵌入式学习资料&#xff0c;入门和进…

PHP 接入微信支付分

♦ 背景 最近项目中需要接入【微信支付分】的服务&#xff0c; 本文以 【免确认订单模式】&#xff1a;即先享模式&#xff08;评估不通过不可使用服务&#xff09;的使用 在此做一下实现步骤&#xff0c;希望能对小伙伴有所帮助&#xff0c;欢迎指摘 … 实现语言&#xff1a;P…

【NLP】手把手使用PyTorch实现Transformer以及Transformer-XL

手把手使用PyTorch实现Transformer以及Transformer-XL Abstract of Attention is all you need使用PyTorch实现Transformer1. 构建Encoder-Decoder模型1.1 导入依赖库1.2 创建Encoder-Decoder类1.3 创建Generator类 2. 构建Encoder2.1 定义复制模块的函数2.2 创建Encoder2.3 构…

语言基础篇3——学习第一步,Python环境搭建

环境搭建 基础环境搭建 https://www.python.org/downloads/&#xff0c;以Python3.11.5为例&#xff1a; Install for Windows 提供安装程序或者压缩包&#xff0c;安装程序点击下一步即可&#xff0c;压缩包解压即可&#xff0c;注意配置根目录到系统环境变量PATH。 Ins…

uniapp项目实战系列(3):底部导航栏与头部导航栏的配置

目录 系列往期文章&#xff08;点击跳转&#xff09;uniapp项目实战系列(1)&#xff1a;导入数据库&#xff0c;启动后端服务&#xff0c;开启代码托管&#xff08;点击跳转&#xff09;uniapp项目实战系列(2)&#xff1a;新建项目&#xff0c;项目搭建&#xff0c;微信开发工具…

MySQL— 基础语法大全及操作演示!!!(事务)

MySQL—— 基础语法大全及操作演示&#xff08;事务&#xff09; 六、事务6.1 事务简介6.2 事务操作6.2.1 未控制事务6.2.2 控制事务一6.2.3 控制事务二 6.3 事务四大特性6.4 并发事务问题6.5 事务隔离级别 MySQL— 基础语法大全及操作演示&#xff01;&#xff01;&#xff01…

docker 部署springboot(成功、截图)

1.新建sringboot工程并打包 2.编写Dockerfile文件 # 基础镜像使用java FROM openjdk:8 # 作者 MAINTAINER feng # VOLUME 指定了临时文件目录为/tmp。 # 其效果是在主机 /var/lib/docker 目录下创建了一个临时文件&#xff0c;并链接到容器的/tmp VOLUME /tmp # 将jar包添加…

什么是数据丢失防护(DLP)

数据丢失防护 &#xff08;DLP&#xff09; 是一种安全策略&#xff0c;旨在保护企业的关键数据免遭未经授权的用户盗窃、丢失或访问。一个好的 DLP 系统是用于数据发现和分类、数据传输和访问控制、策略和事件管理以及细致的审核和警报的工具的组合。 数据丢失的原因是什么 …

Databricks 入门之sql(二)常用函数

1.类型转换函数 使用CAST函数转换数据类型&#xff08;可以起别名&#xff09; SELECTrating,CAST(timeRecorded as timestamp) FROMmovieRatings; 支持的数据类型有&#xff1a; BIGINT、BINARY、BOOLEAN、DATE 、DECIMAL(p,s)、 DOUBLE、 FLOAT、 INT、 INTERVAL interva…

嵌入式学习之popen函数

相比于system输出的好处&#xff0c;popen可以直接输出运行结果 14.进程总结 需要重点掌握进程配合相关概念&#xff0c;创建进程函数fork的使用&#xff0c;理解进程创建发生了什么事&#xff0c;exec族函数&#xff0c;exec族函数配合fork使用。