答案 0 :(得分:6)
Wilt的回答非常有见地,但并不完全正确。代码返回一个矢量,该矢量指向摄像机指向的相同方向。这是一个很好的开始!
但是除非相机位于原点(0,0,0)(或者恰好位于将原点连接到旋转的矢量点而不超过该点以使该点位于相机后面的线段上)相机不会看到这一点。显然 - 只是常识 - 相机的位置也会影响正在观察的点。考虑一下。无论相机在何处,相机方法lookAt()
都会查看3D空间中的某个点。因此,要获得相机正在观察的点,您需要通过调用以下方式调整相机位置:
vec.add( camera.position );
值得一提的是,相机看起来并不是单点,而是俯视无限数量的点,每个点与相机的距离不同。来自Wilt的上述代码返回一个长度恰好为一个单位的向量,因为四元数应用于规范化的z轴向量(0,0,-1)会返回另一个标准化向量(在不同的方向上)。要计算相机使用距离x
处的点的外观:
(new THREE.Vector3( 0, 0, -x )).applyQuaternion( camera.quaternion ).add( camera.position );
沿z轴取一点距离原点x
,将其旋转到相机方向,然后创建一个"世界点"通过添加相机的位置。我们想要一个"世界点" (并且不是#34;相对于相机点")因为camera.lookAt()
也需要一个"世界点"作为参数。
答案 1 :(得分:3)
lookAt
无法作为向量使用,它实际上是THREE.Object3D
中的一种方法,您可以看到here。该方法用于创建应用于对象的旋转矩阵,以更改对象的旋转(方向)。
因此,如果您想知道对象的当前方向(lookAt)是什么,您必须从对象的旋转中提取此信息。
在本地空间中,摄像机向下看z轴。如果将相机旋转应用于该矢量,则结果为lookAt
或相机方向。
var vector = new THREE.Vector3( 0, 0, -1 );
vector.applyQuaternion( camera.quaternion );
同时检查this answer类似的问题。