04 使用three.js开发全景漫游 全景图切换的实现

时间:2022-02-13 06:17:44

简介

我们实现全景的方法就是将全景图片获取成功后直接替换掉material.mapimg对象,然后再告知three.js它的material.map更新了,然后就实现了场景图的替换。

简单示例

    setInterval(function () {
        var material = mesh.material;
        index++;
        if(index >= 4) index = 1;
        material.map = loader.load( "00"+index+".jpg" );
        material.map.needsUpdate = true;
    },8000);

上面就是一个定时器,每八秒执行一次。首先获取到meshmaterial,然后给material.map重新获取图片,然后告诉three.js模型的map需要更新,就实现了当前的效果。

案例代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style type="text/css"> html, body { margin: 0; height: 100%; } canvas { display: block; } </style>
</head>
<body onload="draw();">
</body>
<script src="https://johnson2heng.github.io/three.js-demo/lib/three.js"></script>
<script src="https://johnson2heng.github.io/three.js-demo/lib/js/controls/OrbitControls.js"></script>
<script src="https://johnson2heng.github.io/three.js-demo/lib/js/libs/stats.min.js"></script>
<script src="https://johnson2heng.github.io/three.js-demo/lib/js/libs/dat.gui.min.js"></script>
<script> var renderer; function initRender() { renderer = new THREE.WebGLRenderer({antialias: true}); //renderer.setClearColor(new THREE.Color(0xEEEEEE, 1.0)); //设置背景颜色 renderer.setSize(window.innerWidth, window.innerHeight); document.body.appendChild(renderer.domElement); } var camera; function initCamera() { camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 1, 10000); camera.target = new THREE.Vector3( 0, 100, 0 ); } var scene; function initScene() { scene = new THREE.Scene(); } var light; function initLight() { } var mesh,loader=new THREE.TextureLoader(); function initModel() { //轴辅助 (每一个轴的长度) var helper = new THREE.AxesHelper(500); scene.add(helper); //声明一个球体 var geometry = new THREE.SphereBufferGeometry( 500, 60, 40 ); // 反转X轴上的几何图形,使所有的面点向内。 geometry.scale( - 1, 1, 1 ); //声明球体纹理 var material = new THREE.MeshBasicMaterial( { map: loader.load( 'pano.jpg' ) //加载一整张纹理图片 } ); mesh = new THREE.Mesh( geometry, material ); scene.add( mesh ); console.log(scene); } //初始化性能插件 var stats; function initStats() { stats = new Stats(); document.body.appendChild(stats.dom); } //用户交互插件 鼠标左键按住旋转,右键按住平移,滚轮缩放 var controls; function initControls() { controls = new THREE.OrbitControls(camera, renderer.domElement); // 如果使用animate方法时,将此函数删除 //controls.addEventListener( 'change', render ); // 使动画循环使用时阻尼或自转 意思是否有惯性 controls.enableDamping = true; //动态阻尼系数 就是鼠标拖拽旋转灵敏度 //controls.dampingFactor = 0.25; //是否可以缩放 controls.enableZoom = true; //是否自动旋转 controls.autoRotate = false; //设置相机距离原点的最远距离 controls.minDistance = 20; //设置相机距离原点的最远距离 controls.maxDistance = 10000; //是否开启右键拖拽 controls.enablePan = true; } //生成gui设置配置项 var gui; function initGui() { //声明一个保存需求修改的相关数据的对象 gui = { }; var datGui = new dat.GUI(); //将设置属性添加到gui当中,gui.add(对象,属性,最小值,最大值) } function render() { renderer.render(scene, camera); } //窗口变动触发的函数 function onWindowResize() { camera.aspect = window.innerWidth / window.innerHeight; camera.updateProjectionMatrix(); render(); renderer.setSize(window.innerWidth, window.innerHeight); } function animate() { //更新控制器 controls.update(); render(); //更新性能插件 stats.update(); requestAnimationFrame(animate); } function draw() { initRender(); initScene(); initCamera(); initLight(); initModel(); initControls(); initStats(); initGui(); animate(); window.onresize = onWindowResize; } var index = 0; setInterval(function () { var material = mesh.material; index++; if(index >= 4) index = 1; material.map = loader.load( "00"+index+".jpg" ); material.map.needsUpdate = true; },8000); </script>
</html>