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 }