首页 > 其他分享 >Three.js 学习记录

Three.js 学习记录

时间:2022-10-07 16:55:40浏览次数:54  
标签:记录 加载 scene Three renderer new js gltf

首先,你要引入three.js 插件,这里默认你已经安装好了该插件

three.js 使用时必要的模块有:渲染器,相机,光源,场景,以及你要的加载模型

在vue页面中引入

import * as THREE from "three";

import { DRACOLoader } from "three/examples/jsm/loaders/DRACOLoader.js";
import { GLTFLoader } from "three/examples/jsm/loaders/GLTFLoader.js";
import { OrbitControls } from "three/examples/jsm/controls/OrbitControls.js";

// 这里的loader是模型加载器,你需要找到对应模型的加载器,OrbitControls是必须要引入的

在methods方法里写

第一个,初始化渲染器

initRenderer() {
      // 获取盒子的宽度
      width = document.getElementById("box").clientWidth;
      // 获取盒子的高度
      height = document.getElementById("box").clientHeight;
      // 初始化渲染器
      renderer = new THREE.WebGLRenderer({
        // 开启抗锯齿
        antialias: true,
      });
      // 设置宽和高
      renderer.setSize(550, 600);
      // 开启渲染气阴影效果
      renderer.shadowMap.enabled = true;
      // 这个阴影类型看起来比较清晰
      renderer.shadowMap.type = THREE.PCFSoftShadowMap;
      // 设置渲染器阴影
      renderer.setClearColor("#e2e8f6", 1.0);
      // 添加渲染器类名
      renderer.domElement.classList.add("Model3D");
      // 将渲染器添加到dom
      this.$refs.model.appendChild(renderer.domElement); // 添加到dom
},

第二个,初始化场景

initScene() {
      // 实例化场景
      scene = new THREE.Scene();
    // 场景中可以添加坐标轴,此处未添加
},

第三个,初始化相机

此处,应当了解正投影相机和透视投影相机的区别

initCamera() {
      // 实例化相机
      // 分别是正投影相机OrthographicCamera和透视投影相机PerspectiveCamera
      // 参数分别为fov,aspect,near,far
      // fov:垂直视野角度,一般默认为45
      // aspect表示摄像机视锥体长宽比,一般默认为1,实际用为项目的宽高比
      // near表示摄像机视锥体近端面,这个值默认为0.1
      // far表示摄像机视锥体远端面,默认为2000
      camera = new THREE.PerspectiveCamera(45, 550 / 600, 0.1, 1000000);
      // 摄像机位置设定
      camera.position.set(50, 25, 25);
      // lookAt表示相机拍摄时指向的中心点
      camera.lookAt(new THREE.Vector3(0, 0, 0));
      // 通过OrbitControls.js可以对Threejs 的三维场景进行缩放,平移,旋转操作,其本质上改变的幷不是场景,而是相机的参数。
      controls = new OrbitControls(camera, renderer.domElement);
      // 垂直旋转的角度的下限,范围是0到Math.PI,其默认值为0
      controls.minPolarAngle = 0;
      // 垂直旋转的角度的上限,范围是0到Math.PI,其默认值为Math.PI。
      controls.maxPolarAngle = Math.PI / 2;
      // 自动围绕目标旋转。请注意,如果它被启用,你必须在你的动画循环里调用.update()。
      controls.autoRotate = true;
    },

第四个,初始化灯光

此处,应当了解平行光和环境光的区别

initLight() {
      // 场景里添加环境光
      scene.add(new THREE.AmbientLight(0xffffff));
      // 平行光
      var directionalLight = new THREE.DirectionalLight(0xffffff, 1);
      // 设置光源的方向:通过光源position属性和目标指向对象的position属性计算
      directionalLight.position.set(50, 52, 100);
      // 平行光会产生动态阴影
      directionalLight.castShadow = true;
      // 方向光指向对象网格模型mesh2,可以不设置,默认的位置是0,0,0
      scene.add(directionalLight);
    },

第五个,加载模型

模型有很多类型,请选择对应类型的加载器

注意:fbx模型需要查看材质在three.js 中是否有,如果没有对应的材质,模型会加载不出来,需要单独设置材质

