从两个单独的对象发出在Three.JS中对齐面的问题

时间:2014-11-27 03:06:02

标签: javascript three.js normals

我的three.js代码中存在问题。

我试图通过选择两个面来对齐两个对象,并使第二个面(和对象)旋转以匹配第一个对象的所选面的法线向量。

到目前为止,我有:

var normalMatrix = new THREE.Matrix3().getNormalMatrix( object.matrixWorld );
var worldNormal = face.normal.clone().applyMatrix3( normalMatrix ).normalize();
var normalMatrixRef = new THREE.Matrix3().getNormalMatrix( objectRef.matrixWorld );
var worldNormalRef = faceRef.normal.clone().applyMatrix3( normalMatrixRef).normalize();

其中:object是我的旋转对象,face是该对象的选定面,objectRef是静止对象引用,faceRef是我想要匹配的对象的法线。

在做之前

  object.lookAt(worldNormalRef);

,我正在尝试

object.up = new THREE.Vector3(0,0,1); 
object.up = worldNormal;
object.up = face.normal; 

并且都不起作用。

任何一个object.up案例都不能正常工作。当我执行操作时,目标对象(要旋转的对象)会旋转,但不会正确对齐面。它是任意的,但不知何故与物体的当前旋转有关(即:有时它会沿着(0,1,0)旋转或同时旋转,如果我预旋转物体它只是略微旋转一下。

理论上,lookAt使用了我的faceRef所使用的世界向量,只要我设置了' up'正确地说,它应该有效,但它不会发生。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

我在我的代码中发现了这个问题,我希望它可以在将来帮助某人。

object.lookAt(worldNormalRef); 
而是需要修改

以将新面法线添加到当前对象的位置以使lookAt正常运行:

//create a point to lookAt
var newPoint = new THREE.Vector3(
    object.position.x + worldNormalRef.x,
    object.position.y + worldNormalRef.y,
    object.position.z + worldNormalRef.z
);

object.up = face.normal;//Z axis up
object.lookAt(newPoint ); 

另请注意,object.up应该如上所述设置为face.normal(我希望与参考对象的脸对齐),而不是上面设置的worldNormal(我将删除此我代码的一部分)。