Thteejs已有场景中使用CSS3DRenderer插入Vue视频操作组件

1,创建Vue视频组件

<template>
  <div id="surveillance-content">
    <div class="c-title">
      <div class="c-t-content">
        <div style="display:flex;">
          <div class="c-t-name">
            视频监控
          </div>
        </div>
        <div @click.stop="close">
          <img src="../assets/iconfont/guanbi.png" alt="" class="c-t-close">
        </div>
      </div>
    </div>
    <div id="video-player-container">
      <video id="video-player"
             ref="videoPlayer"
             @ready="onPlayerReady"
             controls="true"
             muted>
        <source :src="videoSrc" type="video/mp4">
      </video>
      <div id="container"/>
      <div class="controls">
        <div class="c-t-content-sx">
          <div class="c-t-content-sx-btn">
            上一个
          </div>
          <div class="c-t-content-sx-btn">
            下一个
          </div>
        </div>
        <div class="angle-control">
          <label>角度:</label>
          <input type="range" min="0" max="360" v-model="angle" @input="onAngleChange" />
        </div>
        <div class="angle-control">
          <label>灵敏度:</label>
          <input type="range" min="1" max="10" v-model="sensitivity" />
        </div>
        <div class="angle-control">
          <label>视角:</label>
          <input type="range" min="50" max="150" v-model="perspective" />
        </div>
        <div class="c-t-content-sxt">
          摄像头模拟
        </div>
        <div class="c-t-content-sx">
          <div class="c-t-content-sx-btn c-t-content-sxt-btn">
            全部
          </div>
          <div class="c-t-content-sx-btn c-t-content-sxt-btn">
            当前
          </div>
          <div class="c-t-content-sx-btn c-t-content-sxt-btn">
            取消
          </div>
        </div>
        <div class="c-t-content-sx">
          <div class="c-t-content-sx-btn c-t-content-sxt-btn">
            分布
          </div>
          <div class="c-t-content-sx-btn c-t-content-sxt-btn">
            退出
          </div>
        </div>
      </div>
    </div>
  </div>
</template>

<script>
import store from "@/store";
import scene from "@/three/scene";
import {zoomInCamera} from "@/utils/zoomInCamera";
import camera from "@/three/camera";
import controls from "@/three/controls";
export default {
  name: "Surveillance",
  components: {
  },
  data() {
    return {
      isPlaying: false,
      videoSrc: './zhangyan-substation/video/videoPlane.mp4', // 替换为你的视频源
      angle: 0,
      sensitivity: 5,
      perspective: 100,
    }
  },
  mounted() {
  },
  methods: {
    close() {},
    onPlayerReady(player) {
      player.src({ type: 'video/mp4', src: this.videoSrc });
    },
    onAngleChange() {},
    videoPlayer(){
      if (videoPlayer) {
        videoPlayer.pause();
        videoPlayer.currentTime = 0;
      }
    }
  }
}
</script>
<style scoped>
#surveillance-content {
  width: 800px;
  height: 410px;
  transform-style: preserve-3d; 
  background-color: rgba(25, 33, 47);
  border: 1px solid rgba(84, 148, 173);
}

.c-title {
  display: flex;
  justify-content: space-between;
  border: 2px solid rgba(2, 164, 247, 0.3);
  line-height: 30px;
}

.c-t-content {
  display: flex;
  justify-content: space-between;
  height: 30px;
  line-height: 30px;
  width: 100%;
  padding-left: 10px;
  padding-right: 10px;
  border-bottom: 1px transparent solid;
  background: linear-gradient(90deg, rgba(2, 164, 247, 0.37), rgba(2, 164, 247, 0), rgba(2, 164, 247, 0.03));
}

.c-t-name {
  margin-left: 10px;
  font-size: 18px;
  font-weight: bold;
  color: #02A4F7;
}

.c-t-close {
  cursor: pointer;
  margin-top: 5px;
  width: 15px;
  height: 15px;
  border: 1px solid rgba(81, 146, 173);
  background-color: rgba(81, 146, 173);
}
#video-player-container {
  position: relative;
  margin: 0 auto;
  display: flex;
}

