vue项目用three.js机房展示

前言:
本人公司要求我制作机房展示,机房先由2D编辑并设置好机柜位置及机柜里面防火墙位置,做出2D展示,并在基础上制作3D展示,现在阶段功能研究制作完成,我发布的内容仅供互相学习参考,一切产生的后果与我无关。本人用的是vue

先上视频请添加图片描述

<template>
  <div class="sketchMenageBox">
    <div id="container" ref="container"></div>
    <div id="sketchTextBoxRef" class="sketchTextBox df-aj">
      <div class="sketText_css">{
  {sketchText}}</div>
    </div>
    <div id="sketchBoxBoardRef" class="sketchBoxBoard">
      <img src="./img/sketchbdbg.png" style='width:100;height:100%;' alt="">
      <img class="computer_Box" src="./img/jigui_img.png" alt="">
      <div class='computer_main'>
        <div class='computer_title'>{
  {sketchNameBoardName.boxNo}}</div>
        <div class='df-aj computer_content1'>
          <img src="./img/icon_rongliang.png" style='width:100;height:100%;' alt="">
          <div class='computer_name mgl-5'>机柜容量</div>
          <div class='df-aj mgl_10'>
            <span class='computer_text1'>{
  {sketchNameBoardName.equipNum}}</span>
            <span class='mgl_10 mgr_10'>/</span>
            <span class='computer_text3'>{
  {sketchNameBoardName.equipNumAll}}</span>
          </div>
        </div>
        <div class='df-aj computer_content2'>
          <img src="./img/icon_zhuangtai.png" style='width:100;height:100%;' alt="">
          <div class='computer_name mgl-5'>设备状态</div>
          <div class='df-aj mgl_10'>
            <span class='computer_text2'>{
  {sketchNameBoardName.typeError}}</span>
            <span class='mgl_10 mgr_10'>/</span>
            <span class='computer_text3'>{
  {sketchNameBoardName.typeAll}}</span>
          </div>
        </div>
      </div>
    </div>
    <div v-for="(item,index) in computerList" :key="index">
      <div v-if="item.boxInfo">
        <div v-for="item1 in item.boxInfo.devNoList" :key="item1.id" :ref="'sketchBoxServeRef'+item1.id" class="sketchBoxBoard">
          <img src="./img/sketchbdbg.png" style='width:100;height:100%;' alt="">
          <div class='serve_box'>
            <div class='df'>
              <div>
                <div>
                  <div class='serve_title df-aj'>设备名称</div>
                  <div class='serve_main df-aj'>{
  {item1.productShowName.substr(item1.productShowName.indexOf('【'), item1.productShowName.indexOf('】'))}}</div>
                </div>
                <div>
                  <div class='serve_title df-aj'>设备类型</div>
                  <div class='serve_main df-aj'>{
  {item1.productShowName.substr(0, item1.productShowName.indexOf('【'))}}</div>
                </div>
              </div>
              <div>
                <div>
                  <div class='serve_title df-aj'>位置</div>
                  <div class='serve_main df-aj'>{
  {item1.startLine + '~' + (+item1.startLine + +item1.capacity - 1) + ' (U)'}}</div>
                </div>
                <div>
                  <div class='serve_title df-aj'>IP</div>
                  <div class='serve_main df-aj'>{
  {sketchNameServeName.typeName4}}</div>
                </div>
              </div>
              <div>
                <div>
                  <div class='serve_title df-aj'>状态</div>
                  <div class='serve_main df-aj'>{
  {item1.errorTroubleLight ? '正常' : '故障'}}</div>
                </div>
              </div>
            </div>
          </div>
        </div>
      </div>
    </div>
    <div v-for="item in computerList" :key="item.id" :ref="'sketchBoxBG'+item.id" class="sketchBoxBoard" @mousedown='spriteClick(item)'>
      <img src="./img/sketchbdbg.png" style='width:100;height:100%;' alt="">
      <img class="computer_Box" src="./img/jigui_img.png" alt="">
      <div class='computer_main'>
        <div class='computer_title'>{
  {setBoxNo(item)}}</div>
        <div class='df-aj computer_content1'>
          <img src="./img/icon_rongliang.png" style='width:100;height:100%;' alt="">
          <div class='computer_name mgl-5'>机柜容量</div>
          <div class='df-aj mgl_10'>
            <span class='computer_text1'>{
  {setEquipNum(item)}}</span>
            <span class='mgl_10 mgr_10'>/</span>
            <span class='computer_text3'>{
  {setEquipNumAll(item)}}</span>
          </div>
        </div>
        <div class='df-aj computer_content2'>
          <img src="./img/icon_zhuangtai.png" style='width:100;height:100%;' alt="">
          <div class='computer_name mgl-5'>设备状态</div>
          <div class='df-aj mgl_10'>
            <span class='computer_text2'>{
  {setTypeError(item)}}</span>
            <span class='mgl_10 mgr_10'>/</span>
            <span class='computer_text3'>{
  {setTypeAll(item)}}</span>
          </div>
        </div>
      </div>
    </div>
  </div>
