Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何制作Object3D';通过旋转物体看另一张脸(如地板) 网络引文_Javascript_Vector_Three.js_Rotation_Normals - Fatal编程技术网

Javascript 如何制作Object3D';通过旋转物体看另一张脸(如地板) 网络引文

Javascript 如何制作Object3D';通过旋转物体看另一张脸(如地板) 网络引文,javascript,vector,three.js,rotation,normals,Javascript,Vector,Three.js,Rotation,Normals,具有地板和漂浮在其正上方的对象的场景 我想做什么 当我单击一个对象的面时,我希望整个对象以这样的方式旋转,即单击的面面向地板 到目前为止我都试过了 单击任何对象的面:光线投射器拾取第一个面 将对象的up向量替换为单击的face的normal:object.up.copy(face.normal) 调用object.lookAt(floor.position) 我希望,由于新的up向量,对象将以基于单击的面的方向注视地板 但是,旋转没有按预期工作。我错过了什么 有关守则部分: var inters

具有地板和漂浮在其正上方的对象的场景

我想做什么 当我单击一个对象的面时,我希望整个对象以这样的方式旋转,即单击的面面向地板

到目前为止我都试过了
  • 单击任何对象的
    :光线投射器拾取第一个
  • 将对象的
    up
    向量替换为单击的
    face
    normal
    object.up.copy(face.normal)
  • 调用
    object.lookAt(floor.position)
  • 我希望,由于新的
    up
    向量,对象将以基于单击的面的方向注视地板

    但是,旋转没有按预期工作。我错过了什么

    有关守则部分:

    var intersects = raycaster.intersectObject( cylinder );
        if(intersects === undefined || intersects.length === 0) return;
    
    
        let face = intersects[0].face;
    
        // Set cylinders up to the normal of the intersected face to reoriented object
        // to make the clicked-on face `lookAt()` the floor:
        cylinder.up.copy(face.normal);
        cylinder.up.normalize();
        cylinder.lookAt(floor.position);
    
    全部代码

    (更新)固定代码 根据@WestLangley的回答:

    要旋转对象,使面法线指向特定方向

    在您的示例中,所需的方向是负y轴的方向,但您可以指定任何方向向量,只要它具有单位长度

    您可以使用如下模式:

    let direction = new THREE.Vector3( 0, - 1, 0 ); // create once and reuse
    
    ...
    
    let object = intersects[ 0 ].object;
    let normal = intersects[ 0 ].face.normal;
    
    object.quaternion.setFromUnitVectors( normal, direction );
    
    请注意,您的问题陈述没有唯一的解决方案。例如,对象可以在轴上“旋转”,并且仍然使面朝向所需的方向


    three.js r.84

    您希望旋转对象,使面法线指向特定方向

    在您的示例中,所需的方向是负y轴的方向,但您可以指定任何方向向量,只要它具有单位长度

    您可以使用如下模式:

    let direction = new THREE.Vector3( 0, - 1, 0 ); // create once and reuse
    
    ...
    
    let object = intersects[ 0 ].object;
    let normal = intersects[ 0 ].face.normal;
    
    object.quaternion.setFromUnitVectors( normal, direction );
    
    请注意,您的问题陈述没有唯一的解决方案。例如,对象可以在轴上“旋转”,并且仍然使面朝向所需的方向


    three.js r.84

    您缺少的是
    lookAt()
    对对象进行定向,使对象的局部正z轴指向所需的方向。对象的上方向向量保持对象“右侧向上”。缺少的是
    lookAt()
    使对象定向,以便对象的局部正z轴指向所需的方向。对象的上方向向量保持对象“右侧向上”。啊,感谢您清除
    up
    用法。还完全错过了
    setFromUnitVectors()
    ,它显然正是我想要做的仅供参考,上面第1行中的四元数以后将不再使用。其余部分有效。已修复。谢谢-啊,谢谢你清理
    up
    用法。还完全错过了
    setFromUnitVectors()
    ,它显然正是我想要做的仅供参考,上面第1行中的四元数以后将不再使用。其余部分有效。已修复。谢谢-