three.js+vue3实现3D看房

1,767 阅读1分钟

1.对立方体进行面的反转,实现房间的效果,设置物体的缩放为沿某一轴负方向
2.若贴图方向可通过旋转贴图来到正确的位置
3.贴图是二维且朝向固定的,不能设置旋转轴
4.设置贴图的中心 texture.center=new Vector(x,y),会绕着这个中心旋转
5.当取值为 (0, 0) 时,贴图的中心点坐标是纹理坐标系的原点。而当取值为 (1, 1) 时,贴图的中心点坐标就是纹理坐标系的右上角点

<template>

  <!-- ref 的功能很强大,可以用于获取任何响应式的数据、元素实例等。

    需要注意的是,在使用 ref 获取元素实例时,只有在元素渲染后才能获取到正确的实例。

  -->

  <div class="container" ref="container"></div>

</template>

<!--

  setup

    为我们提供一个新的组件配置项,用来替代 Vue

    2.x 中的 created、mounted、updated、destroyed

    等生命周期函数。 setup 函数是可选的,

    可以用来完成组件的数据处理,也可以 返回渲染时需

    要的数据、组件选项等数据。

-->

<script setup>

import * as THREE from "three";

import { OrbitControls } from "three/examples/jsm/controls/OrbitControls";

import { ref, onMounted } from "vue";

// import {a} from '../public/imgs/living/'

  


const w = window.innerWidth;

const h = window.innerHeight;

const loader = new THREE.TextureLoader();

  


let arrs = ["4_l", "4_r", "4_u", "4_d", "4_b", "4_f"];

let boxMaterial = [];

arrs.forEach((item) => {

  //创建纹理

  let texture = loader.load(`imgs/living/${item}.jpg`);

  //创建材质

  if (item === "4_u" || item === "4_d") {

    //贴图本身是二维的,它的朝向是固定的,不能指定轴来旋转

    texture.rotation = Math.PI;

    //用于指定贴图的中心点坐标,默认值是 (0, 0)

    //texture.center 属性的取值范围必须在 [0, 1] 之间。

    //当取值为 (0, 0) 时,贴图的中心点坐标仍然是纹理坐标系的原点。

    //而当取值为 (1, 1) 时,贴图的中心点坐标就是纹理坐标系的右上角点。

    texture.center = new THREE.Vector2(0.5, 0.5);

    boxMaterial.push(new THREE.MeshBasicMaterial({ map: texture }));

  } else {

    boxMaterial.push(new THREE.MeshBasicMaterial({ map: texture }));

  }

});

//场景

const scene = new THREE.Scene();

//物体

const geometry = new THREE.BoxGeometry(10, 10, 10);

const cube = new THREE.Mesh(geometry, boxMaterial);

cube.geometry.scale(-1, 1, 1);

scene.add(cube);

//光源

  


//相机

const camera = new THREE.PerspectiveCamera(75, w / h, 0.1, 300);

camera.position.set(0, 2, 4);

camera.lookAt(0, 0, 0);

//渲染器

const renderer = new THREE.WebGL1Renderer();

renderer.setSize(w, h);

  


//轨道控制器

const orbitControls = new OrbitControls(camera, renderer.domElement);

// orbitControls.enableDamping = true;

//封装一个渲染函数

const render = () => {

  orbitControls.update();

  //阻尼

  //将其设置为true以启用阻尼(惯性),这将给控制器带来重量感。默认值为false。

  // 请注意,如果该值被启用,你将必须在你的动画循环里调用.update()。

  orbitControls.enableDamping = true;

  renderer.render(scene, camera);

  requestAnimationFrame(render);

};

/**

 * 在 Vue 3 中,ref 是一个新增的函数,主要用于在模板或者

 *  setup 函数中获取一个响应式对象或者值。在使用 ref 函数时,

 *  会将传入的数据进行处理并返回一个对象,这个对象会在原数据的

 *  基础上增加一个 value 属性用于存储数据。

 */

const container = ref(null);

// 挂载完毕后通过onMounted获取dom

onMounted(() => {

  container.value.appendChild(renderer.domElement);

  render();

});

</script>

  


<style>

* {

  margin: 0;

  padding: 0;

}

  


.container {

  width: 100vw;

  height: 100vh;

  background-color: #f0f0f0;

}

</style>

图片.png