【问题标题】:Loading gltf in gatsby site with react-three-fiber使用 react-three-fiber 在 gatsby 站点加载 gltf
【发布时间】:2020-11-09 03:18:57
【问题描述】:

我一直在尝试使用 react-three-fiber 将 GLTF 模型加载到我的 gatsby 站点中,但似乎无法加载它。这看起来应该很简单,但我是 Gatsby 和 Threejs 的新手,想知道是否可以得到一些指导。

我的模型存储为 static/models/crerar.glb,我使用 gltfjsx 生成了一个模型组件。我试过只引用“models/crerar.glb”,但也没有运气。

在 index.js 中,我有:

import Layout from "../components/layout"
import SEO from "../components/seo"
import React, { Suspense, useRef, useState } from "react"
import { Canvas, useFrame, useLoader } from "react-three-fiber"
import Model from "../components/Crerar"

const IndexPage = () => (
<Layout>
  <Canvas>
    <ambientLight intensity={0.2} />
    <Model />
  </Canvas>
</Layout>
)

export default IndexPage

在 Crerar.js 中(存储在组件中)

/*
auto-generated by: https://github.com/react-spring/gltfjsx
*/

import * as THREE from 'three'
import React, { useRef } from 'react'
import { useLoader } from 'react-three-fiber'
import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader'

export default function Model(props) {
  const group = useRef()
  const { nodes, materials } = useLoader(GLTFLoader, '../static/models/crerar.glb')
  return (
    <group ref={group} {...props} dispose={null}>
      <mesh material={nodes.mesh_0.material} geometry={nodes.mesh_0.geometry} />
    </group>
  )
}

【问题讨论】:

  • 如果您在控制台中看到任何错误,您能分享一下吗?
  • 是的,我得到了一些 - 1)SyntaxError: JSON.parse: unexpected character at line 1 column 1 of the JSON data parse GLTFLoader.js:248 load GLTFLoader.js:155 load 三.module.js:36856 2) 未捕获的错误:模型在渲染时暂停,但未指定备用 UI。
  • 以及 - 组件出现上述错误:在 Canvas 中的 Model (at pages/index.js:65)
  • 您还应该提供您的gatbsy-config.js 文件,以查看您是否启用了静态文件加载器。

标签: reactjs three.js gatsby react-three-fiber


【解决方案1】:

gatsby 将所有内容从静态复制到公用文件夹中,因此将您的网址更改为:

const { nodes, materials } = useLoader(GLTFLoader, '/models/crerar.glb')

【讨论】:

    【解决方案2】:

    路径错误。您收到的 json.parse 错误是因为加载程序尝试将 HTML 404 提取错误解析为 GLTF。您可以通过打开开发工具和网络选项卡来确保。您应该看到它正在尝试访问您的文件,但无法访问。

    如果模型在您的 src 文件夹中,您必须先导入它,然后使用您获得的散列 URL。这是我的建议,不要乱用公共文件,总是导入你的东西。它更安全,如果文件不存在,编译器会报错,并且更好地用于缓存控制。

    否则,如果文件在 /public 中,或者我猜它是 gatsby 中的 /static(?),那么 url 必须类似于“/file.glb”。有时它是 /public/file.glb 或 /static/file.glb,这取决于您的捆绑环境(您可以尝试通过浏览器的 url 栏获取文件,如果 url 有效,那是您应该传递给加载程序的那个)。

    如果您的文件是 draco 压缩的,那么 draco 也必须在 public 或 static 中。见:https://codesandbox.io/s/r3f-ibl-envmap-simple-y541h

    您可以安全地使用 useLoader(GLTFLoader, url),它只是 new GLTFLoader().load(url, data =&gt; ...) + suspense 的包装。它不再是实验性的,尽管它可能在 Github 上有这个警告。

    【讨论】:

    • 嘿,感谢您的回答 - 我认为我现在传递了正确的 url,但是当我尝试导入模型(它不是 draco 压缩的)时,我在构建站点:错误 #98123 WEBPACK 生成开发 JavaScript 包失败意外字符 '' (1:4) 文件:src/models/crerar.glb:1:4 我该如何解决这个问题?
    • 像 CRA 这样的捆绑软件被配置为为您导入的未知扩展返回一个 url,您可能会丢失加载器语句,例如当您将“*.glb”绑定到 url-loader 时。在捆绑环境中很难找到正确的路径,也许尝试再次获取 /public 以使其至少工作,然后您可以返回导入。
    • 你有没有想过这个问题?
    猜你喜欢
    • 2021-04-16
    • 2021-11-12
    • 2021-12-08
    • 2021-08-20
    • 2021-05-22
    • 2021-04-05
    • 2021-05-22
    • 1970-01-01
    • 2021-07-13
    相关资源
    最近更新 更多