.controls {
  margin-top: 30px;
  margin-left: 10px;
}

.angle-control{
  color: #fff;
  margin-bottom: 10px;
  display: flex;
  justify-content: space-between;
}
#video-player{
  width: 72%;
  height: 375px;
}
.c-t-content-sx{
  display: flex;
  justify-content: space-between;
  align-items: center;
  margin-bottom: 20px;
}
.c-t-content-sx-btn{
  width: 70px;
  cursor: pointer;
  height: 30px;
  font-size: 14px;
  border-radius: 5px;
  color: white;
  text-align: center;
  line-height: 30px;
  border: 1px solid rgba(60, 69, 76, 0.5);
}
.c-t-content-sxt{
  color: white;
  margin-bottom: 10px;
}
.c-t-content-sxt-btn{
  width: 50px;
}
</style>


封装CSS3DObject.js组件

import {CSS3DObject} from "three/examples/jsm/renderers/CSS3DRenderer.js";
import Surveillance from '../views/surveillance.vue';//引入Vue视频组件
import {createApp} from 'vue';
export function createCSS3DObject(x,y,z){
    let div = document.createElement('div');
    div.style.width = '820px';
    div.style.height = '430px';
    div.style.backgroundColor = 'rgba(0,0,0,0.5)';

    const app = createApp(Surveillance);
    app.mount(div);

    const iframe = document.createElement('iframe');
    iframe.style.width = '820px';
    iframe.style.height = '430px';
    iframe.style.border = '0px';

    iframe.appendChild(div);
    const css3DObject = new CSS3DObject(div);
    css3DObject.position.set(x, y, z);
    css3DObject.scale.set(0.005, 0.005, 0.005);
    css3DObject.rotation.y = Math.PI / 2;
    css3DObject.name = 'css3DObject';
    return css3DObject;
}

调用createCSS3DObject方法插添加到scene场景中

scene.add(createCSS3DObject(-69.2, -4.4, 26.6));//Vue组件通过参数传不过去所以没有进行传参

可以通过scene.getObjectByName方法对视频组件进行旋转隐藏等操作

let css3DObject = scene.getObjectByName('css3DObject');
css3DObject.visible = false;//没有从场景中删除的原因为重新加载消耗性能

  • 9
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue导入Three.js的CSS3DRenderer需要进行以下步骤: 1. 首先,你需要安装Three.js库。可以使用npm或者下载Three.js的压缩文件并在项目引入。 2. 在需要使用CSS3DRenderer组件,首先导入Three.js的依赖项,包括CSS3DRenderer。 import * as THREE from 'three'; import { CSS3DRenderer } from 'three/examples/jsm/renderers/CSS3DRenderer'; 3. 创建一个Vue组件,其包含一个用于渲染Three.js场景的容器。 <template> <div ref="container"></div> </template> 4. 在Vue的mounted生命周期钩子函数初始化Three.js渲染器和场景。 export default { mounted() { const container = this.$refs.container; const renderer = new CSS3DRenderer(); // 创建CSS3DRenderer实例 renderer.setSize(container.clientWidth, container.clientHeight); // 设置渲染器的尺寸 container.appendChild(renderer.domElement); // 将渲染器的DOM元素添加到容器 const scene = new THREE.Scene(); // 创建场景 // 在这里可以添加其他Three.js场景对象,如相机、光源、物体等 // 渲染函数,每次渲染时调用 const render = () => { renderer.render(scene, camera); // 在这里可以根据场景需要进行其他操作,如更新物体的位置、旋转等 requestAnimationFrame(render); }; render(); // 开始渲染 }, }; 5. 最后,在Vue组件的样式表添加容器的样式。 <style scoped> .container { width: 100%; height: 100%; } </style> 通过以上步骤,在Vue成功导入并使用Three.jsCSS3DRenderer进行渲染。当然,在实际使用,你需要根据自己的项目需求进行调整和完善。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值