javascript - 如何在 Three.js 中定位 Sprite ?

标签 javascript three.js

我目前正在使用 PointCloud 生成粒子系统,但在其中我希望有一个 Sprite 漂浮在我的指示位置。当我尝试使用这个 Three.js 示例时:http://threejs.org/examples/#webgl_sprites我发现正交相机限制了我仍然缩放的能力。

        var container, stats;
        var camera, scene, renderer, particles, geometry, materials =[], i, h, color, sprite, size;
        var mouseX = 0, mouseY = 0;

        var windowHalfX = window.innerWidth / 2;
        var windowHalfY = window.innerHeight / 2;

        init();
        animate();

        function init() {

            container = document.createElement( 'div' );
            document.body.appendChild( container );

            camera = new THREE.PerspectiveCamera( 55, window.innerWidth / window.innerHeight, 2, 2000 );
            camera.position.z = 1000;

            scene = new THREE.Scene();
            scene.fog = new THREE.FogExp2( 0x000000, 0.001 );

            geometry = new THREE.Geometry();

            sprite = THREE.ImageUtils.loadTexture( "disc.png" );


            for ( i = 0; i < 5000; i ++ ) {

                var vertex = new THREE.Vector3();
                vertex.x = 2000 * Math.random() - 1000;
                vertex.y = 2000 * Math.random() - 1000;
                vertex.z = 2000 * Math.random() - 1000;

                geometry.vertices.push( vertex );

            }

            // size = Math.random() * 10;

            material = new THREE.PointCloudMaterial( { size: 5, sizeAttenuation: false, map: sprite, alphaTest: 0.5, transparent: true } );

            particles = new THREE.PointCloud( geometry, material );
            scene.add( particles );

            var map2 = THREE.ImageUtils.loadTexture( "astronaut.png" );
            var material2 = new THREE.SpriteMaterial( { map: map2, color: 0xffffff, fog: true } );
            var sprite2 = new THREE.Sprite( material2 );
            sprite2.position.x = 0;
            sprite2.position.y = 0;
            sprite2.position.z = 498;
            scene.add( sprite2 );


            //

            renderer = new THREE.WebGLRenderer();
            renderer.setPixelRatio( window.devicePixelRatio );
            renderer.setSize( window.innerWidth, window.innerHeight );
            container.appendChild( renderer.domElement );

            //

            document.addEventListener( 'mousemove', onDocumentMouseMove, false );
            document.addEventListener( 'touchstart', onDocumentTouchStart, false );
            document.addEventListener( 'touchmove', onDocumentTouchMove, false );

            //

            window.addEventListener( 'resize', onWindowResize, false );

        }

        function onWindowResize() {

            windowHalfX = window.innerWidth / 2;
            windowHalfY = window.innerHeight / 2;

            camera.aspect = window.innerWidth / window.innerHeight;
            camera.updateProjectionMatrix();

            renderer.setSize( window.innerWidth, window.innerHeight );

        }

        function onDocumentMouseMove( event ) {

            mouseX = event.clientX - windowHalfX;
            mouseY = event.clientY - windowHalfY;

        }

        function onDocumentTouchStart( event ) {

            if ( event.touches.length == 1 ) {

                event.preventDefault();

                mouseX = event.touches[ 0 ].pageX - windowHalfX;
                mouseY = event.touches[ 0 ].pageY - windowHalfY;

            }
        }

        function onDocumentTouchMove( event ) {

            if ( event.touches.length == 1 ) {

                event.preventDefault();

                mouseX = event.touches[ 0 ].pageX - windowHalfX;
                mouseY = event.touches[ 0 ].pageY - windowHalfY;

            }

        }

        //

        function animate() {

            requestAnimationFrame( animate );

            render();


        }

        function render() {

            var time = Date.now() * 0.00005;

            camera.position.x += ( mouseX - camera.position.x ) * 0.05;
            camera.position.y += ( - mouseY - camera.position.y ) * 0.05;

            camera.lookAt( scene.position );

            h = ( 360 * ( 1.0 + time ) % 360 ) / 360;

            renderer.render( scene, camera );

        }

我尝试解决这个问题是:

var map2 = THREE.ImageUtils.loadTexture( "astronaut.png" );
var material2 = new THREE.SpriteMaterial( { map: map2, color: 0xffffff, fog: true } );
var sprite2 = new THREE.Sprite( material2 );
sprite2.position.x = 0;
sprite2.position.y = 0;
sprite2.position.z = 498;
scene.add( sprite2 );

现在,当我第一次加载时, Sprite 位于屏幕中央,但当我开始移动相机时, Sprite 立即消失。理想情况下,我希望 astronaut.png Sprite 与其他粒子一起移动,但如果这很困难,让他始终固定在屏幕中心也可以很好地工作。

最佳答案

我自己解决了这个问题。我创建了第二个 THREE.Geometry 和 THREE.Vector3,并用顶点定位它。

geometry2 = new THREE.Geometry();
var vertex2 = new THREE.Vector3(0, 0, -50);

geometry2.vertices.push( vertex2 );

var material2 = new THREE.PointCloudMaterial( { size: 100, sizeAttenuation: false, map: map2, alphaTest: 0.5, transparent: true } );

particles2 = new THREE.PointCloud( geometry2, material2 );
scene.add( particles2 );

关于javascript - 如何在 Three.js 中定位 Sprite ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31257006/

相关文章:

javascript - 球体内的三个js视频位置

javascript - 在 Handlebars 中显示特定行数据而不使用每个子句

javascript - 在 Javascript 中,num = +thenum || 是什么意思?假的意思?

javascript - jquery深度替换

javascript - 三个js添加灯光onclick

javascript - Three.js 从一个位置到另一个位置的动画

javascript - 如何在 Three.js 中设置挤出高度?

javascript - 调整窗口大小但保持缩放级别

javascript - 可点击行内的按钮正在激活行突出显示

javascript - 如何在没有框架的情况下将点击绑定(bind)到 anchor (javascript)