韦伯格尔 如何显示精灵?错误:未捕获的类型错误:无法读取 SpritePlugin.render 上未定义的属性'x'



我是一个有三个.js的乞丐。

我尝试了在这里找到的代码:创建场景

然后我尝试使用此处找到的代码添加一个精灵:精灵

但是我无法使其工作,因为我收到以下错误:

Uncaught TypeError: Cannot read property 'x' of undefined
    at SpritePlugin.render (three.js:6973)
    at WebGLRenderer.render (three.js:21007)
    at render (sprite.html:43)

html文件在那里:http://www.planetarium2016.com/sprite.html

我的错误在哪里?这是我的代码:

<html>
    <head>
        <title>My first three.js app</title>
        <style>
            body { margin: 0; }
            canvas { width: 100%; height: 100% }
        </style>
    </head>
    <body>
        <script src="https://rawgithub.com/mrdoob/three.js/master/build/three.js"></script>
        <script>
            var scene = new THREE.Scene();
            var camera = new THREE.PerspectiveCamera( 75, window.innerWidth/window.innerHeight, 0.1, 1000 );
            var renderer = new THREE.WebGLRenderer();
            renderer.setSize( window.innerWidth, window.innerHeight );
            document.body.appendChild( renderer.domElement );
            // instantiate a loader
            var loader = new THREE.TextureLoader();
            //allow cross origin loading
                //loader.crossOrigin = '';
            // load a resource
            loader.load("https://codefisher.org/static/images/pastel-svg/256/bullet-star.png");
            var spriteMaterial = new THREE.SpriteMaterial( { map: loader, color: 0xffffff } );
            var sprite = new THREE.Sprite( spriteMaterial );
            sprite.scale.set(200, 200, 1);
            scene.add( sprite );
            camera.position.z = 2;
            var render = function () {
                requestAnimationFrame( render );
                renderer.render(scene, camera);
            };
            render();
        </script>
    </body>
</html>
我会

说下面的行可以修复错误。

var spriteMap = loader.load("https://codefisher.org/static/images/pastel-svg/256/bullet-star.png");
var spriteMaterial = new THREE.SpriteMaterial( { map: spriteMap, color: 0xffffff } );

requestAnimationFrame是必要的。让我们保持render函数不变。

好吧,即使说它很容易,显示一个简单的精灵与三个.js webGL是一个相当大的问题。

我遇到了许多错误,我需要结合两种解决方案才能成功:

  • WebGl - 未加载纹理
  • 三.js - 如何等待图像加载?

    1. 如果不在服务器上运行,则需要将映像转换为二进制
    2. 您需要等待图像加载才能继续。

最后,以下代码有效:

<html>
    <head>
        <title>My first three.js app</title>
        <style>
            body { margin: 0; }
            canvas { width: 100%; height: 100% }
        </style>
    </head>
    <body>
        <script src="https://rawgithub.com/mrdoob/three.js/master/build/three.js"></script>
        <script>
            var scene = new THREE.Scene();
            var camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 1, 500);
            camera.position.set(0, 10, 100);
            camera.lookAt(new THREE.Vector3(0, 0, 0));
            var renderer = new THREE.WebGLRenderer();
            renderer.setSize( window.innerWidth, window.innerHeight );
            document.body.appendChild( renderer.domElement );
            var material = new THREE.LineBasicMaterial({ color: 0x0000ff });
            var geometry = new THREE.Geometry();
            var a = 5;
            geometry.vertices.push(new THREE.Vector3(-a, 0, 0));
            geometry.vertices.push(new THREE.Vector3(0, a, 0));
            geometry.vertices.push(new THREE.Vector3(a, 0, 0));
            geometry.vertices.push(new THREE.Vector3(0, 0, -a));
            var line = new THREE.Line(geometry, material);
            scene.add(line);
            var img = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAABISURBVDhPzc1bCgAgCETR9r9poxynEHoIEp0vLS4WCWpBMfq09yYI8QFuTfBhlgFXHSgj4KB0pYzAwYfx+9FVgFv92ifBIFIBJq9zqYwecEQAAAAASUVORK5CYII=";
            var loader = new THREE.TextureLoader();
            var spriteMaterial = new THREE.SpriteMaterial( { color: 0x00ff00 } );
            var spriteMaterial;
            loader.load(img,
                function(texture)
                    {
                        spriteMaterial.map = texture;
                        spriteMaterial.needsUpdate = true;
                    }
                );
            var sprite = new THREE.Sprite( spriteMaterial );
            sprite.scale.set(6, 6, 1);
            sprite.position.set( 0, 6, -6 );
            scene.add( sprite );
            var render = function () {
                requestAnimationFrame( render );
                renderer.render(scene, camera);
            };
            render();
        </script>
    </body>
</html>

相关内容

最新更新