我在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 ) );
任何帮助都会很棒。
答案 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 );
};