Three.js 加载glb模型

引入资源

import * as THREE from "three";
import { GLTFLoader } from "three/addons/loaders/GLTFLoader.js";
 loadModel(option) {
    console.log("option1", option);
    let model = null;
    const loader1 = new GLTFLoader();
    console.log("loader1", loader1);
    loader1.load(option.url, (gltf) => {
      model = gltf.scene;
      model.position.set(option.x, option.y, option.z);
      // 模型中添加
      this.scene.add(gltf.scene);
    });
    console.log("model1111", model);
    return model;
  },  

使用

let option = {
    url: "./model/CesiumAir/Cesium_Air.glb",
    x: 15,
    y: 5,
    z: 0,
  };
  ffThree.loadModel(option);

异步加载

GLTFLoaderload方法是异步的,意味着它会在加载完成前立即返回,并且不会阻塞后续代码的执行。因此,当你在加载完成前访问model变量时,它仍然是null,因为加载过程尚未完成。

执行顺序问题

让我们来分析一下你的代码执行顺序:

  1. 创建loader1实例const loader1 = new GLTFLoader();
  2. 调用loader1.load()loader1.load(option.url, (gltf) => {...});
    • 此时,loader1.load开始加载模型,但是它是异步操作,会立即返回,继续执行后续代码。
  3. 打印model变量console.log("model1111", model);
    • 在加载完成之前,这行代码会打印model1111 null,因为model还没有被赋值。
  4. 返回modelreturn model;
    • 函数会立即返回null,因为model还没有被赋值为加载完成的模型。

使用Promise对象 

一种常见的方法是利用Promise对象或者回调函数来处理异步加载的结果。例如,可以修改你的函数,使其返回一个Promise对象,当模型加载完成时,Promise对象resolve模型对象。

 loadModelPromise(option) {
    return new Promise((resolve, reject) => {
      const loader1 = new GLTFLoader();
      loader1.load(
        option.url,
        (gltf) => {
          const model = gltf.scene;
          model.position.set(option.x, option.y, option.z);
          this.scene.add(model);
          resolve(model); // 将加载的模型传递给Promise的resolve函数
        },
        undefined,
        reject
      );
    });
  },
  • loadModel函数现在返回一个Promise对象,当模型加载成功后,Promise会resolve为加载的模型对象。
  • 在加载成功的回调函数中,我们通过调用resolve(model)来传递加载的模型对象。

使用

 let option = {
    url: "./model/CesiumAir/Cesium_Air.glb",
    x: -15,
    y: 5,
    z: 0,
  };
  loadModelPromise(option).then((res) => {
    console.log("得到加载的glb模型,可以在这对其修改", res);
    // res.scale.set(0.1, 0.1, 0.1);
  });

效果

 

相关推荐

  1. Three.js的THREE.LOD如何gltf模型

    2024-07-17 19:00:02       56 阅读
  2. 从Unity到Three.js(模型文件

    2024-07-17 19:00:02       44 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-17 19:00:02       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-17 19:00:02       71 阅读
  3. 在Django里面运行非项目文件

    2024-07-17 19:00:02       58 阅读
  4. Python语言-面向对象

    2024-07-17 19:00:02       69 阅读

热门阅读

  1. 渗透测试前景怎么样

    2024-07-17 19:00:02       22 阅读
  2. 区块链技术的应用场景和优势

    2024-07-17 19:00:02       19 阅读
  3. 摘要算法介绍

    2024-07-17 19:00:02       23 阅读
  4. 如何规避苹果开发者账户关联

    2024-07-17 19:00:02       22 阅读
  5. golang笔记-流程控制

    2024-07-17 19:00:02       20 阅读
  6. js数组去重(4种方法)

    2024-07-17 19:00:02       19 阅读
  7. Python列表基础与高级应用详解

    2024-07-17 19:00:02       24 阅读
  8. 构建可扩展的淘客返利系统架构设计与实现

    2024-07-17 19:00:02       24 阅读
  9. 神经网络类型

    2024-07-17 19:00:02       22 阅读
  10. ArduPilot开源代码之AP_DAL_GPS

    2024-07-17 19:00:02       20 阅读