12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273 |
- // src/utils/three/controls/orbitControls.js
- import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls.js';
- /**
- * 设置轨道控制器
- * @param {THREE.Camera} camera - 相机实例
- * @param {HTMLElement} domElement - 渲染器的DOM元素
- * @param {Object} [config={}] - 控制器配置
- * @returns {OrbitControls} 轨道控制器实例
- */
- export const setupControls = (camera, domElement, config = {}) => {
- const controls = new OrbitControls(camera, domElement);
-
- // 默认配置
- const defaultConfig = {
- enableDamping: true,
- dampingFactor: 0.05,
- minDistance: 1,
- maxDistance: 100,
- maxPolarAngle: Math.PI,
- minPolarAngle: 0,
- enablePan: true,
- enableZoom: true,
- enableRotate: true
- };
-
- // 合并配置
- const mergedConfig = { ...defaultConfig, ...config };
-
- // 应用配置
- Object.keys(mergedConfig).forEach(key => {
- if (controls[key] !== undefined) {
- controls[key] = mergedConfig[key];
- }
- });
-
- // 禁用右键菜单
- domElement.addEventListener('contextmenu', (e) => e.preventDefault());
-
- return controls;
- };
- /**
- * 更新控制器配置
- * @param {OrbitControls} controls - 轨道控制器实例
- * @param {Object} config - 新配置
- */
- export const updateControls = (controls, config) => {
- if (!controls) return;
-
- Object.keys(config).forEach(key => {
- if (controls[key] !== undefined) {
- controls[key] = config[key];
- }
- });
- };
- /**
- * 销毁控制器
- * @param {OrbitControls} controls - 轨道控制器实例
- */
- export const disposeControls = (controls) => {
- if (controls) {
- controls.dispose();
- }
- };
- // 统一导出
- export default {
- setupControls,
- updateControls,
- disposeControls
- };
|