【问题标题】:Issue aligning faces in Three.JS from two seperate objects问题在 Three.JS 中从两个单独的对象对齐面
【发布时间】:2015-01-25 13:32:40
【问题描述】:

我的 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 所在的世界向量,只要我正确设置了“向上”,它应该可以工作,但不能。

有什么想法吗?

【问题讨论】:

    标签: javascript three.js normals


    【解决方案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(我将删除这部分代码)。

    【讨论】:

      猜你喜欢
      • 2013-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多