【发布时间】:2015-03-13 12:06:37
【问题描述】:
【问题讨论】:
标签: javascript camera three.js
【问题讨论】:
标签: javascript camera three.js
威尔特的这个回答很有见地,但并不完全正确。该代码返回一个向量,该向量指向与相机指向的方向相同的方向。这是一个很好的开始!
但除非相机位于原点 (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 );
这会在距离原点x 的 z 轴上取一个点,将其旋转到相机的方向,然后通过添加相机的位置来创建一个“世界点”。我们想要一个“世界点”(而不是“相对于相机点”),因为camera.lookAt() 也将“世界点”作为参数。
【讨论】:
lookAt 不能用作向量,它实际上是THREE.Object3D 中的一个方法,如您所见here。该方法用于创建一个旋转矩阵,应用于对象以改变对象的旋转(方向)。
因此,如果您想知道对象的当前方向(lookAt)是什么,您必须从对象的旋转中提取此信息。
在本地空间中,相机正在向下看 z 轴。如果将相机旋转应用于该矢量,则结果是lookAt 或相机的方向。
var vector = new THREE.Vector3( 0, 0, -1 );
vector.applyQuaternion( camera.quaternion );
也可以查看this answer 来回答类似的问题。
【讨论】: