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

根据摄像机阵列平滑移动摄像机位置

  •  1
  • Thrindil  · 技术社区  · 6 年前

    我目前正在尝试使用预定义的摄影机位置数组平滑地更改摄影机的位置。 应该是这样的:

    • 我按 空间 ,并且摄像头应平滑地切换到 相机阵列中的相机0
    • 我按 空间 再次,相机应平稳地切换到 相机阵列中的相机1
    • public class CameraWaypoints : MonoBehaviour {
      
      public Camera[] CamPOVs;
      private Camera _main;
      private int _indexCurrentCamera;
      private int _indexTargetCamera;
      private float _speed = 0.1f;
      
      void Start () {
          _indexTargetCamera = 0;
          _main = Camera.main;
      
          //disable all camera's
          for (int i = 0; i < CamPOVs.Length; i++)
          {
              CamPOVs[i].enabled = false;
          }
      
          _indexCurrentCamera = 0;
      }
      
      // Update is called once per frame
      void Update () {
      
          if (Input.GetKeyDown(KeyCode.Space))
          {
              if (_indexTargetCamera < CamPOVs.Length)
              {
                  _indexCurrentCamera = _indexTargetCamera;
                  _indexTargetCamera++;
              }
          }
      
          //prevent array out of bounds
          if (_indexTargetCamera >= CamPOVs.Length)
          {
              _indexTargetCamera = 0;
          }
      
          _main.transform.position = Vector3.Lerp(CamPOVs[_indexCurrentCamera].transform.position, CamPOVs[_indexTargetCamera].transform.position, Time.time * _speed);
      
          _main.transform.rotation = CamPOVs[_indexTargetCamera].transform.rotation;
      
      
      }
      }
      

    使用我当前的解决方案,相机实际上会平滑地移动到目标。 然而,一旦到达该目标,在随后按空格键时,相机只会更改为目标,而不会平滑。

    这就好像一旦成功完成了一次lerp,就不会再进行lerp,当然,除非我重新启动。

    编辑:澄清:按空格键时,摄影机目标实际上会更改,并且摄影机会跟随此目标。问题是,一旦相机位置到达目标位置一次,它就不会再平滑地lerp到目标,而是立即改变其到目标的位置。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Lece    6 年前

    之后按空格键时,相机只会切换到目标, 没有平滑。

    当您按下 space 源和目标都已更改,因此您可以立即设置变换的位置。

    一旦lerp成功完成一次,就永远不会进行lerp 当然,除非我重新开始。

    从文档:

    1、时间。时间

    这是自 开始 游戏的

    2、矢量3。Lerp公司

    参数t(时间)为 钳制到范围[0,1]

    所以 Time.time 将继续上升,但 Lerp 将夹紧到最大值1。当您计算时 Time.time * 0.1 (your speed) 要达到你的目标需要10秒钟。任何超过10秒的内容都将被限制为1,这将导致立即跳转到您的目的地。使用 Time.deltaTime 相反

    此外,您不需要多个摄影机来充当位置目标。一组变换就可以了。

    综上所述,它应该是这样的:

    public class CameraWaypoints : MonoBehaviour
    {
        public Transform[] CamPOVs;
        public float _speed = 0.1f;
    
        private Camera _main;
        private int _indexTargetCamera;        
    
        void Awake ()
        {
            _main = Camera.main;
            _indexTargetCamera = 0;         
        }
    
        void Update ()
        {
            if (Input.GetKeyDown(KeyCode.Space))
            {
                _indexTargetCamera = ++_indexTargetCamera % CamPOVs.Length;
            }
    
             var time = Time.deltaTime * _speed;
    
             // Alternatives to Lerp are MoveTowards and Slerp (for rotation)  
             var position = Vector3.Lerp(_main.transform.position, CamPOVs[_indexTargetCamera].position, time);
             var rotation = Quaternion.Lerp(_main.transform.rotation, CamPOVs[_indexTargetCamera].rotation, time);
    
            _main.transform.position = position;
            _main.transform.rotation = rotation;
        }
    }