跳至正文

Threejs | 导入三维模型(vue3)

一、安装three.js

npm install three

二、项目中引入three.js

import * as THREE from "three";

三、初始化三步,创建场景,相机,渲染器

// 创建场景
  let scene = new THREE.Scene();
  // 创建透视相机
  let camera = new THREE.PerspectiveCamera(
    45, // 摄像机视锥体垂直视野角度,从视图的底部到顶部,以角度来表示。默认值是50。
    window.innerWidth / window.innerHeight, // 摄像机视锥体的长宽比,通常是使用画布的宽/画布的高
    0.1, // 摄像机的近端面,默认值是0.1。
    2000 // 摄像机的远端面,默认值是2000。
  );
  camera.position.set(0, 0, 3);
  // 创建渲染器
  let renderer = new THREE.WebGLRenderer({ antialias: true });
  renderer.setSize(window.innerWidth, window.innerHeight);
  // 将画布添加到页面中
  screenDom.value.appendChild(renderer.domElement);

四、导入解压缩及gltf加载器

import { GLTFLoader } from "three/examples/jsm/loaders/GLTFLoader";
import { DRACOLoader } from "three/examples/jsm/loaders/DRACOLoader";

五、加载模型

// 设置解压缩的加载器
  let dracoLoader = new DRACOLoader();
  dracoLoader.setDecoderPath("./draco/gltf/");
  dracoLoader.setDecoderConfig({ type: "js" });
  let loader = new GLTFLoader();
  loader.setDRACOLoader(dracoLoader);
  loader.load("./files/gltf/Soldier.glb", (gltf) => {
    gltf.scene.scale.set(0.5, 0.5, 0.5);
    gltf.scene.position.set(0, -0.4, 0);
    gltf.scene.rotation.set(0, Math.PI, 0);
    scene.add(gltf.scene);
  });

六、导入加载器,可拖动全方位查看

import { OrbitControls } from "three/examples/jsm/controls/OrbitControls";
// 控制器 可以使得相机围绕目标进行轨道运动
  let controls = new OrbitControls(camera, renderer.domElement);

全部代码

<template>
  <div class="home">
    <div class="canvas-container" ref="screenDom"></div>
  </div>
</template>

<script setup>
import * as THREE from "three";
import { ref, onMounted } from "vue";
import { GLTFLoader } from "three/examples/jsm/loaders/GLTFLoader";
import { DRACOLoader } from "three/examples/jsm/loaders/DRACOLoader";
import { OrbitControls } from "three/examples/jsm/controls/OrbitControls";
let screenDom = ref(null);
onMounted(() => {
  // 创建场景
  let scene = new THREE.Scene();
  // 创建透视相机
  let camera = new THREE.PerspectiveCamera(
    45, // 摄像机视锥体垂直视野角度,从视图的底部到顶部,以角度来表示。默认值是50。
    window.innerWidth / window.innerHeight, // 摄像机视锥体的长宽比,通常是使用画布的宽/画布的高
    0.1, // 摄像机的近端面,默认值是0.1。
    2000 // 摄像机的远端面,默认值是2000。
  );
  camera.position.set(0, 0, 3);
  // 创建渲染器
  let renderer = new THREE.WebGLRenderer({ antialias: true });
  renderer.setSize(window.innerWidth, window.innerHeight);
  // 将画布添加到页面中
  screenDom.value.appendChild(renderer.domElement);
  // 控制器 可以使得相机围绕目标进行轨道运动
  let controls = new OrbitControls(camera, renderer.domElement);
  function render() {
    requestAnimationFrame(render);
    controls.update();
    renderer.render(scene, camera);
  }
  render();
  // 添加灯光
  let light = new THREE.DirectionalLight('#fff', 1);
  light.position.set(0, 0.5, 3);
  scene.add(light);
  let light2 = new THREE.DirectionalLight('#fff', 0.5);
  light2.position.set(0, 0, -1);
  scene.add(light2);
  let light3 = new THREE.AmbientLight('#fff', 0.5);
  light3.position.set(-1, 1, 1);
  scene.add(light3);
  let light4 = new THREE.AmbientLight('#fff', 1);
  light4.position.set(-1, -1, 1);
  scene.add(light4);
  // 设置解压缩的加载器
  let dracoLoader = new DRACOLoader();
  dracoLoader.setDecoderPath("./draco/gltf/");
  dracoLoader.setDecoderConfig({ type: "js" });
  let loader = new GLTFLoader();
  loader.setDRACOLoader(dracoLoader);
  loader.load("./files/gltf/Soldier.glb", (gltf) => {
    gltf.scene.scale.set(0.5, 0.5, 0.5);
    gltf.scene.position.set(0, -0.4, 0);
    gltf.scene.rotation.set(0, Math.PI, 0);
    scene.add(gltf.scene);
  });
  
});
</script>
<style>
body {
  background: #fff;
}
</style>

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注