如何制作三张。飞机始终面对镜头?

时间:2018-10-17 15:09:34

标签: javascript three.js

Plane没有lookAt方法,所以我不能只做lookAt(camera.position)。而是用normal定义,表示为Vector3。如何使飞机始终面向相机?

1 个答案:

答案 0 :(得分:1)

Plane.setFromNormalAndCoplanarPoint可用于完成此操作。

举一个简单的例子,假设您的相机在绕原点旋转。在这种情况下,您可以将飞机设置为非常容易面对相机:

// assume plane is a THREE.Plane
plane.setFromNormalAndCoplanarPoint( camera.position.clone().normalize(), scene.position )

这将相机的(标准化)位置用作平面的法线,在这种情况下可以使用。

如果您的相机在自由空间中的某个地方,朝任意方向看,这会有点困难,但这主要是可视化。

请记住,相机位于其自己的“空间”中,位于原点,并向下观察-Z轴。现在想象一下在该空间中需要在何处创建飞机。我们只说它可以放在( 10, 10, -10 )处。我们可以再次使用一些简单的操作来计算法线。 “困难”部分是将一切都移到世界空间,但是three.js对此也具有便利功能。

// in camera space...
let planePosition = new THREE.Vector3( 10, 10, -10 )
let normal = planePosition.clone().inverse().normalize()

// convert to world space...
camera.localToWorld( planePosition )
camera.localToWorld( normal )
normal.sub( camera.position ) // fix the normal based on the camera position

plane.setFromNormalAndCoplanarPoint( normal, planePosition )

关于上面的代码的一个注释,planePosition.clone().inverse().normalize()获得了平面位置的副本,将其在原点上反转,然后对其进行规范化。这具有创建指向摄影机的法线的效果,因为摄影机位于其自身空间的原点。这就是为什么在将所有内容都转换为世界坐标之后,您需要根据相机的位置调整法线的原因。