initModel() {
      // gltf加载器
      const loader = new GLTFLoader();
      // draco加载器
      const dracoLoader = new DRACOLoader();
      // 引入这个文件夹
      dracoLoader.setDecoderPath("/draco/");
      loader.setDRACOLoader(dracoLoader);
      // 加载地图模型
      // /model/16.02.glb
      loader.load(
        "https://file.channovers.com/488760-bladex/upload/20220816/be68c580e6ff3a34a0c2e7974193205e.glb",
        (gltf) => {
          // 启用阴影选项
          gltf.scene.castShadow = true;
          // 启用接受阴影选项
          gltf.scene.receiveShadow = true;
          // 场景对象
          // 此处可以不考虑
          gltf.scene.children = this.findName(gltf.scene.children);
          //将模型添加至场景
          scene.add(gltf.scene);
          //设置模型位置
          gltf.scene.position.set(-18, 0, -22);
          ogltf = gltf;
        },
        (load) => {
          // load加载
          this.load = ((load.loaded / load.total) * 100).toFixed(2);
        }
      );
    },

第六个,变动更新

animate() {
      // requestAnimationFrame() 是将要被调用函数的函数名
      // 一般默认保持60FPS
      requestAnimationFrame(this.animate);
      // 更新控制
      controls.update();
      // 渲染器更新
      renderer.render(scene, camera);
      if (mixer) {
        mixer.update(clock.getDelta());
      }
    },

 

目前还需要学习动画,树结构,底层

标签:记录,加载,scene,Three,renderer,new,js,gltf
From: https://www.cnblogs.com/yuanZi666/p/16759995.html

相关文章

  • 教你开发一个JS代码加密工具
    教你开发一个JS代码加密工具作者:JShaman.comw2sft本文,教你开发一个JS代码加密工具。工具可实现:把正常的JS代码,转化为加密代码,并且加密后的JS代码能直接运行。效果展示加密......
  • httpclient实现HttpGet请求传body的json参数的!
    原文来自:https://admins.blog.csdn.net/article/details/109809386前言最近调用公司项目一个接口时,发现该接口是一个Get请求,入参在Body中(json格式)。场景如下:A服务需发送h......
  • JS + Canvas 碰撞检测
     <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metahttp-equiv="X-UA-Compatible"content="IE=edge"><metaname="viewport"content=......
  • 直播带货源码,通过js实现轮播图的效果
    直播带货源码,通过js实现轮播图的效果<!DOCTYPEhtml><html> <head>  <metacharset="UTF-8">  <metahttp-equiv="X-UA-Compatible"content="IE=edge">  <m......
  • 2022.10.7 - Mac 安装nvm记录
    Mac安装nvm记录参照原文:Mac安装使用nvm---解决安装443问题【没有废话-清爽版】M1芯片Mac搭建前端开发环境mac安装nvm及换源及node安装切换NVM官网在Mac(M1芯片)安装......
  • autojs 企业微信 一键上传
    app.startActivity({action:"android.intent.action.VIEW",data:"alipays://platformapi/startapp?appId=2018062060350751&page=%2Fpages%2Fweb%2Fweb%3Furl%3Dht......
  • javase复习记录
    为什么重写equals还要重写hashcode?==和equals比较的区别为啥有时会出现4.0-3.6=0.40000001这种现象?final关键字的作用介绍Java的集合类ArrayList和L......
  • HttpClient发送Post请求传递json、普通参数
    importcom.alibaba.fastjson.JSONObject;importorg.apache.http.HttpEntity;importorg.apache.http.NameValuePair;importorg.apache.http.client.entity.UrlEncod......
  • Springboot 之 Filter 实现 Gzip 压缩超大 json 对象
    简介在项目中,存在传递超大json数据的场景。直接传输超大json数据的话,有以下两个弊端占用网络带宽,而有些云产品就是按照带宽来计费的,间接浪费了钱传输数据大导致......
  • autojs 企业微信 一键上传 健康码 行程码
    auto();//打开autojs权限//https://pro.autojs.org/docs/#/zh-cn/coordinatesBasedAutomation?id=setscreenmetricswidth-height//设置屏幕分辨率的坐标setScreenMe......