2013-09-30 60 views
0

我正在做第2章 - WebGL啓動和運行書中的例子。three.js不渲染,必須有requestAnimationFrame?

我想顯示一個靜態紋理映射立方體。

此代碼不起作用:

var camera = null, 
renderer = null, 
scene = null, 
cube = null, 
animating = false; 

function onLoad() { 
// Grab our container div 
var container = document.getElementById("container"); 
// Create the Three.js renderer, add it to our div 
renderer = new THREE.WebGLRenderer({ 
    antialias: true 
}); 
renderer.setSize(container.offsetWidth, container.offsetHeight); 
container.appendChild(renderer.domElement); 
// Create a new Three.js scene 
scene = new THREE.Scene(); 
// Put in a camera 
camera = new THREE.PerspectiveCamera(45, 
    container.offsetWidth/container.offsetHeight, 1, 4000); 
camera.position.set(0, 0, 3); 
// Create a directional light to show off the object 
var light = new THREE.DirectionalLight(0xffffff, 1.5); 
light.position.set(0, 0, 1); 
scene.add(light); 
// Create a shaded, texture-mapped cube and add it to the scene 
// First, create the texture map 
var mapUrl = "cuttherope.jpg"; 
var map = THREE.ImageUtils.loadTexture(mapUrl); 
// Now, create a Phong material to show shading; pass in the map 
var material = new THREE.MeshPhongMaterial({ 
    map: map 
}); 
// Create the cube geometry 
var geometry = new THREE.CubeGeometry(1, 1, 1); 
// And put the geometry and material together into a mesh 
cube = new THREE.Mesh(geometry, material); 
// Turn it toward the scene, or we won't see the cube shape! 
cube.rotation.x = Math.PI/5; 
cube.rotation.y = Math.PI/5; 
// Add the cube to our scene 
scene.add(cube); 
renderer.render(scene, camera); 

}

但之後我添加了一個run函數並調用requestAnimationFrame,它顯示了立方體

... 
cube.rotation.x = Math.PI/5; 
cube.rotation.y = Math.PI/5; 
// Add the cube to our scene 
scene.add(cube); 
run(); 
} 

function run() { 
renderer.render(scene, camera); 
requestAnimationFrame(run); 

}

有人可以解釋我爲什麼嗎? 謝謝!

回答

3

紋理(地圖)異步加載,所以在第一個示例中,當您調用render()時,紋理還不可用。您需要有一個紋理加載回調來加載圖像時重新呈現,或者如您對requestAnimationFrame所做的那樣,具有連續的呈現循環。