代码之家  ›  专栏  ›  技术社区  ›  nnyby

我该怎么做一个三号。飞机总是面对镜头?

  •  0
  • nnyby  · 技术社区  · 7 年前

    Plane 没有 lookAt 方法,所以我不能这么做 lookAt(camera.position) . 相反,它的定义是 normal ,表示为矢量3。我怎么才能让这架飞机总是面对镜头?

    1 回复  |  直到 7 年前
        1
  •  1
  •   TheJim01    7 年前

    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() 获取平面位置的副本,将其在原点上反转,然后对其进行规格化。这样做的效果是创建一个将指向相机的法线,因为相机位于其自身空间的原点。这就是为什么在将所有东西转换为世界坐标后,需要根据相机的位置调整法线。