Vue 使用three.js实现简单全景图

Vue 使用three.js实现简单全景图

安装

cnpm install three -S

全景页面引用

import * as Three from 'three'

html模块

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

</template>

js模块

<script>
    // 引入THREE
    import * as THREE from 'THREE'
    var camera;
    var renderer;
    var scene;
    console.log(THREE)
    export default {
        data() {
            return {
                //全景图路径
                bigImg: require("../assets/img/20211108163944.jpg"),
            }
        },
        mounted() {
            /**
             * @description 使用全景图函数**/
            this.$nextTick(() => {
                this.init();
                this.animate();
            })
        },
        methods: {
            /**
             * @description 全景图参数配置**/
            init() {
                var container = document.getElementById('container');
                // 创建渲染器
                renderer = new THREE.WebGLRenderer();
                //antialias:抗锯齿----THREE.js创建的WebGLRenderer对象有抗锯齿选项的支持,这个选项默认是关闭的,所以需要显式开启一下。
                renderer.antialias = true
                // setPixelRatio:设置像素比率
                renderer.setPixelRatio(window.devicePixelRatio);
                // setSize:画布宽高
                renderer.setSize(window.innerWidth, window.innerHeight);
                // 判断容器中子元素的长度
                let childs = container.childNodes;
                if (container.childNodes.length > 0) {
                    container.removeChild(childs[0]);
                    container.appendChild(renderer.domElement);
                } else {
                    container.appendChild(renderer.domElement);
                }



                // THREE.Scen:创建全景场景
                scene = new THREE.Scene();
                /** 
                 * @description PerspectiveCamera: 创建相机
                 * PerspectiveCamera( fov : Number , aspect : Number , near : Number , far : Number )
                 * fov - 相机平截头体垂直视野。
                 * aspect - 相机平截头体纵横比。
                 * near - 平面附近的相机平截头体。
                 * far — 相机平截头体远平面。
                 * **/
                camera = new THREE.PerspectiveCamera(120, window.innerWidth / window.innerHeight, 1, 100);

                // position.set( <X> , <Y> , <Z> ) :设置相机位置,<X>和<Z>是 2D 坐标 并且<Y>是 高度
                camera.position.set(0, 0, 0);
                // up:相机以哪个方向为上方
                camera.up.set(0, 0, 1);
                var material = new THREE.MeshBasicMaterial(); //材质
                // 初始化一个加载器加载全景图片资源
                var texture = new THREE.TextureLoader().load(this.bigImg);
                material.map = texture;
                var skyBox = new THREE.Mesh(
                    new THREE.SphereBufferGeometry(100, 100, 100),
                    material
                );
                /* 
                    Mesh( geometry : BufferGeometry, material : Material )
                    geometry —— (可选)BufferGeometry的实例,默认值是一个新的BufferGeometry。
                    material —— (可选)一个Material,或是一个包含有Material的数组,默认是一个新的MeshBasicMaterial。
                */
                // .scale ( x : Float, y : Float, z : Float )缩放几何体。该操作一般在一次处理中完成,不会循环处理。典型的用法是通过调用 Object3D.scale 实时旋转几何体。
                skyBox.geometry.scale(1, 1, -1);
                scene.add(skyBox);

                // 监听窗口缩放事件
                window.addEventListener('resize', this.onWindowResize, false);
                // 用于判断鼠标是按下还是松开,通过鼠标预览全景图
                var bMouseDown = false;
                // x,y:全景图的坐标位置
                var x = -1;
                var y = -1;
                // 添加鼠标点击事件
                container.onmousedown = function (event) {
                    event.preventDefault(); //取消默认事件
                    // console.log(event)
                    x = event.clientX;
                    y = event.clientY;
                    bMouseDown = true;
                }
                // 鼠标按键被松开时的坐标
                container.onmouseup = function (event) {
                    event.preventDefault();
                    bMouseDown = false;
                }
                // 鼠标在全景图上移动坐标
                container.onmousemove = function (event) {
                    event.preventDefault();
                    if (bMouseDown) {
                        skyBox.rotation.y += -0.005 * (event.clientX - x);
                        skyBox.rotation.x += -0.005 * (event.clientY - y);
                      
                        if (skyBox.rotation.x > Math.PI / 2) {
                            skyBox.rotation.x = Math.PI / 2
                        }
                        if (skyBox.rotation.x < -Math.PI / 2) {
                            skyBox.rotation.x = -Math.PI / 2
                        }
                        x = event.clientX;
                        y = event.clientY;
                    }
                }
                // 鼠标滚轮滚动事件
                container.onmousewheel = function (event) {
                    event.preventDefault();
                    console.log(camera)
                    console.log(event.wheelDelta)
                    if (event.wheelDelta != 0) {
                        /**
                         * @description 
                         * camera.fov: 相机平截头体垂直视野
                         * event.wheelDelta:前后缩放的方向:前(120),后(-12)
                         * **/
                        camera.fov += event.wheelDelta > 0 ? 1 : -1;
                        if (camera.fov > 150) {
                            camera.fov = 150;
                        } else if (camera.fov < 30) {
                            camera.fov = 30;
                        }
                        // 用来手动更新相机的投影矩阵的
                        camera.updateProjectionMatrix();
                    }
                }
            },
            onWindowResize() {
                // 窗口缩放的时候,保证场景也跟着一起缩放
                camera.aspect = window.innerWidth / window.innerHeight;
                // updateProjectionMatrix():用来手动更新相机的投影矩阵的
                camera.updateProjectionMatrix();
                // 重置画布宽高
                renderer.setSize(window.innerWidth, window.innerHeight);
            },
            /**
             * @description **/
            animate() {
                requestAnimationFrame(this.animate);
                renderer.render(scene, camera);
            }
        },
    }
