当前位置: 首页 > 知识库问答 >
问题:

使用相同的GLTF模型两次在反应-三纤维/德瑞/Three.js

齐振
2023-03-14

在这个最小反应三光纤应用程序中,我尝试加载并包含相同的GLTF型号两次:

import React, { Suspense } from "react";
import { Canvas } from "@react-three/fiber";
import { useGLTF } from "@react-three/drei";

function MyContent() {
  const firstGltf = useGLTF("/eye/scene.gltf");
  const secondGltf = useGLTF("/eye/scene.gltf");

  return (
    <>
      <primitive object={firstGltf.scene} position={[-200, 0, -400]} />
      <primitive object={secondGltf.scene} position={[200, 0, -400]} />
    </>
  );
}

export default function App() {
  return (
    <Canvas>
      <ambientLight color="white" intensity={0.5} />

      <Suspense fallback={null}>
        <MyContent />
      </Suspense>
    </Canvas>
  );
}

看到这个代码沙盒了吗

然而只有第二个

(是不是因为对useGLTF的第二次调用记住了“/eye/scene.gltf”已经加载并返回了同一个对象?这是不是把

特别是,这是我想要实现的:

  • 在我的画布上多次使用gltf模型

除此之外,也许你还可以帮我澄清这些问题,让我更好地理解这里到底发生了什么:

  • 因为我只想要一个3D模型,这是使用gltf的正确方法吗。场景对象

非常感谢。


共有1个答案

张可人
2023-03-14

我不是3方面的专家。js,根据我的发现并尝试回答您的问题。

1.即使定义了2个基本体,也只显示一只眼睛

如果使用useGLTF()导入相同的模型,它将引用相同的对象。因此,2个基元指向同一个gltf,并且只应用了最后/一个配置。

const firstGltf = useGLTF("/eye/scene.gltf");
const secondGltf = useGLTF("/eye/scene.gltf");
const glassesGltf = useGLTF("/glasses/scene.gltf");

// for demonstrating first eye is same as second eye
// Output: false, true
console.log(firstGltf === glassesGltf, firstGltf === secondGltf);

2.是<代码>

是的。但是,如果要在屏幕上多次显示相同的gltf,则需要创建网格并应用模型的几何体和材质,以便可以拥有一个新对象。

function Model(props) {
  const { nodes, materials } = useGLTF("/eye/scene.gltf");
  return (
    <group
      {...props}
      dispose={null}
      rotation={[Math.PI, 0, -Math.PI / 2]}
      scale={[1, 1, 1]}
    >
      <mesh
        geometry={nodes.Sphere001_Eye_0.geometry}
        material={materials.material}
      />
    </group>
  );
}
...
<Model position={[-1, 0, 1]} />
<Model position={[1, 0, 1]} />

这里是代码和演示框

FYR:

您可以使用这个库https://github.com/pmndrs/gltfjsx从模型生成jsx。

 类似资料:
  • 我试图在一个简单的react三纤维场景中动态更改“.gltf”模型的纹理贴图值。如果我理解正确,您必须在材质上添加纹理文件,然后将材质添加到模型中?在我的场景中,纹理文件被烘焙到“.gltf”文件中。我想用jsx更改alphaMap的不透明度等值。 这是我的沙箱:https://codesandbox.io/s/patient-framework-3holn?file=/src/App.js 我知

  • 我已成功地将gltf对象加载到我的react three fiber场景中。现在,我想将材质附着到模型。在这个模型上可以使用标准材料吗?以下是我尝试过的: 常量形状=(道具)=

  • 我正在使用React Three Fiber和“Drei”,并想使用广告牌。但我只知道如何改变广告牌的颜色,而不知道如何添加纹理。 我试过这样做,但在广告牌上找不到任何文档,也不知道我能传递什么样的论点。 在这里,您可以看到如何更改颜色,但不能看到如何添加纹理: https://drei.react-spring.io/?path=/story/abstractions-布告牌——布告牌街 希望有

  • 我只是想在反应3纤维中的一个简单场景中添加一个具有扩散和凹凸纹理的模型。 我真的不知道我做错了什么。 这里是沙箱:https://codesandbox.io/s/three-point-lighting-in-react-three-fiber-forked-qeqlx?file=/src/index.js 该模型是一个GLTF moon,具有烘焙的纹理。月球只是一个球体,但我想使用GLTF模型

  • 我试图加载反应三光纤(R3F)的gltf模型,我做了一个噩梦。我试着寻找答案,也有人有类似的问题,但我无法解决我的问题。 我一直在控制台中看到: 据我所知,我的代码没有问题。我试着用多种不同的方式在模型中加载它。几天前,react three Fibre的创建者将一个模型中装载的光纤与他的codesandbox连接起来,如下所示:https://codesandbox.io/s/r3f-gltf-

  • 我从一个网站下载了一组文件,并在blender中导出了glb、gltf和mtl文件。我可以让glb或gltf文件显示在反应三纤维场景,但我不知道如何让纹理显示正确。我遇到了几个演示,但它们看起来很旧,什么不起作用。 下面是我如何加载文件。