reactjs - React 中的 Webpack 无法加载带有 GLTF 扩展的 3D 模型,显示 404 not found

标签 reactjs webpack three.js react-three-fiber

我正在尝试使用 Typescript 在 React 中加载扩展名为 .gltf 的 3D 模型。 3D 模型文件夹中的文件为.gltf、.png 和.bin 文件。用于此任务的工具是 webpack 和 drei 库中的 useGLTFLoader。我尝试过不同的工具。主要来自 three.js 库,没有效果。错误显示未找到 3D 模型 404(如下所示),并且在应放置 3D 模型的地方什么也没有出现。

GET http://localhost:3000/assets/models/Duck/glTF/Duck.gltf 404 (Not Found)

渲染 3D 模型的组件如下所示:

import React, { Suspense } from 'react';
import { Canvas } from 'react-three-fiber';
import { useGLTFLoader } from 'drei';

const DuckModel = () => {
 const gltf = useGLTFLoader('../../assets/models/Duck/glTF/Duck.gltf', true);
 return <primitive object={gltf.scene} dispose={null} />;
};

export const ThreeDimensionComponent = () => {
 return (
  <>
   <Canvas camera={{ position: [0, 0, 10], fov: 70 }}>
    <Suspense fallback={null}>
     <mesh position={[0, 250, 0]}>
      <DuckModel />
     </mesh>
    </Suspense>
   </Canvas>
  </>
 );
};

下面我分享我的 webpack 配置。

const path = require('path');
const webpack = require('webpack');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const { CleanWebpackPlugin } = require('clean-webpack-plugin');
const CopyWebpackPlugin = require('copy-webpack-plugin');

const root = __dirname;

const gsapPath = '/node_modules/gsap/src/uncompressed/';

module.exports = {
 devtool: 'source-map',
 mode: 'development',
 entry: path.join(__dirname, 'src', 'index.tsx'),
 watch: true,
 output: {
  filename: '[name].js',
  path: path.resolve(__dirname, 'dist'),
  sourceMapFilename: '[name].js.map'
 },
 module: {
  rules: [
   {
    test: /\.(tsx|ts)$/,
    use: ['babel-loader', 'ts-loader', 'tslint-loader']
   },
   {
    test: /\.scss$/,
    use: [
     'style-loader',
     {
      loader: 'css-loader',
      options: {
       sourceMap: true
      }
     },
     {
      loader: 'postcss-loader',
      options: {
       plugins: [require('autoprefixer')()],
       sourceMap: true
      }
     },
     {
      loader: 'sass-loader',
      options: {
       sourceMap: true
      }
     }
    ]
   },
   {
    test: /\.(png|jp(e*)g|svg|gif)$/,
    use: [
     {
      loader: 'url-loader',
      options: {
       limit: 8000,
       sourceMap: true
      }
     }
    ]
   },
   {
    test: /\.(ttf|eot|woff|woff2)$/,
    use: {
     loader: 'file-loader',
     options: {
      name: 'fonts/[name].[ext]',
      sourceMap: true
     }
    }
   },
   {
    test: /\.(glb|gltf)$/,
    use: [
     {
      loader: 'file-loader'
      // options: {
      //  outputPath: 'assets/models'
      // }
     }
    ]
   },
   {
    test: /\.(bin)$/,
    use: [
     {
      loader: 'file-loader'
     }
    ]
   }
  ]
 },
 resolve: {
  extensions: ['.ts', '.tsx', '.js', '.jsx', '.json'],
  modules: ['node_modules', path.resolve(__dirname, 'src')],
  alias: {
   TweenLite: 'gsap',
   CSSPlugin: 'gsap',
   Draggable: path.join(root, gsapPath + 'utils/Draggable.js'),
   ScrollToPlugin: path.join(root, gsapPath + 'plugins/ScrollToPlugin.js')
  }
 },
 devServer: {
  historyApiFallback: true,
  contentBase: './dist',
  inline: true,
  host: 'localhost',
  port: 3000
 },
 plugins: [
  new CleanWebpackPlugin({ verbose: true }),
  new HtmlWebpackPlugin({
   template: path.join(__dirname, 'src', 'index.html')
  }),
  new webpack.ProvidePlugin({
   TweenMax: 'gsap'
  }),
  new CopyWebpackPlugin({
   patterns: [{ from: 'src/assets' }]
  })
 ]
};

我的 webpack.config.js 文件位于项目的根目录中。 Assets 文件夹位于 src 文件夹中。最后,带有 React 代码的文件位于 src/components/ThreeDimensionComponent/ThreeDimensionComponent.tsx 中(因此它的路径是正确的)。

最佳答案

您要么需要导入模型并使用从中获得的 url (url-loader),要么将其放入公共(public)文件夹中。您的路径在捆绑输出中无处指向。

还有一件事,它是@react-three/drei 和 useGLTF(url)。

关于reactjs - React 中的 Webpack 无法加载带有 GLTF 扩展的 3D 模型,显示 404 not found,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64526248/

相关文章:

javascript - 使用 setAttribute 添加自定义外观控制

node.js - 如何让我的前端应用程序访问我的 Node 服务器 api

asp.net - 使用 asp.net core visual studio react 模板部署 Next JS 项目

Reactjs Onclick事件,向父级发送值

vue.js - 获取 : ERR_SSL_PROTOCOL_ERROR nginx + vue. js

javascript - angular2-template-loader:错误:无法在\@angular\compiler\src 中解析 './'

three.js - 将 Tone.js 与 Three.js 一起使用 - 如何获得定位音频?

javascript - 如何从被 GLSL 着色器置换的 Three.js 几何体中导出 OBJ?

javascript - 在react中多次使用排序函数

javascript - 找不到模块无法解析