</script>
  1. Three.js API手册1
  2. three.js手册2
  3. 鼠标滚动事件参数
  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue使用Three.js VR全景图,你可以按照以下步骤进行: 1. 首先,确保你已经安装了VueThree.js的依赖包。你可以使用npm或yarn来安装它们。 2. 在Vue的组件中,导入Three.js所需的库和组件: ```javascript import * as THREE from 'three'; import { VRButton } from 'three/examples/jsm/webxr/VRButton.js'; ``` 3. 创建一个Vue组件,并在其中定义一个方法来初始化Three.js场景: ```javascript export default { mounted() { this.initScene(); }, methods: { initScene() { // 创建场景 const scene = new THREE.Scene(); // 创建相机 const camera = new THREE.PerspectiveCamera( 75, window.innerWidth / window.innerHeight, 0.1, 1000 ); // 创建渲染器 const renderer = new THREE.WebGLRenderer({ antialias: true }); renderer.setSize(window.innerWidth, window.innerHeight); document.body.appendChild(renderer.domElement); // 添加VR按钮 document.body.appendChild(VRButton.createButton(renderer)); // 创建全景图 const textureLoader = new THREE.TextureLoader(); const texture = textureLoader.load('path/to/your/panorama-image.jpg'); const sphereGeometry = new THREE.SphereGeometry(500, 60, 40); const sphereMaterial = new THREE.MeshBasicMaterial({ map: texture }); const sphere = new THREE.Mesh(sphereGeometry, sphereMaterial); sphere.position.set(0, 0, 0); scene.add(sphere); // 更新相机和场景 const animate = () => { requestAnimationFrame(animate); sphere.rotation.y += 0.01; renderer.render(scene, camera); }; animate(); }, }, }; ``` 4. 在Vue模板中使用这个组件: ```html <template> <div id="app"> <canvas id="vr-canvas"></canvas> </div> </template> ``` 这样,你就可以在Vue使用Three.js VR全景图了。当用户点击VR按钮时,全屏显示全景图,并支持通过移动设备或VR眼镜进行交互。你可以适配不同的全景图、修改相机参数等来满足你的需求。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值