7 простых способов загрузки моделей GLTF в React Three Fiber

React Three Fiber — популярная библиотека, которая позволяет разработчикам создавать 3D-сцены и анимацию в приложениях React, используя мощную библиотеку Three.js. Одной из распространенных задач при 3D-разработке является загрузка моделей GLTF, популярного формата файлов для 3D-моделей. В этой статье мы рассмотрим семь простых способов загрузки моделей GLTF в React Three Fiber, попутно предоставляя разговорные объяснения и примеры кода.

Метод 1: использование хука useLoader

Хук useLoader, предоставляемый React Three Fiber, упрощает процесс загрузки моделей GLTF. Вот пример того, как его использовать:

import { useLoader } from 'react-three-fiber';
import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader';
const MyModel = () => {
  const gltf = useLoader(GLTFLoader, '/path/to/model.gltf');
  return <primitive object={gltf.scene} />;
};

Метод 2. Импорт GLTLoader

Другой подход — напрямую импортировать GLTLoader и использовать его для загрузки модели:

import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader';
const MyModel = () => {
  const loader = new GLTFLoader();
  loader.load('/path/to/model.gltf', (gltf) => {
    // Use the loaded GLTF object here
  });
  return null;
};

Метод 3: использование пользовательского компонента загрузчика

Вы можете создать собственный компонент-загрузчик для обработки загрузки и рендеринга моделей GLTF:

import { useLoader } from 'react-three-fiber';
import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader';
const MyModelLoader = ({ url }) => {
  const gltf = useLoader(GLTFLoader, url);
  return <primitive object={gltf.scene} />;
};
const App = () => {
  return <MyModelLoader url="/path/to/model.gltf" />;
};

Метод 4. Предварительная загрузка моделей

Чтобы обеспечить плавную загрузку и избежать задержек, вы можете предварительно загрузить модель GLTF с помощью GLTLoader:

import { useEffect } from 'react';
import { useLoader } from 'react-three-fiber';
import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader';
const MyModel = () => {
  const gltf = useLoader(GLTFLoader, '/path/to/model.gltf');
  return <primitive object={gltf.scene} />;
};
const PreloadModel = () => {
  const loader = new GLTFLoader();
  useEffect(() => {
    loader.load('/path/to/model.gltf', () => {
      // Model is preloaded
    });
  }, []);
  return null;
};
const App = () => {
  return (
    <>
      <PreloadModel />
      <MyModel />
    </>
  );
};

Метод 5. Отложенная загрузка с приостановкой

React Suspense можно использовать для ленивой загрузки моделей GLTF, гарантируя, что модель загружается только при необходимости:

import { Suspense } from 'react';
import { useLoader } from 'react-three-fiber';
import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader';
const MyModel = () => {
  const gltf = useLoader(GLTFLoader, '/path/to/model.gltf');
  return <primitive object={gltf.scene} />;
};
const App = () => {
  return (
    <Suspense fallback={null}>
      <MyModel />
    </Suspense>
  );
};

Метод 6: загрузка нескольких моделей

Если вам нужно загрузить несколько моделей GLTF, вы можете использовать Promise.all, чтобы дождаться загрузки всех моделей перед рендерингом:

import { Suspense } from 'react';
import { useLoader } from 'react-three-fiber';
import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader';
const MyModel = ({ url }) => {
  const gltf = useLoader(GLTFLoader, url);
  return <primitive object={gltf.scene} />;
};
const App = () => {
  const modelUrls = ['/path/to/model1.gltf', '/path/to/model2.gltf'];
  const models = modelUrls.map((url) => (
    <MyModel key={url} url={url} />
  ));
  return (
    <Suspense fallback={null}>
      {models}
    </Suspense>
  );
};

Метод 7: использование расширений React Three Fiber