threeUtils.js 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. import * as THREE from 'three';
  2. import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls';
  3. import { ArrowHelper } from 'three';
  4. // 初始化场景
  5. export function initScene() {
  6. const scene = new THREE.Scene();
  7. scene.background = new THREE.Color(230 / 255, 231 / 255, 233 / 255); // 设置背景颜色
  8. return scene;
  9. }
  10. // 初始化相机
  11. export function initCamera() {
  12. const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
  13. camera.position.set(100, 100, 300); // 调整相机位置
  14. camera.lookAt(0, 0, 0); // 让相机看向点数据的中心
  15. return camera;
  16. }
  17. // 初始化渲染器
  18. export function initRenderer(container) {
  19. const renderer = new THREE.WebGLRenderer({ antialias: true }); // 可选:启用抗锯齿
  20. console.log("container.clientWidth",container.clientWidth)
  21. const width = container.clientWidth || 775; // 获取容器的宽度
  22. const height = container.clientHeight || 410; // 获取容器的高度
  23. renderer.setSize(width, height); // 根据容器尺寸设置渲染器大小
  24. container.appendChild(renderer.domElement); // 将渲染器的 DOM 元素添加到容器中
  25. return renderer;
  26. }
  27. // 初始化轨道控制器
  28. export function initControls(camera, renderer) {
  29. const controls = new OrbitControls(camera, renderer.domElement);
  30. controls.enableDamping = true; // 启用阻尼效果,使操作更平滑
  31. controls.dampingFactor = 0.05; // 阻尼系数
  32. controls.screenSpacePanning = true; // 允许平移
  33. controls.minDistance = 10; // 最小缩放距离
  34. controls.maxDistance = 8000; // 最大缩放距离
  35. return controls;
  36. }
  37. // 创建坐标轴指示器
  38. export function createAxesHelper(scene) {
  39. const axisLength = 50; // 坐标轴长度
  40. const headLength = 15; // 箭头头部长度
  41. const headWidth = 8; // 箭头头部宽度
  42. const origin = new THREE.Vector3(0, 0, 0); // 原点
  43. // X 轴(红色)
  44. const xAxis = new ArrowHelper(
  45. new THREE.Vector3(1, 0, 0), // 方向
  46. origin, // 起点
  47. axisLength, // 长度
  48. 0xff0000, // 颜色(红色)
  49. headLength,
  50. headWidth
  51. );
  52. // Y 轴(绿色)
  53. const yAxis = new ArrowHelper(
  54. new THREE.Vector3(0, 1, 0), // 方向
  55. origin, // 起点
  56. axisLength, // 长度
  57. 0x00ff00, // 颜色(绿色)
  58. headLength,
  59. headWidth
  60. );
  61. // Z 轴(蓝色)
  62. const zAxis = new ArrowHelper(
  63. new THREE.Vector3(0, 0, 1), // 方向
  64. origin, // 起点
  65. axisLength, // 长度
  66. 0x0000ff, // 颜色(蓝色)
  67. headLength,
  68. headWidth
  69. );
  70. // 将坐标轴添加到场景中
  71. scene.add(xAxis);
  72. scene.add(yAxis);
  73. scene.add(zAxis);
  74. }
  75. // 动画循环
  76. export const animateScene = (scene, camera, renderer, controls) => {
  77. const animate = () => {
  78. requestAnimationFrame(animate);
  79. controls.update(); // 更新控制器
  80. renderer.render(scene, camera);
  81. };
  82. animate();
  83. };
  84. // 清理场景
  85. export const cleanupScene = (renderer) => {
  86. if (renderer) {
  87. renderer.dispose();
  88. }
  89. };