ThreeLabel.js 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. import * as THREE from 'three';
  2. // // 标注位置对应的模型对象obj
  3. // export function createSprite(obj, state) {
  4. // // 创建一个包裹模型的立方体对象
  5. // const box = new THREE.Box3().setFromObject(obj);
  6. // // 获取模型的尺寸信息
  7. // const size = box.getSize(new THREE.Vector3());
  8. // // 输出模型的宽度、高度和深度
  9. // const { x, y, z } = size;
  10. // const texLoader = new THREE.TextureLoader();
  11. // let texture = texLoader.load("/static/img/labelBg.png");
  12. // const spriteMaterial = new THREE.SpriteMaterial({
  13. // map: texture,
  14. // });
  15. // const sprite = new THREE.Sprite(spriteMaterial);
  16. // sprite.name = `${obj.name || "模型"}标记`;
  17. // // 控制精灵大小
  18. // sprite.scale.set(x + 10, y / 2, 1);
  19. // // sprite.position.y = 5 / 2; // 标签底部箭头和空对象标注点重合
  20. // obj.add(sprite); //tag会标注在空对象obj对应的位置
  21. // }
  22. import { CSS3DRenderer, CSS3DObject, CSS3DSprite } from 'three/examples/jsm/renderers/CSS3DRenderer.js';
  23. // 创建一个HTML标签
  24. function tag3D(name) {
  25. // 创建div元素(作为标签)
  26. var div = document.createElement('div');
  27. div.innerHTML = name;
  28. div.classList.add('tag');
  29. //div元素包装为CSS3模型对象CSS3DObject
  30. var label = new CSS3DObject(div);
  31. div.style.pointerEvents = 'none';//避免HTML标签遮挡三维场景的鼠标事件
  32. // 设置HTML元素标签在three.js世界坐标中位置
  33. // label.position.set(x, y, z);
  34. //缩放CSS3DObject模型对象
  35. label.scale.set(0.2, 0.2, 0.2);//根据相机渲染范围控制HTML 3D标签尺寸
  36. label.rotateY(Math.PI / 2);//控制HTML标签CSS3对象姿态角度
  37. // label.rotateX(-Math.PI/2);
  38. return label;//返回CSS3模型标签
  39. }
  40. // 创建一个HTML标签
  41. export function createSprite(obj) {
  42. // 创建一个包裹模型的立方体对象
  43. const box = new THREE.Box3().setFromObject(obj);
  44. // 获取模型的尺寸信息
  45. const size = box.getSize(new THREE.Vector3());
  46. // 输出模型的宽度、高度和深度
  47. const { x, y, z } = size;
  48. // 创建div元素(作为标签)
  49. var div = document.createElement('div');
  50. div.innerHTML = "风力发电机";
  51. div.classList.add('modelLabel');
  52. //div元素包装为CSS3模型对象CSS3DSprite
  53. var label = new CSS3DSprite(div);
  54. div.style.pointerEvents = 'none';//避免HTML标签遮挡三维场景的鼠标事件
  55. // 设置HTML元素标签在three.js世界坐标中位置
  56. label.position.set(x + x / 10, y / 2, z);
  57. //缩放CSS3DSprite模型对象
  58. label.scale.set(1, 1, 1);//根据相机渲染范围控制HTML 3D标签尺寸
  59. // label.rotateY(Math.PI / 2);//控制HTML标签CSS3对象姿态角度
  60. // label.rotateX(-Math.PI/2);
  61. label.name = `${obj.name || "模型"}标记`;
  62. label.userData.isLabelTag = true;
  63. console.log(1122, { x, y, z })
  64. obj.add(label);
  65. }
  66. // 创建一个CSS2渲染器CSS2DRenderer
  67. function labelRenderer(container) {
  68. var labelRenderer = new CSS3DRenderer();
  69. labelRenderer.setSize(container.offsetWidth, container.offsetHeight);
  70. labelRenderer.domElement.style.position = 'absolute';
  71. // 相对标签原位置位置偏移大小
  72. labelRenderer.domElement.style.top = '0px';
  73. labelRenderer.domElement.style.left = '0px';
  74. // //设置.pointerEvents=none,以免模型标签HTML元素遮挡鼠标选择场景模型
  75. labelRenderer.domElement.style.pointerEvents = 'none';
  76. container.appendChild(labelRenderer.domElement);
  77. return labelRenderer;
  78. }