</template>

<script>
import sketchBorder from '../sketchManagement/sketchBorder.vue'
import * as THREE from './js/three.module.js'
// import * as THREE from 'three'
import {
      OrbitControls } from 'three/examples/jsm/controls/OrbitControls.js'
import html2Canvas from 'html2canvas'
// import './js/Projector.js'
import {
      CSS2DRenderer, CSS2DObject } from './js/CSS2DRenderer.js'
import {
      FontLoader } from './jsm/loaders/FontLoader.js'
import {
      TextGeometry } from './jsm/geometries/TextGeometry.js'
import {
      buildingModel } from './buildingModel.js'
export default {
     
  components: {
      sketchBorder },
  data() {
     
    return {
     
      camera: null,
      scene: {
      children: [] },
      renderer: null,
      mesh: null,
      controls: null,
      stats: null,
      targetList: [],
      curHoverUUID: null,
      buildingModel: {
     },
      mouse: {
      x: 0, y: 0 },
      animateList: [],
      step: 0,
      p1: {
      x: 0, y: 2, z: 1000 },
      tweena: null,
      tweenb: null,
      tweenc: null,
      tweend: null,
      sketchText: '',
      sketchNameBoardName: {
     },
      sketchNameServeName: {
     },
      labelRenderer: null,
      mousedblclick: {
      x: 0, y: 2, z: 100 },
      timer: null,
    }
  },
  props: {
     
    isModel3D: {
     
      type: Boolean,
      default: false,
    },
    isRefresh: {
     
      type: Boolean,
      default: false,
    },
    isLook: {
     
      type: Boolean,
      default: false,
    },
    computerList: {
     
      type: Array,
      default: [],
    },
    sketckRoomName: {
     
      type: String,
      default: '',
    },
  },
  watch: {
     
    isRefresh(val) {
     
      var tweena = this.cameraCon({
      x: 0, y: 500, z: 1050 }, 1000)
      tweena.start()
    },
    isLook(val) {
     
      if (val) {
     
        this.initTween()
      } else {
     
        this.tweena.stop()
        this.tweenb.stop()
        this.tweenc.stop()
        this.tweend.stop()
        this.tweena = null
        this.tweenb = null
        this.tweenc = null
        this.tweend = null
        this.camera.position.set(0, 500, 1050)
        this.camera.lookAt(this.scene.position)
      }
    },
  },
  created() {
     
    // 机房墙体
    this.buildingModel = buildingModel
    console.log('this.buildingModel', this.buildingModel)
  },
  mounted() {
     
    this.init()
    this.initEquipModel()
    this.animate()
  },
  methods: {
     
    //初始化
    init() {
     
      //  添加场景
      this.scene = new THREE.Scene()
      // this.scene.background = new THREE.Color('#022f4c')
      this.renderer = new THREE.WebGLRenderer({
     
        antialias: true, //抗锯齿:true
        alpha: true,
      })
      //设置渲染器
      this.labelRenderer = new CSS2DRenderer()
      this.labelRenderer.setSize(this.$refs.container.clientWidth, this.$refs.container.clientHeight)
      this.labelRenderer.domElement.style.position = 'absolute'
      this.labelRenderer.domElement.style.bottom = '4em'
      this.labelRenderer.domElement.style.left = '7em'
      document.getElementById('container').appendChild(this.labelRenderer.domElement)
      //设置渲染器
      this.renderer.domElement.style.position = 'absolute'
      this.renderer.setSize(this.$refs.container.clientWidth, this.$refs.container.clientHeight) //画布尺寸
      // this.renderer.setClearColor('#39609B') //背景色
      this.renderer.setClearAlpha(0)
      document.getElementById('container').appendChild(this.renderer.domElement)
      //配置相机
      this.camera = new THREE.PerspectiveCamera(50, this.renderer.domElement.width / this.renderer.domElement.height, 0.1, 20000)
      this.camera.position.set(0, 500, 500) //左右,上下、前后视角
      //配置光源
      this.initLight()
      // 初始化视角控制器
      this.initOrbitControls()

      this.initModel()
      TWEEN.update()

      document.addEventListener('contextmenu', (e) => {
     
        let tweena = this.cameraCon({
      x: 0, y: 500, z: 1050 }, 1000)
        tweena.start()
      })
      document.addEventListener('mousemove', (e) => {
     
        this.onDocumentMouseMove(e)
      })

      document.addEventListener('click', (e) => {
     
        window.clearTimeout(this.timer)
        this.timer = window.setTimeout(() => {
     
          this.onDocumentMouseClick(e)
        }, <
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Alex-Gdd

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值