我正在使用@react-three/drei
构建一个带有3D动画的nextjs
应用程序。
我在public
文件夹下有一个gltf
文件,在desktop_pc
文件夹下称为scene. gltf
。
项目根目录下的路径为:/public/desktop_pc/scene.gltf
.
当将gltf
文件导入useGLTF
钩子时,我得到错误:
TypeError: Failed to parse URL from /desktop_pc/scene.gltf
Github Repository - nextjs &@react-three/drei - TypeError: Failed to parse URL
组件代码:
import { useGLTF } from "@react-three/drei";
import React from "react";
const Computers = () => {
const computer = useGLTF("/desktop_pc/scene.gltf");
return <div>Computers</div>;
};
export default Computers;
这些是我到目前为止的尝试(链接指向GitHub解决方案):
- 动态导入- https://github.com/ItayTur/Portfolio/tree/invalid-url-error-dynamic-solution
- 延迟导入- https://github.com/ItayTur/Portfolio/tree/invalid-url-error-lazy-solution
- 安装
Three
&three-stdlib
npm packages. - 指定组件到文件位置的确切路径。
- 在路径字符串的开头添加点。
解决方案:
- 下载
three
和react-three-fiber
包。 - 使用
@react-three/fiber
钩子:useLoader
.
-
不
useGLTF
@react-three/drei
- 用
Canvas
组件包裹GLTF
模型组件
import { Canvas } from "@react-three/fiber";
import { GLTFLoader } from "three/examples/jsm/loaders/GLTFLoader";
import { useLoader } from "@react-three/fiber";
const Computers = ({ isMobile = false }) => {
const gltf = useLoader(GLTFLoader, "/desktop_pc/scene.gltf");
return (
<group>
<primitive
scale={isMobile ? 0.7 : 0.75}
position={isMobile ? [0, -3, -2.2] : [0, -3.25, -1.5]}
rotation={[-0.01, -0.2, -0.1]}
object={gltf.scene}
/>
</group>
);
};
const ComputersCanvas = () => {
return (
<Canvas>
<Computers />
</Canvas>
);
};
export default ComputersCanvas;
- 作为其他组件使用
const Hero = () => {
return (
<section className={`relative w-full h-screen mx-auto`}
<ComputersCanvas />
</section>
);
};
export default Hero;
}
GitHub链接:
- 第一个工作提交
- 全公关