使用threejs加载模型,页面空白

在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>


运行项目后,可以看到场景对象、相机对象、加载器对象、模型对象均可以正确打印,且无报错。但是页面始终空白,已确认过模型没有问题,也试过换模型,页面都是空白,尝试旋转场景,也无法展示模型。

img

vue是世界上最好的语言。

https://blog.csdn.net/weixin_42406046/article/details/112860298您可以参考下

这光定义了渲染器跟相机,但是没有调用渲染函数吧
function animate() {

            requestAnimationFrame( animate );
            renderer.render( scene, camera );

}