zoukankan      html  css  js  c++  java
  • 战斗系统之相机逻辑

    需求分析

    1.支持两种相机模式,第三人称TPS和第一人称FPS 

    2.相机位置要保持在坦克的某个相对位置,即相机的位移变化是随着坦克的变化而变化。

    3.旋转。接受用户滑动屏幕输入,分别在X轴和Y轴两个方向,平滑旋转相机。 两种模式下都要支持滑动

    坦克在垂直方向的旋转有最大俯角和仰角的限制,即 Pitch有最大和最小,这一对值在TPS和FPS两种模式下是相等的。

    4.相机要跟随坦克行进过程中的晃动,有相应的晃动。即实现所谓的悬架式功能,两种模式下都要支持相机的晃动功能。

    5.需要计算瞄准目标点,这个点将随后被炮管使用,来确定炮管的朝向,随后UI上的瞄准点会根据炮管的方向来确定一个点。

    6.TPS下,准星可以不在视野的中心。FPS下准星一定在视野的中心。从FPS切换到TPS,要保证视野中心与准星重合。

    7.相机的FOV有三组值,一个是TPS,一个是FPS,一个是加强版FPS。需要三者平滑切换。

    只有在检测是否需要二段跳相机FOV时,需要检测当前准星是否在坦克的周围。

    8.TPS和FPS下都有独立的俯仰角配置,FPS那个节点引出射线在场景中的交互点,这个交互点也是TPS下的瞄准点。

    视野准星在FPS下必须重合,而TPS下视野准星和瞄准点是可以分离的。

    当有滑动操作时,操控的其实是FPS相机,当达到FPS的极大值时,操作自然失效。

    FPS下确定了一个瞄准点,TPS相机自身的朝向与这个瞄准点的朝向有一个夹角。

    当FPS确定了那个点,而TPS下,无法瞄准那个点,即TPS的相机中心不在那个点上,就禁止FPS再接收操控。

    当FPS计算出来的点到达了一个极限值的范围,

    每帧同时计算TPS和FPS两个Transform 辅助对象,然后如果当前用到一个,就平滑切过去

    节点结构,相机系统是一个CameraSystem,它下面有SceneCamera,有FPS,有TPS,有AimObject等。

    设计ViewFirstPerson,ViewThirdPerson,两个脚本分别控制FPS和TPS的transform。

    设计一个FOV控制器,可以在不同的情况下,平滑切换FOV值。映射坦克中心点,坦克中心点向外扩一个范围,使用屏幕坐标的办法实现了一个简易操作。

    程序上来说,SceneCamera里有一个camera controller,这个控制器支持两种模式。

    核心上来说,需要控制的是姿态,位置等。

    ================RTC摄像机逻辑==================

    rtc相机脚本挂在了主的摄像机上。在awake时,

    1.记录下当前摄像机的朝向欧拉角,保存x和y两个值,坦克相机不大可能围绕z轴转圈,因此不用管z轴的值。

    2.摄像机的rigidbody的freezeRotation 设置为true,表明不希望受物理系统影响,所有的旋转操作都由自己实现。

    3.创建一个新的gameobject节点,在相机控制脚本里,就控制这个新节点的位置坐标等。而炮塔控制脚本,将会监听这个节点的变动,从而改变炮塔的旋转角度。

    4.调用Input.GetAxis("Mouse X")获得水平方向,上一帧到现在的delta值,Input.GetAxis("Mouse Y")获得垂直方向上,上一帧到现在的delta值。

    ======================

    关于自动瞄准的逻辑,今天要搞定的事情有实现

    1.自动选择场景内视野里最近目标的功能。纠结的地方在于扫描怪物的这个功能是挂在角色身上还是在系统身上,暂时先放到了角色自己身上

    2.瞄准心的缩放,做一个插值实现即可。

    里面这个圈是这样的逻辑,当旋转停下来的有一个最小的Scale,有一个最大的scale,当移动的时候,会从现在的值逐步变大,然后再逐步变小。跟滑动的速度有关系,从起到停,当滑动速度较慢时,光圈会保持基本不变.

    首先,准星的位置,要有一个插值的过程。

    本身炮塔的转向就是一个插值的旋转过程,因此直接取炮管出膛位置作为准星的目标点位置即可。

    而对于,缩放来说,判断出当前自己的位置和目标点位置的距离,从最高值插值到最低值。

    其实是分成了几段,第一段,是从最大到普通,再从普通到最小。

    这块设计与实现的都是比较复杂的。 

    再次进行梳理:

    1.TouchController 接受滑屏输入,其计算的是相机目标姿态TargetPitch,TargetYaw,这俩变量的初始值取的是相机的原始值。当滑屏产生时根据delta值来改变目标姿态变量。

    每帧,相机控制器DefaultController会取出Touch的目标姿态来设置相机,来旋转真实的相机。

    从这里可以看出,如果你的相机姿态确定了,那么修改TargetPitch就行了,这样就相当于重置了相机的初始姿态。

    2.相机控制器DefaultController,实现了第一人称和第三人称之前的切换,默认是第三人称模式。在第三人称模式下,瞄准点和视野准星不一定重合,瞄准点由。为了实现这个目标给T和F两种相机模式设置了一个镜像,这俩镜像点的位置其实是定死的,基本就位于固定位置上。在T模式下,T的镜像自然就是由touch产生, F镜像要去尝试lookat视野中心点位置,由于俯仰角的不同,两个点会不一致。当从T模式切到F模式,需要取出当前F镜像的俯仰角,设置给touch的TargetPitch和TargetYaw,此时应该确保这个值无误。

    FPS模式下,我的炮管无法精确瞄准Fps计算出来的那个个点。

  • 相关阅读:
    获取checkboxlist多选值
    关于SQL Server 2005远程登录的问题。
    安装完vs2005后没有C#,VB.net,网站等模版的解决方法
    md5 加密
    C#中partial关键字
    C# 重载与覆盖
    CSS常用关键字汇总
    C#常用算法
    常用CSS样式属性
    Oracle 查询正在运行的SQL语句
  • 原文地址:https://www.cnblogs.com/designyourdream/p/4894650.html
Copyright © 2011-2022 走看看