From 9fce7ce7b76b859c5b70cc622d885cd9d6c1579f Mon Sep 17 00:00:00 2001 From: luxiaotao1123 <t1341870251@163.com> Date: 星期二, 23 四月 2024 10:58:30 +0800 Subject: [PATCH] # --- src/components/agv.jsx | 92 +++++++++++++++++++++++++++++---------------- 1 files changed, 59 insertions(+), 33 deletions(-) diff --git a/src/components/agv.jsx b/src/components/agv.jsx index 2bce4f7..ebe1451 100644 --- a/src/components/agv.jsx +++ b/src/components/agv.jsx @@ -3,42 +3,67 @@ import { useFBX, useAnimations } from '@react-three/drei'; import * as THREE from 'three'; import Box from './box'; -import * as Common from '../utils/common' - -const setShadow = (obj) => { - obj.castShadow = true; - obj.receiveShadow = true; - - if (obj.children) { - obj.children.forEach((child) => { - setShadow(child); - }); - } -}; - -const setColor = (obj) => { - if (obj.material) { - obj.material.color.set(0x4680BF); - } - if (obj.children) { - obj.children.forEach((child) => { - setColor(child); - }); - } -}; +import * as Common from '../utils/common'; +import * as TWEEN from "@tweenjs/tween.js"; +import { INTERVAL_TIME } from '@/config/setting' const Agv = (props) => { - const { position, theta } = props; + const { position, theta, height, loaderTheta, forkLength, trayList, hasBox } = props; + + const [groupPos, setGroupPos] = useState({ x: 0, y: 0, z: 0 }); + const [groupTheta, setGroupTheta] = useState(0); useEffect(() => { - console.log(position); - console.log(theta); + if (!props || Object.keys(props).length === 0) { + return; + } + // group position + const pos = { + x: position?.[0], + y: position?.[1], + z: position?.[2], + } + if (!Common.deepEqual(groupPos, pos)) { + new TWEEN.Tween(groupPos) + .to({ + x: position[0], + y: position[1], + z: position[2] + }, INTERVAL_TIME) + .easing(TWEEN.Easing.Linear.None) + .onUpdate((e) => { + setGroupPos({ ...e }); + }) + .onComplete((e) => { + setGroupPos({ ...e }); + }).start(); + } + + // group theta + if (groupTheta !== theta) { + new TWEEN.Tween({ value: groupTheta }) + .to({ value: theta }, INTERVAL_TIME) + .easing(TWEEN.Easing.Linear.None) + .onUpdate((e) => { + setGroupTheta(e.value) + }) + .onComplete((e) => { + setGroupTheta(e.value) + }).start(); + } + + + }, [props]); + + useFrame((state, delta) => { + TWEEN.update(); + }) const bodyModel = useMemo(() => { const fbx = useFBX('/models/agv/body.fbx'); if (!fbx.castShadow) { - setShadow(fbx); + Common.setShadow(fbx); } return fbx.clone(); }, []) @@ -46,7 +71,7 @@ const loaderModel = useMemo(() => { const fbx = useFBX('/models/agv/loader.fbx'); if (!fbx.castShadow) { - setShadow(fbx); + Common.setShadow(fbx); } return fbx.clone(); }, []) @@ -54,17 +79,18 @@ const forkModel = useMemo(() => { const fbx = useFBX('/models/agv/fork.fbx'); if (!fbx.castShadow) { - setShadow(fbx); + Common.setShadow(fbx); } return fbx.clone(); }, []) - useEffect(() => { - }, []); - return ( <> - <group rotation-y={Common.rotationParseNum(theta)} scale={0.5} position={position}> + <group + rotation-y={Common.rotationParseNum(groupTheta)} + scale={0.5} + position={[groupPos.x, groupPos.y, groupPos.z]} + > <primitive object={bodyModel} castShadow /> <primitive object={loaderModel} castShadow position={[0, 100, 0]} /> <primitive object={forkModel} castShadow position={[0, 120, 0]} /> -- Gitblit v1.9.1