我是一个有三个.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 - 如何等待图像加载?
- 如果不在服务器上运行,则需要将映像转换为二进制
- 您需要等待图像加载才能继续。
最后,以下代码有效:
<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>