Three.js中文网 Three.js中文网
首页
免费视频
系统课 (opens new window)
  • Three.js基础课程
  • Vue3+Threejs 3D可视化
  • Threejs进阶课程
  • 展厅3D预览漫游
  • Threejs Shader
  • Blender建模基础
  • Three.js基础课程(旧版本) (opens new window)
  • 文章
WebGPU教程
  • WebGL教程
  • WebGL教程(旧版本) (opens new window)
3D案例
  • 本站部署(打开快) (opens new window)
  • 原英文官网文档 (opens new window)
首页
免费视频
系统课 (opens new window)
  • Three.js基础课程
  • Vue3+Threejs 3D可视化
  • Threejs进阶课程
  • 展厅3D预览漫游
  • Threejs Shader
  • Blender建模基础
  • Three.js基础课程(旧版本) (opens new window)
  • 文章
WebGPU教程
  • WebGL教程
  • WebGL教程(旧版本) (opens new window)
3D案例
  • 本站部署(打开快) (opens new window)
  • 原英文官网文档 (opens new window)
Web3D系统课程视频
  • 0.学前说明

  • 1.Three.js快速入门

  • 2.几何体BufferGeometry

  • 3.模型对象、材质

  • 4.层级模型

  • 5.顶点UV坐标、纹理贴图

  • 6.加载外部三维模型(gltf)

  • 7.PBR材质与纹理贴图

  • 8.渲染器和前端UI界面

  • 9.生成曲线、几何体

  • 10.相机基础

  • 11.光源和阴影

  • 12.精灵模型Sprite

  • 13.后处理EffectComposer

  • 14.射线拾取模型

  • 15.场景标注标签信息

    • 1. CSS2DRenderer(HTML标签)
    • 2. HTML标签遮挡Canvas画布事件
    • 3. Canvas尺寸变化(HTML标签)
    • 4. 标签位置不同设置方式
      • 5. 标签位置(标注工厂设备)
      • 6. 标签指示线或箭头指向标注点
      • 7. 鼠标选中模型弹出标签(工厂)
      • 8. 单击按钮关闭HTML标签
      • 9. CSS3DRenderer渲染HTML标签
      • 10. CSS3批量标注多个标签
      • 11. 精灵模型Sprite作为标签
      • 12. Sprite标签(Canvas作为贴图)
    • 16.关键帧动画

    • 17.动画库tween.js

    • Three.js教程
    • 15.场景标注标签信息
    郭隆邦
    2023-03-13
    目录

    4. 标签位置不同设置方式

    # 标签位置不同设置方式

    前面给大家讲解过,你想把HTML元素标签标注在三维场景中哪个位置,可以设置HTML标签对应的CSS2模型对象CSS2DObject位置属性.position。

    CSS2模型标签对象位置和要标注的Mesh放在同一个位置,这样HTML标签就可以标注Mesh。

    mesh.position.set(50,0,50);
    
    // HTML元素转化为threejs的CSS2模型对象
    const tag = new CSS2DObject(div);
    tag.position.set(50,0,50);
    
    group.add(mesh,tag);
    

    在学习本节课之前,最好把章节4关于层级模型知识的讲解回顾一下。

    # mesh增加一个父对象,查看标签变化

    mesh增加一个父对象,且设置父对象的位置坐标,然后查看标签变化。

    mesh.position.set(50,0,50);
    // mesh设置一个父对象meshGroup
    const meshGroup = new THREE.Group();
    meshGroup.add(mesh);
    // mesh位置受到父对象局部坐标.positionn影响
    meshGroup.position.x = -100;
    

    如果需要的mesh有多个父对象,且都有自己的位置属性.position,设置mesh标签对象位置CSS2DObject.position的时候,就需要考虑mesh父对象的位置对mesh的影响。

    // tag.position.set(50,0,50);
    tag.position.set(-50,0,50);
    

    # .getWorldPosition()方法计算世界坐标

    前面4.3节. 本地坐标和世界坐标 (opens new window)内容讲解过,通过.getWorldPosition()方法可以获取一个模型的世界坐标。

    mesh.position.set(50,0,50);
    // mesh设置一个父对象meshGroup
    const meshGroup = new THREE.Group();
    meshGroup.add(mesh);
    // mesh位置受到父对象局部坐标.positionn影响
    meshGroup.position.x = -100;
    
    const tag = new CSS2DObject(div);
    const worldPosition = new THREE.Vector3();
    // 获取mesh的世界坐标(meshGroup.position和mesh.position累加结果)
    mesh.getWorldPosition(worldPosition);
    // mesh世界坐标复制给tag
    tag.position.copy(worldPosition);
    
    const group = new THREE.Group();
    // 最后meshGroup和tag放在同一个父对象中即可
    group.add(meshGroup,tag);
    

    # CSS2模型对象作为Mesh子对象

    无论mesh有多少个父对象,CSS2模型对象作为Mesh子对象,可以直接继承mesh的世界坐标,相比通过.getWorldPosition()方法获取世界坐标,再设置标签模型位置CSS2DObject.position更方便。

    // HTML元素转化为threejs的CSS2模型对象
    const tag = new CSS2DObject(div);
    //标签tag作为mesh子对象,默认受到父对象位置影响
    mesh.add(tag);
    

    # 标注模型几何体的某个顶点

    标签模型对象作为需要标注mesh的子对象,然后获取mesh几何体某个顶点的坐标,作为标签模型对象局部坐标.position。

    // HTML元素转化为threejs的CSS2模型对象
    const tag = new CSS2DObject(div);
    //标签tag作为mesh子对象,默认受到父对象位置影响
    mesh.add(tag);
    
    const pos = geometry.attributes.position;
    // 获取几何体顶点1的xyz坐标,设置标签局部坐标.position属性
    tag.position.set(pos.getX(0),pos.getY(0),pos.getZ(0));
    

    # 标注圆锥顶部(了解局部坐标系原点)

    圆锥几何体局部坐标系默认位于自己高度一半位置。

    const geometry = new THREE.ConeGeometry(25, 80);
    const mesh = new THREE.Mesh(geometry, material);
    // 可视化模型的局部坐标系
    const axesHelper = new THREE.AxesHelper(100);
    mesh.add(axesHelper);
    

    一个模型对象,不管是一个mesh,还是多个mesh组成的模型,本身是有尺寸的,如果你把标签模型对象CSS2DObject作为该模型对象的子元素,标签默认是标注在模型的局部坐标系坐标原点。

    const div = document.getElementById('tag');
    // HTML元素转化为threejs的CSS2模型对象
    const tag = new CSS2DObject(div);
    //标签tag作为mesh子对象,默认受到父对象位置影响
    mesh.add(tag);
    

    平移改变圆锥几何体顶点坐标,圆锥mesh的局部坐标系相对自身发生改变,位于圆锥底部,标签想标注在顶部,除了标签作为圆锥mesh子对象,还需要向上平移圆锥Mesh的高度尺寸。

    //y轴正方向,平移高度一半
    geometry.translate(0, 40, 0); 
    //圆锥mesh局部坐标系原点在自己底部时候,标签需要向上偏移圆锥自身高度
    tag.position.y += 80; 
    

    沿着y方向平移-40,改变圆锥几何体顶点坐标,圆锥mesh的局部坐标系坐标原点此刻位于圆锥顶部,这样标签刚好标注在顶部。

    //y轴负方向,平移高度一半,标签刚好标注在顶部
    geometry.translate(0,-40,0);
    
    3. Canvas尺寸变化(HTML标签)
    5. 标签位置(标注工厂设备)

    ← 3. Canvas尺寸变化(HTML标签) 5. 标签位置(标注工厂设备)→

    Theme by Vdoing | Copyright © 2016-2025 豫ICP备16004767号-2
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式