/* * @Author: wuhao930406 1148547900@qq.com * @Date: 2023-08-03 11:31:00 * @LastEditors: wuhao930406 1148547900@qq.com * @LastEditTime: 2023-08-24 14:27:24 * @FilePath: /editor-plus/src/pages/components/GlftBlock/index.jsx * @Description: * * Copyright (c) 2023 by ${git_name_email}, All Rights Reserved. */ import { Gltf, OrbitControls, Stage } from "@react-three/drei"; import { Canvas, useThree } from "@react-three/fiber"; import { useTimeout } from "ahooks"; import { useEffect, useMemo, useRef, useState } from "react"; import "./index.less"; function Sphere({ position, CoordinatePoint, CurGongjianPoint }) { const meshRef = useRef(); const { camera } = useThree(); useEffect(() => { setTimeout(() => { camera.lookAt(0, 0, 0); // 设置相机指向原点 }, 200); }, [camera]); return ( <mesh ref={meshRef} scale={100} position={ position ? Object.values(position)?.map((it, i) => { return it; }) : [] } > <sphereGeometry attach="geometry" args={[0.1, 32, 32]} /> <meshPhysicalMaterial attach="material" color="red" /> </mesh> ); } const Model = ({ url, rotation, scale }) => { const [position, setPosition] = useState([0, 0, 0]); const rotations = useMemo(() => { return rotation.map((it, i) => { return i === 1 ? (it * (Math.PI / 180)) : it * (Math.PI / 180); }); }, [rotation]); return ( <Gltf src={url} receiveShadow castShadow position={position} rotation={rotations} scale={scale * 1000} inject={ <meshPhysicalMaterial color="white" metalness={1} // 控制金属感,1 表示完全金属 roughness={0} // 控制光滑度,0 表示非常光滑 /> } /> ); }; function PointViewer({ position, CoordinatePoint, CurGongjianPoint, CurGongjianData, }) { const [url, seturl] = useState(null); useTimeout(() => { seturl(`./glb/${CurGongjianData.ModelPath}.glb`); }, 100); return ( <div className="bar-block-component"> {CurGongjianPoint && ( <Canvas shadows dpr={[1, 1.5]} camera={{ position: [8, 8, 16] }} gl={{ antialias: true }} style={{ height: "100%", width: "100%" }} id={"rrt"} > <color attach="background" args={["#333"]} /> <Stage intensity={0.5} preset="rembrandt" shadows={"contact"} adjustCamera={1} environment={{ path: "/", files: "env.hdr", }} > <OrbitControls target={[0, 0, 0]}></OrbitControls> <axesHelper args={[400]} position={[0, 0, 0]}></axesHelper> {url && ( <Model url={url} rotation={CurGongjianData?.LocalRotation} scale={ CurGongjianData.ScalingRatio ? parseInt(CurGongjianData.ScalingRatio) : 1 } ></Model> )} <Sphere position={position} CoordinatePoint={CoordinatePoint} CurGongjianPoint={CurGongjianPoint} ></Sphere> </Stage> </Canvas> )} </div> ); } export default PointViewer;