vue + threejs 实现场景环境贴图,模型高光显示效果

12 篇文章 7 订阅

<template>
  <div class="modelsBox">
    <div class="modelsBox_wrapper"></div>
    <div class="opara-pannel">
      <div>
      </div>
      <div>
        三维坐标点信息
        <!-- <p>{{point3d}}</p> -->
      </div>
    </div>
  </div>
</template>

<script>
// import * as THREE from 'three';
import { PMREMGenerator } from 'three';
import { webglOBJ, labelTag, getPointRay, getFitScaleValue, deepCopyObject } from '@/utils/webGL/webGL.js';
import * as THREE from 'three';
import { OrbitControls } from './threeUtils/controls/OrbitControls.js';
import { GLTFLoader } from './threeUtils/loaders/GLTFLoader.js';
import { RGBELoader } from './threeUtils/loaders/RGBELoader.js';
export default {
  name: 'modelsBox',
  data () {
    return {
      zoom: 1,
      target: '',
      sence: null,
      camera: '',
      renderer: '',
      obj: {
        sence: '',
        camera: ''
      },
      labels: [
        { x: 381.0111567102036, y: 41.66598867957452, z: -248.63694417317873 },
        { x: 383.39332161333544, y: 41.37982005491592, z: -380.9167972387805 },
        { x: 384.19846417704997, y: 41.50664881726524, z: -466.0620455548741 }
      ]
    };
  },
  beforeDestroy () {
    document.removeEventListener('click', this.get3D);
  },
  mounted () {
    // this.int();
    this.pageInt();
  },
  methods: {
    pageInt () {
      let camera, scene, renderer;

      init();
      render();

      function init () {

        const container = document.createElement('div');
        document.body.appendChild(container);
        camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.25, 20);
        camera.position.set(- 1.8, 0.6, 2.7);
        scene = new THREE.Scene();

        new RGBELoader().load('https://threejs.org/examples/textures/equirectangular/royal_esplanade_1k.hdr', function (texture) {
            texture.mapping = THREE.EquirectangularReflectionMapping;
            scene.background = texture;
            scene.environment = texture;
            render();
            // model
            const loader = new GLTFLoader();
            loader.load('https://threejs.org/examples/models/gltf/DamagedHelmet/glTF/DamagedHelmet.gltf', function (gltf) {
              gltf.scene.scale.x = 0.5;
              gltf.scene.scale.y = 0.5;
              gltf.scene.scale.z = 0.5;
              scene.add(gltf.scene);
              render();
            });

          });

        renderer = new THREE.WebGLRenderer({ antialias: true });
        renderer.setPixelRatio(window.devicePixelRatio);
        renderer.setSize(window.innerWidth, window.innerHeight);
        renderer.toneMapping = THREE.ACESFilmicToneMapping;
        renderer.toneMappingExposure = 1;
        renderer.outputEncoding = THREE.sRGBEncoding;
        container.appendChild(renderer.domElement);

        const controls = new OrbitControls(camera, renderer.domElement);
        controls.addEventListener('change', render); // use if there is no animation loop
        controls.minDistance = 2;
        controls.maxDistance = 10;
        controls.target.set(0, 0, - 0.2);
        controls.update();
        window.addEventListener('resize', onWindowResize);
      }

      function onWindowResize () {
        camera.aspect = window.innerWidth / window.innerHeight;
        camera.updateProjectionMatrix();
        renderer.setSize(window.innerWidth, window.innerHeight);
        render();
      }

      function render () {
        renderer.render(scene, camera);
      }
    }
  }
};
</script>
<style lang="scss" scoped>
.modelsBox_wrapper {
  position: relative;
  width: 100%;
  height: 100vh;
  border: 1px solid #ccc;
  overflow: hidden;
}
.opara-pannel {
  position: absolute;
  right: 15px;
  top: 100px;
  width: 200px;
  height: 400px;
  background: rgba(0, 0, 0, 0.7);
  div,
  p {
    color: #fff;
  }
}
.modelsBox {
  position: relative;
  overflow: hidden;
}
div[id*="sign"] {
  width: 250px;
  height: 100px;
  padding: 10px 10px 10px 70px;
  background: rgba(0, 0, 0, 0.65);
  background: url("~assets/label-bg.png") center center no-repeat;
  .sign {
    div {
      color: #fff;
      text-align: left;
      padding: 0 5px;
    }
  }
}
</style>

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
VueThree.js是两个热门的Web开发框架和库,分别用于构建用户界面和创建3D场景。结合使用VueThree.js可以非常方便地搭建一个3D仓房。 首先,在Vue项目中安装并引入Three.js库。可以使用npm或者直接在HTML中引入CDN链接。然后,使用Vue的组件化开发思想,创建一个3D仓房组件。 在Vue的3D仓房组件中,可以使用Three.js的场景(Scene)、相机(Camera)、渲染器(Renderer)等基本元素来创建一个空白的3D场景。可以设定相机的位置和方向,调整渲染器的大小和样式。 接下来,可以使用Three.js提供的几何体(Geometry)和材质(Material)来创建具体的仓房模型。例如,可以使用BoxGeometry创建一个长方体模型,然后使用MeshBasicMaterial设置其颜色或者使用纹理材质来进行贴图。 在几何体和材质创建好之后,可以将其合并成一个网格(Mesh),并添加到场景中。 为了使3D场景更加生动,可以使用Three.js的灯光(Light)来设置光照效果。例如,太阳光照射到仓房模型上,可以使用光源和颜色来模拟阳光的效果。 最后,在Vue的3D仓房组件中添加交互功能,例如旋转、缩放或者平移等,可以使用Three.js提供的控制器(Controller)或者自定义事件监听器来实现。 在Vue项目中的相应页面引入3D仓房组件,并传入相应的参数,即可在浏览器中看到搭建好的3D仓房场景。 总之,使用VueThree.js搭建3D仓房的过程大致如上所述,需要使用Vue的组件化开发和Three.js的渲染和建模功能来实现。这样可以充分利用两个框架和库的优势,简化开发流程,创建出生动逼真的3D仓房场景

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值