three.js 源码分析之ImageLoader

/**

     * @author mrdoob / http://mrdoob.com/

     */

    这个类用于图像的下载,包括数据存储在url中的下载过程,需要注意的是跨域问题

    //图片下载器

    function ImageLoader( manager ) {

 

        this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;

 

    }

 

    Object.assign( ImageLoader.prototype, {

        //跨域

        crossOrigin: 'anonymous',

        //加载图片

        load: function ( url, onLoad, onProgress, onError ) {

 

            if ( url === undefined ) url = '';

 

            if ( this.path !== undefined ) url = this.path + url;

 

            //处理url访问

            url = this.manager.resolveURL( url );

 

            var scope = this;

            //首先从缓存中获取

            var cached = Cache.get( url );

            //缓存中存在

            if ( cached !== undefined ) {

                //开始回调

                scope.manager.itemStart( url );

 

                setTimeout( function () {

                    //空闲处理

                    if ( onLoad ) onLoad( cached );

                    //结束回调

                    scope.manager.itemEnd( url );

 

                }, 0 );

                //返回方式获取

                return cached;

 

            }

 

            //创建图片div

            var image = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'img' );

 

            function onImageLoad() {

                //下载完成移出监听

                image.removeEventListener( 'load', onImageLoad, false );

                image.removeEventListener( 'error', onImageError, false );

                //将img添加到缓存(这个this是img自己)

                Cache.add( url, this );

                //回调

                if ( onLoad ) onLoad( this );

                //结束回调

                scope.manager.itemEnd( url );

 

            }

 

            function onImageError( event ) {

                //处理错误

                image.removeEventListener( 'load', onImageLoad, false );

                image.removeEventListener( 'error', onImageError, false );

 

                if ( onError ) onError( event );

 

                scope.manager.itemError( url );

                scope.manager.itemEnd( url );

 

            }

 

            //设置下载监听和错误监听

            image.addEventListener( 'load', onImageLoad, false );

            image.addEventListener( 'error', onImageError, false );

 

            //如果url中有没有图片数据

            if ( url.substr( 0, 5 ) !== 'data:' ) {

                //设置图片可以跨域访问

                if ( this.crossOrigin !== undefined ) image.crossOrigin = this.crossOrigin;

 

            }

            //开始下载计数和回调

            scope.manager.itemStart( url );

            //开始下载

            image.src = url;

            //返回图片

            return image;

 

        },

        //设置跨域

        setCrossOrigin: function ( value ) {

 

            this.crossOrigin = value;

            return this;

 

        },

        //设置路径

        setPath: function ( value ) {

 

            this.path = value;

            return this;

 

        }

 

    } );

three.js中,步进式3D全景看房通常利用WebGL和球面投影技术(Spherical Projection)来创建沉浸式的虚拟现实体验。以下是实现步骤: 1. **设置基础环境**: 首先,引入three.js库和CSS样式,确保有一个适合展示360度图片的容器。 ```javascript import * as THREE from 'three'; ``` 2. **加载全景图**: 使用THREE.ImageLoader或CubemapLoader加载全景图和相关的立方体贴图(对于360x180的equirectangular图像,或者六个正方形图像分别对应每个方向)。 ```javascript const panoramaLoader = new THREE.CubeTextureLoader(); panoramaLoader.load('path/to/equirectangular.jpg', onPanoramaLoad, null, onProgress); ``` 3. **创建场景和相机**: 创建一个新的Scene,一个PerspectiveCamera用于查看全景,以及一个合适的大小和位置。 ```javascript const scene = new THREE.Scene(); const camera = new THREE.PerspectiveCamera(75, container.offsetWidth / container.offsetHeight, 0.1, 1000); camera.position.set(0, 0, 0); // 置于视点中心 ``` 4. **创建球体几何体和材质**: 用THREE.SphereGeometry创建一个球体,并应用一个CubeReflectionMapping材质,使其从全景贴图反射出360度的视野。 ```javascript const geometry = new THREE.SphereGeometry(1, 60, 30); const material = new THREE.MeshBasicMaterial({ map: panoramaMap }); const sphereMesh = new THREE.Mesh(geometry, material); scene.add(sphereMesh); ``` 5. **设置相机移动和控制**: 实现用户交互,如鼠标滚轮缩放、键盘移动等,使得用户可以在全景环境中“行走”。 ```javascript function handleUserInput(event) { // ... 处理用户的输入事件,比如旋转相机 } container.addEventListener('wheel', handleUserInput); ``` 6. **渲染帧**: 定义一个渲染函数,包括循环渲染每一帧,并添加到DOM上。 ```javascript function animate() { requestAnimationFrame(animate); renderer.render(scene, camera); } renderer = new THREE.WebGLRenderer({ antialias: true }); renderer.setSize(container.offsetWidth, container.offsetHeight); container.appendChild(renderer.domElement); animate(); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值