未捕获的TypeError:无法读取未定义的属性“旋转”

时间:2019-12-02 09:02:14

标签: javascript three.js

Three.js的新手,我正在关注文档,当涉及到这一点时:

                 function animate(renderer, scene, camera, cube) {
                    requestAnimationFrame( animate);
                    cube.rotation.x += 0.01;
                    cube.rotation.y += 0.01;
                    renderer.render( scene, camera );
                 }

                 function init() {
                   var scene = new THREE.Scene(); //setup scene
                   var camera = new THREE.PerspectiveCamera(75, window.innerWidth / 
                   window.innerHeight, 0.1, 1000);//setup camera; 75= fov is the extent of the scene 
                   that is seen on the display at any given moment; il rapporto è l'asect ratio;

                   var renderer = new THREE.WebGLRenderer();//setup renderer;renderer istance;
                   renderer.setSize(window.innerWidth, window.innerHeight);
                   document.body.appendChild(renderer.domElement);

                   var geometry = new THREE.BoxGeometry(1, 1 , 1); //thisobject that contains all 
                   the points;
                   var material = new THREE.MeshBasicMaterial({ color:0x00ff00 }); // to color it;
                   var cube = new THREE.Mesh( geometry, material); // object that takes a geometry 
                   and applies a material it;
                   console.log(cube);
                   scene.add(cube);
                   camera.position.z = 5; // move the camera a little bit from the cube,

                   animate(renderer, scene, camera, cube);
                 }
                   window.onload = init;

我正在尝试加载对象,然后对其执行旋转操作,但是报告了错误。对象加载正常,但报告许多相同的错误。我已经研究了这个问题,并且了解到它可能与对象的异步加载有关,但是我只是想不通这对我的应用

2 个答案:

答案 0 :(得分:0)

  

我已经研究了这个问题,并且了解到它可能与对象的异步加载有关

您的问题与异步加载无关,因为您不是从后端加载资产。

实际的问题是您在cube函数内部声明了init()。因此,该变量在animate()中不可见。解决方案是在两个函数之外声明cube

答案 1 :(得分:0)

要弄清楚@ Mugen87的答案,您不需要将整个定义移到外面,只需将变量声明移到外面。

var cube = null

function animate(){
  // ...
}

function init(){
  // ...
  cube = new THREE.Mesh( geometry, material );
  // ...
}

JavaScript在功能上是作用域的,这意味着其变量的作用域仅限于定义它们的函数(包括在同一作用域中定义的任何函数)。