AIdentity

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README

BenchScene.tsx (1551B)


      1 'use client';
      2 
      3 import { useLoader } from '@react-three/fiber';
      4 import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js';
      5 import { Suspense } from 'react';
      6 import * as THREE from 'three'; // THREE.Mesh などのためにインポート
      7 
      8 // GLTFLoaderが返すオブジェクトの型を定義
      9 interface GLTFResult {
     10   scene: THREE.Group;
     11   // 他にもanimations, cameras, materials, nodesなどがありますが、ここではsceneのみ使用
     12 }
     13 
     14 // モデルの読み込みと表示を担当するコンポーネント
     15 const Model = ({ url }: { url: string }) => {
     16   // useLoaderの戻り値に型を適用
     17   const gltf = useLoader(GLTFLoader, url) as unknown as GLTFResult;
     18   
     19   // モデル全体に影の設定を有効化するためのトラバース処理
     20   gltf.scene.traverse((child) => {
     21     // childがTHREE.Meshであるかを型ガードでチェック
     22     if ((child as THREE.Mesh).isMesh) {
     23       const mesh = child as THREE.Mesh;
     24       mesh.castShadow = true;
     25       mesh.receiveShadow = true;
     26     }
     27   });
     28 
     29   // gltf.sceneはTHREE.Groupですが、primitiveで表示可能です
     30   return <primitive object={gltf.scene} scale={1} />; // スケールはモデルに合わせて調整
     31 };
     32 
     33 export default function BenchScene() {
     34   return (
     35     // モデルの読み込みが完了するまで、何も表示しない (必須)
     36     <Suspense fallback={null}>
     37       {/* 準備した3Dモデル (ベンチと草) を読み込み */}
     38       <Model url="/bench.glb" />
     39     </Suspense>
     40   );
     41 }