javascript - Three.js:无法补间对象位置var(出现空错误),但对象本身实际上可用

标签 javascript inheritance canvas three.js gsap

尝试使用函数 flyUp() 来定位我的 pig 对象 position var。但函数 flyUp() 中的 pig.position 收到 null 错误。然而,对象pig实际上可以在flyUp()函数中使用。我还在 PigcreatePig 上收到错误 THREE.Object3D.add: object not an instance of THREE.Object3D。我在这里做错了什么?

Here's a plunker

相关js如下:

function createPig(){
  pig = new Pig();
 scene.add(pig.threegroup);
}

Pig.prototype.update = function() {
  this.wingAngle += this.wingSpeed/globalSpeedRate;
  this.wingL.rotation.z = -Math.PI / 4 + Math.cos(this.wingAngle) * this.wingAmplitude;
  this.wingR.rotation.z = Math.PI / 4 - Math.cos(this.wingAngle) * this.wingAmplitude;
}

function getFlyPosition(){
    scene.updateMatrixWorld(true);
    var position = new THREE.Vector3();
    position.setFromMatrixPosition(pig.matrixWorld );
    objectHeight = position.y;
    flyTime = Math.round(position.y/30);
    console.log('cube Y = ' + position.y + ', Flytime = ' + flyTime);
}


function flyUp(){
  console.log(this.pig);
    if (objectHeight < maxHeight) {
      TweenLite.to(pig.position, 2.0, {y: "+=45", ease:Expo.easeOut} );
      } else { 
        flyDown();
    }
}

function flyDown(){
    getFlyPosition();
    TweenLite.to(pig.position, flyTime, {y: 25, ease:Sine.easeInOut} );
}

以下是完整的错误:

**error 1**
THREE.Object3D.add: object not an instance of THREE.Object3D. undefinedT
HREE.error @ three.js:35
THREE.Object3D.add @ three.js:7770
Pig @ script.js:452
createPig @ script.js:160
(anonymous function) @ script.js:553

**error 2**
Uncaught Cannot tween a null target.(anonymous function) @        TweenMax.min.js:16
D.to @ TweenMax.min.js:17
flyUp @ script.js:515
handleMouseDown @ script.js:100

**error 3**
Uncaught TypeError: Cannot read property 'elements' of undefined
THREE.Vector3.setFromMatrixPosition @ three.js:2389
getFlyPosition @ script.js:505flyDown @ script.js:522
handleMouseUp @ script.js:104

最佳答案

这是我能够调试的内容:

  • 第一个错误是因为您没有像初始化其他对象(例如 this.torso)那样初始化 this.tailSpiral 对象this.wingL 等。此错误发生在 plnkr script.js 文件的 452 行。暂时注释掉这一行可以解决问题。所以基本上,您需要为 tailSpiral 创建一个 ThreeJS 对象,就像您对其余部分所做的那样。

  • 对于第二个错误,据我所知,pig 对象本身没有 position 属性。相反,position 对象在 body 对象中可用,而 body 对象在 pig 对象中可用。此错误发生在行:514,也将发生在:522。因此,这些行需要看起来像:TweenLite.to(pig.body.position, 2.0, { y: ... });

  • 最后,505 行的错误也是如此。 matrixWorld 属性不能直接用于 position 对象。相反,一个 body 对象位于它们之间。所以这一行需要看起来像:position.setFromMatrixPosition(pig.body.matrixWorld);

希望这有帮助。

关于javascript - Three.js:无法补间对象位置var(出现空错误),但对象本身实际上可用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32020209/

相关文章:

javascript - 聚焦在asp.net中的文本框后,如何在css中激活div的功能?

javascript - Angular/ typescript : arrays in typescript changing when an independent element got changed

php - PHP 中的原型(prototype)继承(类似于 JavaScript)

java - Buttom "Save"保存空白 Canvas

javascript - 如何从点击的数字中获取值(数字)

javascript - 选择中的渲染选项失败

c++ - 为什么将一个结构体的引用设置为等于另一个结构体只会改变一个数据成员?

c++ - 为什么 `this`调用派生类对象时无法从基类方法访问派生类成员

jquery - 以比屏幕更高的 DPI 创建 Canvas 对象?

javascript - 使用 html5 canvas 进行墙壁碰撞检测