App.jsx 1.2 KB

123456789101112131415161718192021222324252627282930313233
  1. import React, { Suspense, useEffect, useMemo, useRef ,useState} from 'react'
  2. import { Canvas, useThree } from '@react-three/fiber'
  3. import Scene from './scene'
  4. // 获取 URL 参数 src:完整模型链接 max:最大缩放比 min:最小缩放比
  5. function readParams() {
  6. const params = new URLSearchParams(window.location.search)
  7. const src = params.get('src') || ''
  8. const rawMin = Number(params.get('min'))
  9. const rawMax = Number(params.get('max'))
  10. const minZoom = Number.isFinite(rawMin) && rawMin > 0 ? rawMin : 1
  11. const maxZoom = Number.isFinite(rawMax) && rawMax > 0 ? rawMax : 4
  12. let zoomMin = Math.min(minZoom, maxZoom)
  13. const zoomMax = Math.max(minZoom, maxZoom)
  14. zoomMin = Math.max(1, zoomMin)
  15. const progressColor = params.get('progressColor')
  16. return { src, zoomMin, zoomMax, progressColor }
  17. }
  18. export default function App() {
  19. const { src, zoomMin, zoomMax, progressColor } = useMemo(readParams, [])
  20. return (
  21. <div style={{ width: '100vw', height: '100vh'}}>
  22. <Canvas
  23. dpr={[1, 2]}
  24. gl={{ antialias: true }}
  25. style={{ touchAction: 'none' }}
  26. >
  27. <Scene url={src} zoomMin={zoomMin} zoomMax={zoomMax} progressColor={progressColor} />
  28. </Canvas>
  29. </div>
  30. )
  31. }