| | |
| | | import * as THREE from 'three'; |
| | | import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls.js'; |
| | | import { createDataReceiver } from '../utils/dataFetcher'; |
| | | |
| | | |
| | | const containerRef = ref<HTMLElement | null>(null); |
| | | let scene: THREE.Scene | null = null; |
| | | let camera: THREE.PerspectiveCamera | null = null; |
| | |
| | | |
| | | |
| | | |
| | | // 定时获取数据 |
| | | let dataTimer: number | null = null; |
| | | |
| | | onMounted(() => { |
| | | initScene(); |
| | | animate(); |
| | | |
| | | const receiveData = createDataReceiver( (forceData) => { |
| | | // createDataReceiver 现在直接注册回调并返回一个清理函数 |
| | | createDataReceiver((forceData) => { |
| | | updateVisualization(forceData); |
| | | }); |
| | | |
| | | // 每100ms获取一次数据 |
| | | dataTimer = window.setInterval(receiveData, 100); |
| | | }); // 传递 isSerialPortConnected 函数 |
| | | |
| | | // 监听窗口大小变化 |
| | | window.addEventListener('resize', handleResize); |
| | | }); |
| | | |
| | | onUnmounted(() => { |
| | | // 清理定时器和事件监听 |
| | | if (dataTimer !== null) { |
| | | clearInterval(dataTimer); |
| | | } |
| | | |
| | | |
| | | window.removeEventListener('resize', handleResize); |
| | | |