我的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'正确地说,它应该有效,但它不会发生。
有什么想法吗?
答案 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(我将删除此我代码的一部分)。