旋转的子对象看着相机,在Three.js中使用lookaAt()和worldToLocal()

时间:2014-05-15 16:49:28

标签: javascript camera rotation position three.js

我在lookAt()方法中构建了three.js。 我有像这样的层次对象结构

var obj1 = new THREE.Object3D();
obj1.position.x=200;
obj1.rotation.x=0.1;
scene.add(obj1);

var obj2 = new THREE.Object3D();
obj2.position.y=-400;
obj2.rotation.y=0.21;
obj1.add(obj2);

var obj3 = new THREE.Object3D();
obj3.position.z=-200;
obj3.rotation.x=0.1;
obj3.rotation.y=-0.1;
obj2.add(obj3);

当我打电话

obj1.lookAt(camera.position);

它正常工作,但当我从子对象调用该方法时,如

obj3.lookAt(camera.position);

轮换错误。

由于父对象的旋转似乎是问题所在,我想到将摄像机的世界位置转换为对象的本地位置,但我并没有让它在核心工作。

var vector = new THREE.Vector3();
vector.setFromMatrixPosition( camera.matrixWorld );
obj3.lookAt( obj3.worldToLocal( vector ) );

任何帮助都会很棒。

1 个答案:

答案 0 :(得分:0)

只需添加这些原型,然后使用.lookAtW(vector)

而不是.lookAt(vector)。
THREE.Object3D.prototype.worldToLocal = function ( vector ) {
    if ( !this.__inverseMatrixWorld ) this.__inverseMatrixWorld = new THREE.Matrix4();
    return  vector.applyMatrix4( this.__inverseMatrixWorld.getInverse( this.matrixWorld ));
};


THREE.Object3D.prototype.lookAtWorld = function( vector ) {
   vector = vector.clone();
   this.parent.worldToLocal( vector );
   this.lookAt( vector );
};