Three.js - 加载 .GLTF 格式模型(十七)

简介

在上一课中我们了解了.OBJ文件,.OBJ文件格式是很久以前使用的。它只有几何体顶点相关数据,所以它加载的内容都是在一个网格里面的。这样使得我们操作模型比较困难,为了方便就出现很多其它格式的3D模型文件。本节我们主要了解.GLTF 格式

.gltf

  • 用于显示图形的格式。也是各种3D编辑器之间的传输格式。
  • .gltf格式本质上是一个JSON文件。它能描述一整个3D场景,比如一个模型使用多少个网格,网格的旋转、位移等信息。

使用

  • 与加载.OBJ文件一样都需要先创建,基础代码。
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <title>学习</title>
  </head>
  <body>
    <canvas id="c2d" class="c2d" width="1000" height="500"></canvas>
    <script type="module">
      import * as THREE from './file/three.js-dev/build/three.module.js'
      import { OrbitControls } from './file/three.js-dev/examples/jsm/controls/OrbitControls.js'

      const canvas = document.querySelector('#c2d')
      // 渲染器
      const renderer = new THREE.WebGLRenderer({ canvas })

      const fov = 40 // 视野范围
      const aspect = 2 // 相机默认值 画布的宽高比
      const near = 0.1 // 近平面
      const far = 1000 // 远平面
      // 透视投影相机
      const camera = new THREE.PerspectiveCamera(fov, aspect, near, far)
      camera.position.set(1, 1, 1)
      camera.lookAt(0, 0, 0)
      // 控制相机
      const controls = new OrbitControls(camera, canvas)
      controls.update()

      // 场景
      const scene = new THREE.Scene()
      scene.background = new THREE.Color('black')

      {
        // 半球光
        const skyColor = 0xb1e1ff // 蓝色
        const groundColor = 0xffffff // 白色
        const intensity = 1
        const light = new THREE.HemisphereLight(skyColor, groundColor, intensity)
        scene.add(light)
      }

      {
        // 方向光
        const color = 0xffffff
        const intensity = 1
        const light = new THREE.DirectionalLight(color, intensity)
        light.position.set(0, 10, 0)
        light.target.position.set(-5, 0, 0)
        scene.add(light)
        scene.add(light.target)
      }

      // 渲染
      function render() {
        renderer.render(scene, camera)
        requestAnimationFrame(render)
      }

      requestAnimationFrame(render)
    </script>
  </body>
</html>
  • 引入GLTFLoader解析插件。
import { GLTFLoader } from './file/three.js-dev/examples/jsm/loaders/GLTFLoader.js'
  • 通常情况下加载和显示.GLTF文件.OBJ文件更简单,因为.GLTF文件中材质和几何体信息都是在一起的。
  • 这里加载的.glb格式,它是.GLTF格式的压缩文件。
      {
        const gltfLoader = new GLTFLoader()
        gltfLoader.load('./file/bingdundun.glb', (gltf) => {
          const root = gltf.scene
          scene.add(root)
        })
      }

1.gif

修改模型

  • 解析完成后,生成的就是一个场景对象。
console.log('root', root)

image.png

  • 可以看见最后生成的是一个Group组场景对象。
  • 使用.traverse()操作场景中的所有对象。
  // 遍历所有子对象
  root.traverse((child) => {
    if (child.isMesh) {
      // 内部
      if (child.name === 'oldtiger001') {
        // 金属度
        child.material.metalness = 0.5
        // 粗糙度
        child.material.roughness = 0.8
      }
      // 半透明外壳
      if (child.name === 'oldtiger002') {
        // 启用透明
        child.material.transparent = true
        // 透明度
        child.material.opacity = 0.5
        // 透明反射效果
        child.material.refractionRatio = 1
        child.material.metalness = 0.2
        child.material.roughness = 0
      }
    }
  })
  • .isMesh网格对象的属性,true表示是网格对象。
  • .name在创建模型时定义的网格名。

1.gif

  • 操作就这么简单,需要注意的是网格对象不要找错了。
  • 当然你还可以做其他操作,比如找到组对象中的.animations属性加载动画等。这里的模型没有添加这一类数据,后面我们在进行了解。

资源地址

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值