ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

主流游戏相机实现 之Cinemachine 概述

2022-07-21 14:03:34  阅读:173  来源: 互联网

标签:镜头 游戏 实现 相机 虚拟 概述 Cinemachine


《主流游戏相机实现》通过Unity 3D引擎和Cinemachine组件来实现主流游戏的相机设置,切换和管理的概念,习惯,基本原理,经验参数等。实现内容以动作游戏相机为主,但不限于动作游戏,也可以用于横版格斗、FPS、RPG等类型,需要自行调整和研究。   课程属于基础和进阶课程,适合对镜头控制感兴趣的读者。   《主流游戏相机实现》目录 1|Cinemachine 概述 2|《战双》相机分解和实现 3|《Sifu/师傅 》战斗相机部分分解与实现 4|多目标相机实现 5|《对马岛之魂》战斗相机部分实现 6|相机碰撞和场景交互处理 7|Demo工程
  本文节选自UWA学堂的《主流游戏相机实现》第一节《Cinemachine 概述》。   1 基本组件组成   Cinemachine核心组件包括BrainVirtual Camera(虚拟相机),Brain负责相机的切换,虚拟相机负责拍摄。   Virtual Camera   虚拟相机主要由六个模块组成,分别是: Lens:包括调整FOV等参数; Body:负责处理相机和跟踪目标之间的相对位置的这样一个关系; Aim:负责处理焦点和跟踪目标在镜头中的相对位置; Noise:模拟手持相机的晃动;后处理模块:让每个镜头有不同的后处理效果; Extnesions可扩展模块:包括碰撞处理等功能。   Body属性提供了下列算法来移动虚拟相机:
  • Do Nothing:不移动虚拟相机。
  • Framing Transposer:在屏幕空间,保持相机和跟随目标的相对位置,可以设置缓动。
  • Hard Lock to Target:虚拟相机和跟随目标使用相同位置。
  • Orbital Transposer:相机和跟随目标的相对位置是可变的,还能接收用户的输入。常见于玩家控制的相机。
  • Tracked Dolly:相机沿着预先设置的轨道移动。
  • Transposer:相机和跟随目标的相对位置固定,可以设置缓动。
  Aim属性提供了下列算法来旋转相机对准Look At的目标:
  • Composer:将目标保持在相机镜头内,可以设置多种约束
  • Group Composer:将多个目标保持在相机镜头内
  • Do Nothing:不旋转相机
  • POV:根据用户的输入旋转相机
  • Same As Follow Target:将相机的旋转和跟随目标的旋转同步
  • Hard Look At:将Look At目标固定在镜头中心的位置。
​   ​   组织结构: 1.1 Brain和Virtual Camera执行过程 ​   CinemachineBrain每帧通过VirtualCamera计算真实相机的位置,并同步到真实相机上。 真正的数据计算又是通过VirtualCamera上的流水线来计算的。 这是一个简化的流程说明,真实计算还有相机切换时的混合、流水线之外的Extension、和CinemachineCore对Cinemachine的全局管理等。   1.2 CinemachineBrain详细调用流程 主要可以分为两个时间节点和三件事。
  • 时间节点
    • FixedUpdate之后
    • LateUpdate
  • 三件事
    • 维护虚拟相机的状态,永远在LateUpdate。
    • 通过虚拟相机计算State,根据UpdateMethod的设置,在FixedUpdate之后或LateUpdate。
    • 将虚拟相机的State同步到真实相机上,根据BlendUpdateMethod的设置,在FixedUpdate之后或LateUpdate。
​ VirtualCamera中State计算流程 ​ VirtualCamera中 Pipeline Stage 流水线阶段  
UpdateComponentPipeline(); 
//
if (m_ComponentOwner != null && m_ComponentOwner.gameObject != null)
{
    // 排序 the pipeline
    list.Sort((c1, c2) => (int)c1.Stage - (int)c2.Stage);
    m_ComponentPipeline = list.ToArray();
}
//  预处理 camState
for (int i = 0; i < m_ComponentPipeline.Length; ++i)
    m_ComponentPipeline[i].PrePipelineMutateCameraState(ref state, deltaTime);


// 按body到final顺序执行CametaState,有2个例外
CinemachineComponentBase postAimBody = null;
for (var stage = CinemachineCore.Stage.Body; stage <= CinemachineCore.Stage.Finalize; ++stage)
{
    ...
    if (stage == CinemachineCore.Stage.Body && c.BodyAppliesAfterAim)
    {
        postAimBody = c;
        continue; // do the body stage of the pipeline after Aim
    }
    c.MutateCameraState(ref state, deltaTime);
}
InvokePostPipelineStageCallback(this, stage, ref state, deltaTime);


if (stage == CinemachineCore.Stage.Aim)
{
    if (c == null)
        state.BlendHint |= CameraState.BlendHintValue.IgnoreLookAtTarget;
    // If we have saved a Body for after Aim, do it now
    if (postAimBody != null)
    {
        postAimBody.MutateCameraState(ref state, deltaTime);
        InvokePostPipelineStageCallback(this, CinemachineCore.Stage.Body, ref state, deltaTime);
    }
}

  


  适合读者 1、从事第三人称3D游戏研发的策划、程序、美术、分镜师以及独立制作人 2、希望提升游戏体验设计和实现能力,系统理解业务与技术如何结合的开发者 3、具备一定Unity引擎相机基础的同学 4、对镜头控制感兴趣的同学 5、重视3C和提升相机表现品质的群体   你将获得 1、主流游戏相机控制的实现思路和技巧 2、优化玩家体验的能力 3、优化产品品质和表现力的思路 4、运行视频以及Unity工程源码   更多精彩内容,欢迎关注UWA学堂:edu.uwa4d.com

标签:镜头,游戏,实现,相机,虚拟,概述,Cinemachine
来源: https://www.cnblogs.com/uwatech/p/16501680.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有