3D 模型未出现在 React Three.js 组件中

3D Model Not Appearing in React Three.js Component

提问人:user22857802 提问时间:11/14/2023 最后编辑:user22857802 更新时间:11/15/2023 访问量:27

问:

我正在使用 Three.js 开发一个 React 组件来加载 3D 模型。但是,我遇到了 3D 模型未出现在场景中的问题。我已经为各种文件格式(gltf、obj、fbx 等)实现了加载器,但是当我上传文件时模型没有显示出来。

'use client';

import React, { useRef, useEffect } from 'react';
import * as THREE from 'three';

import { GLTFLoader } from 'three/addons/loaders/GLTFLoader';
import { OBJLoader } from 'three/addons/loaders/OBJLoader';
import { FBXLoader } from 'three/addons/loaders/FBXLoader';
import { STLLoader } from 'three/addons/loaders/STLLoader';
import { ColladaLoader } from 'three/addons/loaders/ColladaLoader';
import { PLYLoader } from 'three/addons/loaders/PlyLoader';
import { ObjectLoader } from 'three/src/loaders/ObjectLoader';

const Model = () => {
  const fileInputRef = useRef(null);
  const sceneRef = useRef(new THREE.Scene());
  const cameraRef = useRef(new THREE.PerspectiveCamera(75, 1, 0.1, 1000));
  const groupRef = useRef(new THREE.Group());
  const canvasRef = useRef(null);

  useEffect(() => {
    cameraRef.current.position.z = 5;

    // Add a directional light
    const directionalLight = new THREE.DirectionalLight(0xffffff, 0.8);
    directionalLight.position.set(1, 1, 1).normalize();
    sceneRef.current.add(directionalLight);

    sceneRef.current.add(groupRef.current);

    const renderer = new THREE.WebGLRenderer();
    renderer.setSize(window.innerWidth, window.innerHeight);
    canvasRef.current.appendChild(renderer.domElement);

    const animate = () => {
      requestAnimationFrame(animate);
      // Add any animations or updates here
      renderer.render(sceneRef.current, cameraRef.current);
    };

    animate(); // Start the rendering loop
  }, []); // Empty dependency array to run this effect only once on mount

  const handleFileChange = (event) => {
    var file = event.target.files[0]

    const reader = new FileReader();
    let material = new THREE.MeshPhongMaterial();

    reader.onload = function () {
      var loader = null;
      switch (file.name.split('.').pop().toLowerCase()) {
        case 'gltf':
          loader = new GLTFLoader();
          break;
        case 'obj':
          loader = new OBJLoader()
          break;
        case 'fbx':
          loader = new FBXLoader()
          break;
        case 'stl':
          loader = new STLLoader();
          break;
        case 'dae':
          loader = new ColladaLoader()
          break;
        case 'ply':
          loader = new PLYLoader()
          break;
        case 'json':
          loader = new ObjectLoader()
          break;
        default:
          console.log('Not Compatible')
      }

      var geometry = loader.parse(this.result);
      var mesh = new THREE.Mesh(geometry, material);
      mesh.castShadow = true;
      mesh.receiveShadow = true;
      groupRef.current.add(mesh);
    };

    reader.readAsArrayBuffer(file);
  };

  return (
    <div>
      <label htmlFor="model" className='text-white'>erfwerfwefw</label>
      <input type='file' name="model" id='pickFile' onChange={handleFileChange} ref={fileInputRef} />
      <div ref={canvasRef} className='z-1'></div>
    </div>
  );
};

export default Model;

详: 我已确保在文件开头导入必要的加载程序。 正确确定文件类型并将其传递给 loadModel 函数。 我在调用 loadModel 函数时正确使用了 Scene ref。 潜在关注领域: 加载器初始化和使用。 正确处理文件类型。 正确使用 Scene ref。 场景和摄像机配置。

错误消息:错误:THREE。GLTFLoader:无法加载缓冲区“Cube.bin”。

我尝试过什么:

确认加载程序初始化。 检查文件类型处理。 验证 Scene ref 用法。 确保正确的场景和摄像机配置。

对于可能导致 3D 模型未出现在场景中的原因,我将不胜感激。我的代码中是否有任何我应该检查或修改的特定区域?

JavaScript 三.js 反应三纤维 3D模型

评论


答: 暂无答案