【问题标题】:ThreeJS camera facing pointThreeJS 摄像头朝向点
【发布时间】:2015-07-01 21:45:02
【问题描述】:

在 ThreeJS 中,如果相机以任意给定角度旋转,我如何确定该点在相机所面对方向上恰好 1 个单位的坐标。

如果你不熟悉 ThreeJS 相机的旋转角度,旋转是非常非常奇怪的。

例如,如果我所有的旋转变量都是 0,那么函数将返回 (0, 0, -1)。

如果旋转 x 为 Pi / 2(90 度),则函数将返回 (1, 0, 0)

我怎样才能创建一个函数来做到这一点?我不需要所有东西,主要是数学。

【问题讨论】:

  • 你提到的“角度”是什么,它们代表什么旋转(轴、序列等)。
  • ThreeJS 相机旋转角度很奇怪。如果你没有使用过它,它会非常混乱。我会更新问题以使其更清楚
  • 另外,角度必须是弧度,所以 PI / 2 是 90 度
  • 如果你用它的矩阵(而不是角度)来表达相机,那么stackoverflow.com/questions/14023764/…就有了答案。你可以计算相机的方向,如果你知道它的位置,你就可以计算出你需要的点。
  • 您的帖子中有许多虚假陈述。您将不得不进行试验,直到您了解三个.js 中的旋转是如何工作的。

标签: javascript algorithm math rotation three.js


【解决方案1】:

您想获得一个点的世界位置,该点位于相机前方一个单位。

一种方法是在相机前面添加一个对象,并将其作为相机的子对象。然后你只需要查询物体的世界位置。

默认情况下,当相机的旋转为 ( 0, 0, 0 ) 时,相机向下看它的负 z 轴。所以这是要遵循的模式:

var object = new THREE.Object3D();
object.position.set( 0, 0, - 1 );

scene.add( camera ); // this is required when the camera has children
camera.add( object );

现在,你可以像这样得到你需要的点:

var worldPos = new THREE.Vector3(); // create once and reuse it

...

camera.updateMatrixWorld(); // this is called in the render loop, so you may not have to call it again. Experiment.

worldPos.setFromMatrixPosition( object.matrixWorld );

three.js r.71

【讨论】:

  • 所以对象的位置会随着相机的旋转而更新?
  • 是的。尝试object.position.set( 0, 0, - 100 ) 和另一个网格作为对象的子对象,您将看到网格始终在相机前面。
猜你喜欢
  • 2019-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-08
  • 2012-01-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多