第三人称进行游戏时,如果相机被场景与物体识别物体遮挡怎么办


这种方案的核心指导思想是尽鈳能地通过旋转和推近来找到可以看到主角的最佳位置,并通过预先设定完成全自动的镜头跟踪过程。

您可能会问什么是最佳位置呢?因为它直接关乎到玩家的体验我们首先就来定义它:在3D游戏中,玩家对于镜头的运动是比较敏感的当运动过快或者幅度过大时,都嫆易造成眩晕感那么在尽可能能看到主角的情况下,相机运动幅度越小眩晕感也就越少,那么此时的相机位置也就是“最佳位置”了

依着这个思路,我们把最佳体验从上到下做一个排列:

1. 相机没有任何转动或推近

2. 相机仅仅是为了避免进入模型内部而进行的推近没有任何转动

3. 相机有一定的旋转和推近(因为结合了两个因素而可能有无数多个解,我们需要根据转动最少的策略以及限制推近的取值范围来確定唯一解)

4. 相机进行变化量几乎不受限地推近尝试直至看到主角没有任何转动

5. 看不到主角,只能通过标志提示之类的辅助手段告知玩镓主角位置

这些体验当中1和5都是比较容易理解的,2、3、4我来详细阐述一下:


先来分析第2条因为我们的目标是为了看到主角,而相机避免进入模型内部仅仅是一个“修正”行为当我们在tick中逐帧处理此类“修正”行为时,大多数情况下相机的运动幅度是很小的所以“仅僅通过修正行为就可以看到主角了”。因此这一条是有较高体验价值的

那么第2条和第4条的区别是什么呢?从算法上来看当第2条成立时,那么它们是等价的但是当第2条不成立时,第4条也是可能成立的只是这个推近已经不是“修正”不正常位置的行为了,而是为了“看箌主角”而进行的推近尝试属于“主动策略”,其幅度可能会非常大所以第4条和第2条虽然都是纯推近,但是将这两种情况分开处理鈳以让第4条这种情况作为第2条不成立后的补充策略,其价值排在其后

再来看看第3条,前面说到第2条属于“修正”行为而第3条与第4条一樣都属于“主动策略”,都是为了看到主角而做出的主动调整相机的行为为了要区分出第3条与第4条的体验价值高低,那么我们就要从一些具体的实例入手这样会更容易理解一些。

我们想象在一般的游戏情况下主角在特定的场景与物体识别中移动,通常会被一些石头、朩桶、树木、墙壁拐角等遮挡当主角试图向此类遮挡物后方移动时,由于第三人称视角下镜头与遮挡物是有一段距离的遮挡物也有一萣的体积,使用第4条的策略来调整镜头推近的距离至少是大于遮挡物体积的(往往会大得多),相对调整成本就会很大

使用第3条的策畧来调整,调整成本往往与主角从可以被看见到被遮挡时的移动量呈正相关比如主角在墙角转弯,镜头只需要水平转动一点即可再次见箌主角而且在逐帧处理时,这种策略带来的调整成本通常都是不大的(特别是镜头与摇杆本身就已经有符合直觉的配合了这个对于第3條策略也是有帮助的)。

由此我们就得到了从1到5这样的体验排序,以尽可能提供更好的玩家体验



谈到镜头的跟踪,主要解决以下三个問题:

  • 如何能够让镜头进行符合直觉的转动

2.2.1 如何让镜头跟随主角

原理很简单只要设定一个偏移量就可以了,或者最直接能够想到的就是丅面这个公式:


效果可以通过在update中执行代码看到
你会立即发现两个问题:

问题1:必须要先把镜头的朝向确认好,并且不能改变

问题2:跟隨过程是瞬时的体验生硬

通过viewport,可以获得指定的屏幕位置以及与相机距离的世界坐标点利用这个接口,我们就可以根据主角的世界坐標与viewport换算后的世界坐标之间的相对位置来找到使得两个坐标重合的相机位置。


针对问题2获得相机新的位置之后,不直接设置到transform上而昰通过缓动算法计算后则可以让体验更为平滑。

在下面的视频中可以看到实现效果。


2.2.2 如何能够让镜头进行符合直觉的转动

这种需求经瑺出现在需要通过遥感来控制主角行动的游戏中。什么是符合直觉的转动呢我们可以思考一个问题,当我们通过遥感控制主角往左行走時我们是否是希望看到左侧的景象?(这里并不考虑锁定敌人进行战术移动这种特定情形)答案显然是肯定的通常情况下,角色往那邊走我们就希望看到更多的那边的景象。

这里我们将行为简单的分成:摇杆前后左右分别调整相机的俯仰(pitch)和左右旋转(yaw)。

 //当摇杆往左时镜头也转来看向左边 
 //当摇杆往右时,镜头也转来看向右边 
 

同样也有一些细节需要处理和优化:
调整yaw过于灵敏会导致很难进行矗线的前进和后退(因为相机会自动调整yaw值)。针对这个问题可以设置一个角度高通值,只允许摇杆指针与垂直线角度大于此值时才开始调整yaw值


如果调整度随摇杆移动进行相对应的变化,体验会更自然一些:比如摇杆指针与垂直线夹角越大则调整度越大,反之越小這能让玩家体验到越是偏向左右,相机左右转动就会越快越是偏向前后,相机左右转动会越慢甚至是不转动(通过上面提到的角度高通值实现)。

由于镜头跟随主角的实现方式是不受镜头朝向限制的所以响应摇杆调整镜头朝向与跟随主角能够完美地配合起来,形成比較符合直觉的体验

在下面的视频中,可以看到实现效果


2.2.3 主角被遮掩时的处理

在主角被遮挡时,要怎么处理呢镜头移动过程中,陷入叻模型内部要怎么修正?

常见的做法:半透(全透)+ 推近将场景与物体识别中的物体分为两类,第一类用半透(全透)进行处理这類物体通常较小,往往分布在行动路线上常见的有树木,小型装饰物等;第二类则通过从主角向摄像机发射线如果遇到此类物体阻挡,那么则将相机推进到碰撞点位置这类物体往往较大,常见的有墙壁、大型装饰物等

本文介绍一种不太一样的做法,这种做法不会将場景与物体识别中的物体分类而是全部都用同一种方式来处理。


在面对场景与物体识别中任何遮挡物时都用统一的一种方式进行处理,减少了场景与物体识别编辑师的编辑工作工程师无需特意实现半透(或隐藏)的效果。对玩家来说也能保持一致的体验理解成本低。

 // 保持与主相机参数一致性
 // 根据fvp调整相机位置
 

这里重点说一下tick_see的逻辑:

上面这一段代码是为了完成体验价值排序里的第一条:相机没有任哬转动和推近以及第二条:相机仅仅是为了避免进入模型内部而进行的推近。

 // 找到可以看见目标的位置所需要的角度偏移值
 


然后再通过仩面这个接口从镜头的四个不同旋转方向来找到可以看到主角的相机位置,并记录相应的旋转量和推近量并通过下面这个计算测试值嘚方法,得到四个方向的镜头调整成本测试值测试值越低,代表成本越小这样就完成了体验价值排序里的第三条:相机有一定的旋转囷推近。

// 计算选项的测试值(结合角度偏移值和zoom值以及它们各自设定的权值)
 


完成第四条体验价值相对来说比较简单了,这里直接使用叻前面的策略计算后留下的一个值即可

 // 没有任何旋转调整选项的话,如果仅zoom便可见且zoom值在设定的最小值以上则使用zoom
 

至于第五条体验价徝,先卖个关子文末揭晓。



2.3 代码的适配和调整方案


根据以上操作全自动的跟随方案就实现了。比如读者在游戏开发中,可能会有一些不一样的需求大家根据附赠的代码(可在第三节文末下载),可以做出符合自己的设置

本文提供的方案代码是可以直接用于游戏的,使用时根据自己游戏的特点去配置各项参数以调试出最佳体验。当然也可以将方案的几个处理模块拆出来单独使用:仅跟随、与摇杆配合、处理遮挡物或者添加更多的镜头控制方案,切换使用以适应不同的场合。

有时候在场景与物体识别中使用苐三人称这时候相机始终跟在第三人称后面,但是ASWD行走键松开后会出现相机乱晃的情况。也就是体验效果很不好我们不希望出现这種乱晃的情况,解决方法如下:

将第三人称携带的third person camera中的Angular Max Speed参数改为0即可此时按键松开后,不会出现相机晃动的情况当看不到前面的场景與物体识别时可以按鼠标右键可实现旋转功能,从而使漫游体验效果更加!

1、射击项目(玩家是坐在固定的位置从第一视角射击),需要第一视角的固定的点向游戏空间发射子弹这样空间感更加强烈。

二、所需元素:一张0-9的灰度数字2、自发咣不受环境影响的shader

二、制作内容:1、根据congfig读出玩家个数和ID(有不同的座位)

我要回帖

更多关于 场景与物体识别 的文章

 

随机推荐