| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293 |
- import * as THREE from 'three';
- // // 标注位置对应的模型对象obj
- // export function createSprite(obj, state) {
- // // 创建一个包裹模型的立方体对象
- // const box = new THREE.Box3().setFromObject(obj);
- // // 获取模型的尺寸信息
- // const size = box.getSize(new THREE.Vector3());
- // // 输出模型的宽度、高度和深度
- // const { x, y, z } = size;
- // const texLoader = new THREE.TextureLoader();
- // let texture = texLoader.load("/static/img/labelBg.png");
- // const spriteMaterial = new THREE.SpriteMaterial({
- // map: texture,
- // });
- // const sprite = new THREE.Sprite(spriteMaterial);
- // sprite.name = `${obj.name || "模型"}标记`;
- // // 控制精灵大小
- // sprite.scale.set(x + 10, y / 2, 1);
- // // sprite.position.y = 5 / 2; // 标签底部箭头和空对象标注点重合
- // obj.add(sprite); //tag会标注在空对象obj对应的位置
- // }
- import { CSS3DRenderer, CSS3DObject, CSS3DSprite } from 'three/examples/jsm/renderers/CSS3DRenderer.js';
- // 创建一个HTML标签
- function tag3D(name) {
- // 创建div元素(作为标签)
- var div = document.createElement('div');
- div.innerHTML = name;
- div.classList.add('tag');
- //div元素包装为CSS3模型对象CSS3DObject
- var label = new CSS3DObject(div);
- div.style.pointerEvents = 'none';//避免HTML标签遮挡三维场景的鼠标事件
- // 设置HTML元素标签在three.js世界坐标中位置
- // label.position.set(x, y, z);
- //缩放CSS3DObject模型对象
- label.scale.set(0.2, 0.2, 0.2);//根据相机渲染范围控制HTML 3D标签尺寸
- label.rotateY(Math.PI / 2);//控制HTML标签CSS3对象姿态角度
- // label.rotateX(-Math.PI/2);
- return label;//返回CSS3模型标签
- }
- // 创建一个HTML标签
- export function createSprite(obj) {
- // 创建一个包裹模型的立方体对象
- const box = new THREE.Box3().setFromObject(obj);
- // 获取模型的尺寸信息
- const size = box.getSize(new THREE.Vector3());
- // 输出模型的宽度、高度和深度
- const { x, y, z } = size;
- // 创建div元素(作为标签)
- var div = document.createElement('div');
- div.innerHTML = "风力发电机";
- div.classList.add('modelLabel');
- //div元素包装为CSS3模型对象CSS3DSprite
- var label = new CSS3DSprite(div);
- div.style.pointerEvents = 'none';//避免HTML标签遮挡三维场景的鼠标事件
- // 设置HTML元素标签在three.js世界坐标中位置
- label.position.set(x + x / 10, y / 2, z);
- //缩放CSS3DSprite模型对象
- label.scale.set(1, 1, 1);//根据相机渲染范围控制HTML 3D标签尺寸
- // label.rotateY(Math.PI / 2);//控制HTML标签CSS3对象姿态角度
- // label.rotateX(-Math.PI/2);
- label.name = `${obj.name || "模型"}标记`;
- label.userData.isLabelTag = true;
- console.log(1122, { x, y, z })
- obj.add(label);
- }
- // 创建一个CSS2渲染器CSS2DRenderer
- function labelRenderer(container) {
- var labelRenderer = new CSS3DRenderer();
- labelRenderer.setSize(container.offsetWidth, container.offsetHeight);
- labelRenderer.domElement.style.position = 'absolute';
- // 相对标签原位置位置偏移大小
- labelRenderer.domElement.style.top = '0px';
- labelRenderer.domElement.style.left = '0px';
- // //设置.pointerEvents=none,以免模型标签HTML元素遮挡鼠标选择场景模型
- labelRenderer.domElement.style.pointerEvents = 'none';
- container.appendChild(labelRenderer.domElement);
- return labelRenderer;
- }
|