三.js:无法补间对象位置 var(获得 null 错误),但对象本身实际上是可用的

Three.js: unable to tween objects position var (getting null error), but object itself is actually available

本文关键字:对象 实际上 错误 获得 js var 位置 null      更新时间:2023-09-26

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

这是一个笨蛋

以下是相关的 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.torsothis.wingL等(那样初始化this.tailSpiral对象。此错误发生在 plnkr script.js文件的第 452 行。暂时注释掉此行可解决此问题。所以基本上,你需要为tailSpiral创建一个 ThreeJS 对象,就像你正在做的其余部分一样。

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

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

希望这有帮助。