three之文字標簽添加


three之文字標簽添加

原理:

使用CSS2DRenderer將html標簽繪制到three的畫布中,放置在指定位置。

主要代碼:

addLabel.js文件:(使用mixins引入主vue文件)

import * as THREE from "three";
import {
    CSS2DRenderer,
    CSS2DObject,
  } from "three/examples/jsm/renderers/CSS2DRenderer";
export default {
    data() {
        return {
            labelRenderer:new CSS2DRenderer(),
            labelGroup: new THREE.Group()
        }
    },
    methods: {
        // 渲染機櫃標簽
        addLabel(parame){
            // let parame = {
            //     position:{
            //         x: 176,
            //         y:135,
            //         z:1.7
            //     },
            //     text: "測試機櫃"
            // }
            if(!(parame&&parame.position&&parame.text)){
                return
            }
            this.renderLabel(parame.position,parame.text)
        },
        // 創建標簽dom
        renderLabel(position,text) {
            console.log(position)
            const domDiv = document.createElement( 'div' );
            domDiv.className = 'label';
            domDiv.textContent = text;
            const textLabel = new CSS2DObject( domDiv );
            textLabel.position.set( position.x *15, ( position.y *1.8*2) * Math.sqrt(15)+1, position.z*15);
            this.labelGroup.add(textLabel)
            this.addLabelWrap()
        },
        // 將標簽dom添加到
        addLabelWrap(){
            var node = document.querySelector('.labelWrap');
            if(node){
                return
            }
            var labelRenderer = this.labelRenderer;
            labelRenderer.setSize(this.width, this.height );
            labelRenderer.domElement.className = 'labelWrap';
            labelRenderer.domElement.style.position = 'absolute';
            labelRenderer.domElement.style.top = 0
            document.querySelector('.games').appendChild(this.labelRenderer.domElement);
        },
        // 清空標簽
        clearLabel(){
            var node = document.querySelector('.labelWrap');
            if(node){
                node.remove()
                this.labelGroup.children = []
                this.labelRenderer.domElement.innerHTML =''
            }
        },
    }
}

主文件:

<div class="games" id="games">
        <!-- three場景 -->
        <div id="container"></div>
</div>

  

// 渲染機櫃標簽
this.labelGroup = new THREE.Group();
this.scene.add(this.labelGroup)
// this.rackList為數據數組   [{x:0,y:0,z:0,name:"文字內容"}]
this.rackList.forEach(item => {
    this.addLabel({position:{x:item.x,y:item.y,z:item.z},text:item.name})
})

  

.labelWrap {
  pointer-events: none;
  z-index: 2;
}

.labelWrap .label {
  color: #fff;
  font-family: sans-serif;
  font-size: 16px;
  padding: 5px 9px 14px 9px;
  background: url("/img/label.png") no-repeat;
  text-align: center;
  background-size: 100% 100%;
}

圖片文件:

 

 

 

鑽研不易,轉載請注明出處。。。。。。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM