在vue3项目中使用threejs加载3D模型,页面始终空白,无报错。
<template>
<div id="three"></div>
</template>
<script setup>
import * as THREE from 'three'
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls'
import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js';
import { STLLoader } from 'three/addons/loaders/STLLoader.js';
import { RGBELoader } from 'three/addons/loaders/RGBELoader.js';
import { DRACOLoader } from 'three/addons/loaders/DRACOLoader.js';
import { onMounted } from 'vue'
let renderer, scene, camera, controls, container, grid;
//初始化渲染器
const initRenderer = () => {
container = document.getElementById("three")
renderer = new THREE.WebGLRenderer( { antialias: true } )
renderer.setPixelRatio( window.devicePixelRatio )
renderer.setSize( window.innerWidth, window.innerHeight )
renderer.outputEncoding = THREE.sRGBEncoding
renderer.toneMapping = THREE.ACESFilmicToneMapping
renderer.toneMappingExposure = 0.85
container.appendChild( renderer.domElement )
}
// 初始化场景
const initScene = () => {
scene = new THREE.Scene();
scene.background = new THREE.Color( 0x663399 );
scene.environment = new RGBELoader().load( 'public/static/textures/equirectangular/venice_sunset_1k.hdr' );
scene.environment.mapping = THREE.EquirectangularReflectionMapping;
scene.fog = new THREE.Fog( 0x333333, 10, 15 );
var axesHelper = new THREE.AxesHelper(15);
scene.add(axesHelper);
}
// 初始化相机
const initCamera = () => {
camera = new THREE.PerspectiveCamera( 40, window.innerWidth / window.innerHeight, 0.1, 100 );
camera.position.set( 4.25, 1.4, - 4.5 );
camera.lookAt(new THREE.Vector3(0, 0, 0))
controls = new OrbitControls( camera, renderer.domElement );
controls.enableDamping = true;
controls.maxDistance = 9;
controls.target.set( 0, 0.5, 0 );
controls.update();
grid = new THREE.GridHelper( 20, 40, 0x333333, 0x333333 );
grid.material.opacity = 0.2;
grid.material.depthWrite = false;
grid.material.transparent = true;
scene.add( grid );
}
// 加载模型
const loadModel = () => {
const shadow = new THREE.TextureLoader().load( 'public/static/models/gltf/ferrari_ao.png' );
const dracoLoader = new DRACOLoader();
dracoLoader.setDecoderPath( 'public/static/js/libs/draco/gltf/' );
const loader = new GLTFLoader();
loader.setDRACOLoader( dracoLoader );
loader.load( 'public/static/models/gltf/ferrari.glb', function ( gltf ) {
const carModel = gltf.scene.children[ 0 ];
scene.add( carModel );
console.log(loader, carModel, scene, renderer)
}, function ( xhr ) {
console.log( ( xhr.loaded / xhr.total * 100 ) + '% loaded' );
}, function ( error ) {
console.log( error );
})
}
onMounted(() => {
initRenderer()
initScene()
initCamera()
loadModel()
})
</script>
<style lang='scss' scoped>
</style>
运行项目后,可以看到场景对象、相机对象、加载器对象、模型对象均可以正确打印,且无报错。但是页面始终空白,已确认过模型没有问题,也试过换模型,页面都是空白,尝试旋转场景,也无法展示模型。