vue + threejs实战,实现3D 360度 旋转查看物体

3 篇文章 1 订阅
1 篇文章 0 订阅

 一.  官方文档
       
地址:three.js

二.   简介

    threejs是JavaScript编写的 WebGL 第三方库,提供了非常多的3D显示功能。它是一款运行在浏览器中的 3D 引擎,你可以用它创建各种三维场景,包括摄像机,光影,材质等各种对象。

三.   npm安装

$ npm install three --save-dev

四.   代码实例

前提:提前准备好 .glb(3D格式文件) 和 .hdr(High-Dynamic Range:高动态范围的缩写-用于渲染场景) 格式文件,可以网上下载

1. 可以再utils文件下编写一个Base3d.js的工具包

import * as THREE from "three";
import { RGBELoader } from "three/examples/jsm/loaders/RGBELoader"; // 色调渲染器
import { OrbitControls } from "three/examples/jsm/controls/OrbitControls"; // 轨道控制器
import { GLTFLoader } from "three/examples/jsm/loaders/GLTFLoader"; // 文件格式加载器

class Base3d {
    constructor(selector) {
        this.container = document.querySelector(selector)
        this.camera; // 摄像机
        this.scene; // 场景
        this.renderer; // 渲染器
        this.init(); // 初始化
        this.animate(); // 动画不断渲染
    }

    // 初始化
    init() {
        this.initScene(); // 场景
        this.initCamera(); // 摄像机
        this.initRenderer(); // 渲染器
        this.initControls(); // 轨道控制器(放在渲染器后面)
        this.addMesh(); // 添加物体
        window.addEventListener('resize', this.onWindowReset.bind(this))
    }

    // 初始化场景
    initScene() {
        this.scene = new THREE.Scene();
        this.setEnvMap('yejing.hdr');
    }

    // 初始化摄像机
    initCamera() {
        // 透视相机
        this.camera = new THREE.PerspectiveCamera(
            45,
            window.innerWidth / window.innerHeight,
            1,
            1000
        );
        // 相机3维坐标
        this.camera.position.set(-8.5, 0.6, 2.7);
    }

    // 初始化渲染器
    initRenderer() {
        // 渲染器-抗锯齿
        this.renderer = new THREE.WebGLRenderer({ antialias: true });

        // 设置像素比(定义为浏览器的缩放比)
        this.renderer.setPixelRatio(window.devicePixelRatio);

        // 设置渲染器尺寸大小
        this.renderer.setSize(window.innerWidth, window.innerHeight);

        // 绘制输出一个 canvas
        this.container.appendChild(this.renderer.domElement);
    }

    // 环境纹理设置
    setEnvMap(hdr) {
        new RGBELoader().setPath('./files/hdr/').load(hdr, (texture) => {
            // 映射场景(球状体里面)
            texture.mapping = THREE.EquirectangularRefractionMapping;

            // 色调映射-电影级别
            this.renderer.toneMapping = THREE.ACESFilmicToneMapping;

            // 色调映射的曝光级别
            this.renderer.toneMappingExposure = 3;

            // 场景背景添加纹理
            this.scene.background = texture;
            // 场景环境添加纹理
            this.scene.environment = texture;
        });
    }

    // 渲染函数
    render() {
        // 用相机渲染一个场景
        this.renderer.render(this.scene, this.camera)
    }

    // 动画
    animate() {
        // 每一帧都会调用此方法
        this.renderer.setAnimationLoop(this.render.bind(this))
    }

    // 轨道控制器
    initControls() {
        // this.camera是个object(必须)将要被控制的相机
        this.controls = new OrbitControls(this.camera, this.renderer.domElement)
    }

    // 设置模型(物体)
    setModel(modelName) {
        return new Promise(() => {
            const loader = new GLTFLoader().setPath('./files/glb/');
            loader.load(modelName, (gltf) => {
                console.info(gltf)
                const model = gltf.scene.children[0]; // 取屏幕的第一个子元素
                this.scene.add(model); // 给屏幕添加模型(即物体)
            })
        })
    }

    // 添加物体
    addMesh() {
        this.setModel('qiao.glb')
    }

    // 监听浏览器,做自适应渲染
    onWindowReset() {
        // 摄像机视椎体的长宽比
        this.camera.aspect = window.innerWidth / window.innerHeight;
        // 更新摄像机投影矩阵
        this.camera.updateProjectionMatrix();
        // 渲染器重新设置大小
        this.renderer.setSize(window.innerWidth, window.innerHeight);
    }
}

export default Base3d

2. 使用:在.vue文件中

<template>
  <div id="scene"></div>
</template>

<script>
import Base3d from "../utils/Base3d";

export default {
  name: "ThreeJS",
  data: () => ({
    base3d: {}
  }),
  mounted() {
    this.base3d = new Base3d('#scene')
  },
}
</script>

五.  效果展示

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值