如何通过旋转对象使Object3D的脸看到另一个面(例如地板)

时间:2017-03-24 16:26:53

标签: javascript vector three.js rotation normals

Sitation

一个地板和一个直接漂浮在其上方的物体。

我想做什么

当我点击一个物体的一个面时,我想让整个物体旋转,使点击的面朝向地面。

到目前为止我尝试了什么

  1. 点击任意对象face:Raycaster选择第一个face
  2. 使用点击的up的{​​{1}}替换对象的normal向量:face
  3. 致电object.up.copy(face.normal)
  4. 我希望由于新的object.lookAt(floor.position)向量,对象会在地板上看到基于点击面的方向。

    但是,旋转无法按预期工作。我错过了什么?

    相关代码部分:

    up

    整个代码

    http://codepen.io/anon/pen/EWRdZq

    (更新)固定代码

    基于@WestLangley的回答: http://codepen.io/anon/pen/ryZOvx

1 个答案:

答案 0 :(得分:0)

您想要旋转对象,使面部的法线指向特定方向。

在您的示例中,所需的方向是负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