three.js中Sprite标签和3D标签的位置会产生与坐标位置等比例的偏移

422 阅读1分钟

一、问题描述:

three.js中使用Sprite标签和3d标签进行物体标注时发现标签的实际位置与position值没有对应起来,而是发生了等比例的偏移。如下图:

标签的position与三角锥的值一样,但是位置发生了偏移。

二、解决:

给标签的position添加一个缩放,label.position.multiplyScalar(0.65);完整代码如下:

// // 创建一个3dSprite标签
function tag3DSprite(name: string, position: THREE.Vector3) {
  // 创建div元素(作为标签)
  const div = document.createElement('div');
  div.innerHTML = name;
  div.classList.add('tag');
  //div元素包装为CSS3模型对象CSS3DSprite
  const label = new CSS3DSprite(div);
  div.style.pointerEvents = 'none'; //避免HTML标签遮挡三维场景的鼠标事件
  //缩放CSS3DSprite模型对象
  label.scale.set(0.65, 0.65, 0.65); //根据相机渲染范围控制HTML 3D标签尺寸
  label.rotateY(Math.PI / 2); //控制HTML标签CSS3对象姿态角度

  const geometryHelper = new THREE.ConeGeometry(8, 20, 3);
  geometryHelper.translate(0, -20, 0);
  geometryHelper.rotateX(Math.PI + 0.2);
  const helper = new THREE.Mesh(
    geometryHelper,
    new THREE.MeshNormalMaterial({
      transparent: false, // 不透明的渲染对象在透明的对象前渲染
      depthWrite: false,
      depthTest: false, // 渲染时不会关心物体的前后,会进行混合, 减少重叠检查,节省性能。
    }),
  );
  const group = new THREE.Group();
  label.position.set(position.x, position.y + 60, position.z);
  label.position.multiplyScalar(0.65);
  helper.position.set(position.x, position.y, position.z);
  group.add(label); //标签插入场景
  group.add(helper);

  return group; //返回CSS3模型标签
}

完成效果如下: