diff --git a/app/src/modules/simulation/machine/instances/machineInstance/machineInstance.tsx b/app/src/modules/simulation/machine/instances/machineInstance/machineInstance.tsx index efc1615..b3d4498 100644 --- a/app/src/modules/simulation/machine/instances/machineInstance/machineInstance.tsx +++ b/app/src/modules/simulation/machine/instances/machineInstance/machineInstance.tsx @@ -58,6 +58,7 @@ function MachineInstance({ machineDetail }: any) { return ( <> + ) } diff --git a/app/src/modules/simulation/vehicle/instances/animator/materialAnimator.tsx b/app/src/modules/simulation/vehicle/instances/animator/materialAnimator.tsx new file mode 100644 index 0000000..a2802a0 --- /dev/null +++ b/app/src/modules/simulation/vehicle/instances/animator/materialAnimator.tsx @@ -0,0 +1,43 @@ +import { useEffect, useRef, useState } from 'react'; +import { useThree, useFrame } from '@react-three/fiber'; +import * as THREE from 'three'; + +type MaterialAnimatorProps = { + agvDetail: VehicleStatus; +}; + +const MaterialAnimator = ({ agvDetail }: MaterialAnimatorProps) => { + const meshRef = useRef(null!); + const [hasLoad, setHasLoad] = useState(false); + const { scene } = useThree(); + const loadWorldPosition = new THREE.Vector3(); + const offset = new THREE.Vector3(0, 1.1, 0); + + useEffect(() => { + setHasLoad(agvDetail.currentLoad > 0); + }, [agvDetail]); + + useFrame(() => { + if (!hasLoad) return; + const agvModel = scene.getObjectByProperty("uuid", agvDetail.modelUuid) as THREE.Object3D; + if (agvModel && meshRef.current) { + loadWorldPosition.copy(offset).applyMatrix4(agvModel.matrixWorld); + meshRef.current.position.copy(loadWorldPosition); + meshRef.current.rotation.copy(agvModel.rotation); + } + }); + + + return ( + <> + {hasLoad && ( + + + + + )} + + ); +}; + +export default MaterialAnimator; diff --git a/app/src/modules/simulation/vehicle/instances/instance/vehicleInstance.tsx b/app/src/modules/simulation/vehicle/instances/instance/vehicleInstance.tsx index 412a4ba..5c92e66 100644 --- a/app/src/modules/simulation/vehicle/instances/instance/vehicleInstance.tsx +++ b/app/src/modules/simulation/vehicle/instances/instance/vehicleInstance.tsx @@ -5,6 +5,7 @@ import { NavMeshQuery } from '@recast-navigation/core'; import { useNavMesh } from '../../../../../store/store'; import { usePlayButtonStore } from '../../../../../store/usePlayButtonStore'; import { useVehicleStore } from '../../../../../store/simulation/useVehicleStore'; +import MaterialAnimator from '../animator/materialAnimator'; function VehicleInstance({ agvDetail }: any) { const { navMesh } = useNavMesh(); @@ -132,6 +133,7 @@ function VehicleInstance({ agvDetail }: any) { agvDetail={agvDetail} reset={reset} /> + ); }