当前位置: 首页 > article >正文

ThreeJS-纹理加载进度(十四)

使用纹理加载器对纹理加载进度进行监控

关键代码:

//创建加载管理器

    const manager = new THREE.LoadingManager(

      () => {

        console.log("加载完成");

      },

      (url, loaded, total) => {

        console.log("当前正在加载资源" + url);

        console.log("总资源数" + total + "已加载" + loaded);

      },

      (e) => {

        console.log("加载失败");

      }

    );

    //纹理加载器

    const textureLoader = new THREE.TextureLoader(manager);

完整代码:

 

<template>

  <div id="three_div"></div>

</template>

  <script>

import * as THREE from "three";

import { OrbitControls } from "three/examples/jsm/controls/OrbitControls";

export default {

  name: "HOME",

  components: {

    // vueQr,

    // glHome,

  },

  data() {

    return {};

  },

  mounted() {

    //使用控制器控制3D拖动旋转OrbitControls

    //控制3D物体移动

    //1.创建场景

    const scene = new THREE.Scene();

    console.log(scene);

    //2.创建相机

    const camera = new THREE.PerspectiveCamera(

      75,

      window.innerWidth / window.innerHeight,

      0.1,

      1000

    );

    //设置相机位置

    camera.position.set(0, 0, 10);

    //将相机添加到场景

    scene.add(camera);

    //添加物体

    //创建几何体

    const cubeGeometry = new THREE.BoxBufferGeometry(2, 2, 2);

    //创建加载管理器

    const manager = new THREE.LoadingManager(

      () => {

        console.log("加载完成");

      },

      (url, loaded, total) => {

        console.log("当前正在加载资源" + url);

        console.log("总资源数" + total + "已加载" + loaded);

      },

      (e) => {

        console.log("加载失败");

      }

    );

    //纹理加载器

    const textureLoader = new THREE.TextureLoader(manager);

    //纹理加载器加载图片

    const docColorLoader = textureLoader.load("three/door.webp");

    const menColorLoader = textureLoader.load("three/men_k.webp");

    const cubeMaterial = new THREE.MeshStandardMaterial({

      color: 0xffff00,

      transparent: true,

      map: docColorLoader, //黑色重叠区域完全透明,白色重叠区域完全不透明

      alphaMap: menColorLoader, //黑色重叠区域被覆盖,白色重叠区域不被覆盖

      side: THREE.DoubleSide,

    });

    //根据几何体和材质创建物体

    const mesh = new THREE.Mesh(cubeGeometry, cubeMaterial);

    //将物体加入到场景

    scene.add(mesh);

    //添加坐标轴辅助器

    const axesHepler = new THREE.AxesHelper(5);

    scene.add(axesHepler);

    //标准材质需要借助灯光

    //添加周围环境灯光(由物体发出的灯光)参数(灯色,强度0-1)

    const light = new THREE.AmbientLight(0xffffff, 0.5);

    scene.add(light);

    //初始化渲染器

    const render = new THREE.WebGLRenderer();

    //设置渲染器的尺寸

    render.setSize(window.innerWidth, window.innerHeight);

    //使用渲染器,通过相机将场景渲染进来

    //创建轨道控制器,可以拖动,控制的是摄像头

    const controls = new OrbitControls(camera, render.domElement);

    //设置控制阻尼,让控制器有更真实的效果

    controls.enableDamping = true;

    //将webgl渲染的canvas内容添加到body上

    document.getElementById("three_div").appendChild(render.domElement);

    //渲染下一帧的时候就会调用回调函数

    let renderFun = () => {

      //更新阻尼数据

      controls.update();

      //需要重新绘制canvas画布

      render.render(scene, camera);

      //监听屏幕刷新(60HZ,120HZ),每次刷新触发一次requestAnimationFrame回调函数

      //但是requestAnimationFrame的回调函数注册生命只有一次,因此需要循环注册,才能达到一直调用的效果

      window.requestAnimationFrame(renderFun);

    };

    // window.requestAnimationFrame(renderFun);

    renderFun();

    //画布全屏

    window.addEventListener("dblclick", () => {

      if (document.fullscreenElement) {

        document.exitFullscreen();

      } else {

        //document.documentElement.requestFullscreen();

        render.domElement.requestFullscreen();

      }

    });

    //监听画面变化,更新渲染画面,(自适应的大小)

    window.addEventListener("resize", () => {

      //更新摄像机的宽高比

      camera.aspect = window.innerWidth / window.innerHeight;

      //更新摄像机的投影矩阵

      camera.updateProjectionMatrix();

      //更新渲染器宽度和高度

      render.setSize(window.innerWidth, window.innerHeight);

      //设置渲染器的像素比

      render.setPixelRatio(window.devicePixelRatio);

      // console.log("画面变化了");

    });

  },

  methods: {

    paush(animate) {

      animate.pause();

    },

  },

};

</script>

<style scoped lang="scss">

</style>

效果图:

 

 


http://www.kler.cn/a/5868.html

相关文章:

  • Vue.config.productionTip = false 不起作用的问题及解决
  • 4 $ 符号
  • Zustand selector 发生 infinate loops的原因以及解决
  • STM32F4分别驱动SN65HVD230和TJA1050进行CAN通信
  • 【AI进化论】 如何让AI帮我们写一个项目系列:将Mysql生成md文档
  • 【计算机网络】什么是网关(Gateway)?
  • 小驰私房菜_02_Qcom 高通平台 新增加driver,需要准备哪些东西?
  • IOC和AOP以及spring框架
  • LeetCode-583. 两个字符串的删除操作
  • Centos7安装Redis
  • Ai智能时代即将到来,替代程序员还是相辅相成,我们拭目以待
  • 12 个非常实用的 JavaScript 函数
  • 自助式分析是数据组织的一种状态
  • 分散加载(2)---分散加载文件执行机制
  • Leetcode.939 最小面积矩形
  • 算法学习day46
  • 详细手把手教会二叉树链式结构【数据结构】
  • 【数据库管理】①实例与数据库
  • Springboot: Tomcat很好我选Undertow
  • ShareSDK Android 第三方平台分享参数说明
  • MySQL - 基于SSL安全连接的主从复制
  • 蓝桥杯31天真题冲刺|题解报告|第二十三天
  • Python中编码【encode】解码【decode】讲解
  • k8s qos等级
  • 【Windows版】VScode配置C++开发环境
  • Python实现提前查询考研成绩