接触webGl(three.js)之全景(VR)看房的实现旅程总结

本文介绍了使用不同技术实现全景VR看房的方法,包括纯Three.js、photo-sphere-viewer库及pano2vr软件等,并提供了代码示例。

文章目录


前言

这几天可能是机缘巧合吧,我朋友让我帮他弄一下全景(VR)看房功能(类似贝壳看房不过最后做不出来....),这时候我默认大家都了解了什么是OpenGL,什么是WebGL,以及Three.js。不过不了解也关系,我是从萌新角度去介绍如何开发的(引导开发式)。


实现全景(VR)看房的方式

让我介绍一下我这几天自己琢磨的方式吧,虽然很一般都是对第一次接触的人还是有很大的帮助。

一、纯Three.js方式

1.安装包

npm install three

// 过渡动画
npm install tween

2.实现的业务代码

代码(vue+three)简单实现了全景看房,以及点击获取3维坐标位置并把相机移动过去。

<template>
  <div>
      <div id="container" ref="container"></div>
  </div>
</template>

<script>
  import * as THREE from 'three';
  import TWEEN from '@tweenjs/tween.js'
  import { OrbitControls } from "three/examples/jsm/controls/OrbitControls"
  export default {
    data () {
        return {
            bigImg: require("../../assets/1.png"), // 图片路径
            container: null, // 页面容器
            camera: null, // 相机
            renderer: null, // 渲染器
            scene: null, // 场景
            material: null,  // 添加材质
            texture: null,// 创建纹理贴图
            skyBox: null, // 网格
            controls: null, // 轨道控制
            clock: null, // 轨道更新时间
            // 鼠标属性
            bMouseDown: false,
            x: -1,
            y: -1,
            isClickCamera: false, // 是否点运动相机
            raycaster: null,
            mouse: null
        }
    },
    mounted () {
        this.$nextTick(() => {
            this.init();
            this.animate();
        })
    },
    created () {
    },
    methods: {
        // 初始化轨道控制
        initControls() {
            this.controls = new OrbitControls(this.camera, this.renderer.domElement);
            this.controls.target = new THREE.Vector3(0, 0, 0);
            this.controls.minDistance = 18; // 相机最近
            this.controls.maxDistance = 500; // 相机最远
            this.controls.autoRotate = false; // 图片自动旋转
            this.controls.enableDamping = true; // 使动画循环使用时阻尼或自转 意思是否有惯性
            this.controls.enablePan = false; // 是否开启右键拖拽
            this.controls.autoRotateSpeed = 0.5; // 阻尼系数
        },
        init() {
            // 页面容器
            this.container = document.getElementById('container');

            // 创建渲染器
            this.renderer = new THREE.WebGLRenderer();
            this.renderer.setPixelRatio(window.devicePixelRatio);

            // 设置画布的宽高
            this.renderer.setSize(window.innerWidth, window.innerHeight);

            // 判断容器中子元素的长度
            let childs = this.container.childNodes;
            if (this.container.childNodes.length > 0) {
                this.container.removeChild(childs[0]);
                this.container.appendChild(this.renderer.domElement);
          
评论 8
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

An_s

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

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

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

打赏作者

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

抵扣说明:

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

余额充值