Loading-Models
Loading Models
有许多类型的3D模型文件类型,在这个页面上,我们将专注于加载三种最常见的类型:
- GLTF
- FBX
- OBJ
所有这些扩展名的文件都将使用useLoader函数,但使用略有不同。
整个部分都假定已经将模型放置在public文件夹中或在应用程序中可以轻松导入它们的地方。
Loading GLTF models
从开放标准和在React Three Fiber中支持性最好以及最推荐的文件类型开始,我们将加载一个.gltf模型。
我们可以先引入两个我们需要的模块:
import { useLoader } from '@react-three/fiber'
import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader'
通过这两个模块,我们可以加载并创建一个模型组件然后放到我们的场景组件中:
function Scene() {
const gltf = useLoader(GLTFLoader, '/Poimandres.gltf')
return <primitive object={gltf.scene} />
}
你可以点击下面这个图片查看codesandbox来看看我给它添加了HDRI背景后的效果:
Loading GLTF models as JSX Components
把GLTF模型数据转换成JSX组件
这里是真正高端的部分,您可以将这些模型转换为React组件,然后像使用任何React组件一样使用它们。
要做到这一点,请获取您的GLTF模型并上传到https://gltf.pmnd.rs/,然后放置您的GLTF文件,之后您应该会看到类似以下的东西:
现在让我们复制代码并将其移动到Model.js文件中:
/*
Auto-generated by: https://github.com/pmndrs/gltfjsx
*/
import React, { useRef } from 'react'
import { useGLTF } from '@react-three/drei'
export default function Model(props) {
const groupRef = useRef()
const { nodes, materials } = useGLTF('/Poimandres.gltf')
return (
<group ref={groupRef} {...props} dispose={null}>
<mesh castShadow receiveShadow geometry={nodes.Curve007_1.geometry} material={materials['Material.001']} />
<mesh castShadow receiveShadow geometry={nodes.Curve007_2.geometry} material={materials['Material.002']} />
</group>
)
}
useGLTF.preload('/Poimandres.gltf')
现在,我们可以像导入任何React组件一样导入我们的模型,并在应用程序中使用它:
import { Suspense } from 'react'
import { Canvas } from '@react-three/fiber'
import { Environment } from '@react-three/drei'
import Model from './Model'
export default function App() {
return (
<div className="App">
<Canvas>
<Suspense fallback={null}>
<Model />
<Environment preset="sunset" background />
</Suspense>
</Canvas>
</div>
)
}
Loading OBJ models
接下来,我们将使用useLoader,与three.js的OBJLoader结合使用
import { OBJLoader } from 'three/examples/jsm/loaders/OBJLoader'
import { useLoader } from '@react-three/fiber'
利用这些两个模块功能,我们来在场景中实现模型:
function Scene() {
const obj = useLoader(OBJLoader, '/Poimandres.obj')
return <primitive object={obj} />
}
这样我们就已经把一个 OBJ 格式的模型展现在我们的页面中了!酷~