【3D技术宅公社】XR数字艺术论坛  XR技术讨论 XR互动电影 定格动画

 找回密码
 立即注册

QQ登录

只需一步,快速开始

调查问卷
论坛即将给大家带来全新的技术服务,面向三围图形学、游戏、动画的全新服务论坛升级为UTF8版本后,中文用户名和用户密码中有中文的都无法登陆,请发邮件到324007255(at)QQ.com联系手动修改密码

3D技术论坛将以计算机图形学为核心,面向教育 推出国内的三维教育引擎该项目在持续研发当中,感谢大家的关注。

查看: 4005|回复: 4

Cs专业技术内幕分析系列连载之一:人物构成

[复制链接]
发表于 2006-4-22 17:16:27 | 显示全部楼层 |阅读模式

来源:Esai网 发布时间:2006-4-7 10:55:15  作者:Esai_n00dle
这是一篇非常详尽的CS专业技术内幕的分析,Esai网通过完整地提供相关内容给所有的CS玩家一个详实可*的技术依据。需要注意的是,整个分析是针对Cs 1.3版本的,但是有鉴于其后版本(例如CS1.5或者1.6)秉承的同先前版本的大量的一致性,尤其是技术内核方面,这份文档仍然具有极大的参考意义。

由于整个分析的篇幅较长,Esai网将以系列的方式分段连续发布,请随时关注新章节的发表。Esai网同时在这里预祝众多的Cser们Cs愉快。

Cs中的人物构成

一个人物由4部分组成:骨骼、模型、皮肤和射击模块(HitBox)












模型只是人物的形体,皮肤则覆盖在模型之上。模型和射击模块悬挂在骨骼上。当骨骼移动时(人物跑、射击或者投掷手雷),悬挂在骨骼上的模型和射击模块随之一起移动。覆盖在模型上的皮肤当然也相应地运动。一个玩家人物有20个射击模块覆盖在其身体上。当子弹朝人物射出时,半条命引擎检查看是否子弹击中了某一射击模块。如果击中了,则人物被有效击中。

人物模型这一术语通常也用来指骨骼、模型、皮肤和射击模块的集合。例如:“the L337 Krew player model”(匪3号)。

下面的图片显示不同的人物模型。

























每个人物的射击模块在位置、形状和尺寸上都是相同的,但模型却不一样。在图中,3号土匪的射击模块看上去似乎比较大,但这并非事实。这不过就象把同一件外套分别给瘦子和胖子穿,因此这件外套在瘦子身上显得比较大,而在胖子身上显得比较小而已。但这件外套本身当然并无变化。通过分散检验不同模型中射击模块的大小,也发现其尺寸是相同的。

之所以上面这些图片的大小不一样,这完全是抓图软件的问题。抓图软件要求所有模型以同一给定高度出现,因此有的较小的模型被放大了,而较大的模型被缩小了。例如,3号土匪模型看上去比较高,并且他的射击模开似乎也和其他的不一样,但这只是因为他的图片以110%的比例显示的。如果所有的模型都以百分之百的比例显示,就能很清楚地看到其射击模块完全相同。

20个射击模块分别是:骨盆、大腿、小腿、脚、3个脊背模块(上、中、下)、颈、头、肩、上臂、前臂和手。VIP的模型和玩家人物模型是相同的。人质模型只有19个射击模块并且头部非常大。







最后,小鸡的模型只有9个射击模块并且头也很大。





不同的射击模块有不同的伤害值。击中胸部比击中手部会造成更多的伤害。在身体同一部分的模块会有同样的伤害值,例如手、前臂和上臂就有同样的伤害值。因此射击模块可以划分为臂部、腿部、胸部、臀部和头部。头部拥有最大的伤害,其次是臀部、胸部、腿部和手部。

被击中头部的伤害通常是胸部的3到4倍,而这常常是致命的。如果一名玩家因为被击中头部射击模块而死亡,则被称为暴头。臀部看上去拥有胸部的两倍伤害值,但臀部很难被击中—其它的射击模块阻挡了它。

 楼主| 发表于 2006-4-22 17:20:04 | 显示全部楼层
Cs专业技术内幕分析系列连载之二:有效命中体HitBox
来源:Esai网 发布时间:2006-4-7 15:37:08  作者:Esai_n00dle
hitbox(命中框)扭曲

cs有一个编程错误导致的hitbox扭曲的历史。model(模型)存贮在.mdl文件中(人物模型文件),在cstrik/models文件夹下。这些文件保存着准确并且精确的数据。但是,cs一旦读取了这些数据,会在最终使用这些数据之前进行大量的运行处理。在这个处理过程中的bugs会导致在游戏运行中的hitbox的实际位置同在人物model文件中显示的不同。

换句话说,上一页图片中所显示的hitbox,基本上是一个谎言;他们只是或许会,而不是一定会那样发生。

扭曲的问题在1.1版中已经被cs开发小组认识到,并作为一个主要的问题来处理,大量的工作被投入在修补这个问题上。不幸的是,cs1.3仍然存在一些hitbox扭曲问题。这些问题显然比上一个版本要少-具体说,墙面效果(如果一个人物是蹲着的并且一面墙出现在正在瞄准这个人物的武器的视线中,头部hitbox会消失)已经被修补了。

hitbox扭曲的错误可被归结成两类:一类是出现在持有特定的武器(例如,cs1.1中,一个拿着aug的人物在站着的时候没有腿部的hitbox)。还有一类总是出现,同持有武器无关。人物model文件包含有每一种人物移动动作的配置定位信息-走动,蹲下,奔跑,游泳,持有步枪,击发步枪,持有雷,等等。

mp5,两把散弹枪,m249机枪,ak47,双枪,刀还有雷具有它们自己的独立的定位信息.所有其他的武器使用两种通用持有武器定位信息的其中之一。(这就是为什么在1.1中双抢有一个独特的特定错误)。

cs 1.3中的hitbox扭曲

人物胸部和肩膀的hitbox在人物蹲下并持有一个awp的时候会垂直扩展一段非常明显的距离。这会使距离人物可见形体相当远的一些子弹命中。这种垂直的扩展也出现在头部的hitbox上,并且因此可能导致了1.3中的高爆头率。

爆头






hitbox是矩形的,model不是。因此,hitbox的边角经常轻微突出在可见的model外面。在一些情况下,这个突出的程度足够导致一些问题。具体说,从一个人物的后面很难打出一个爆头,因为背部和肩膀的hitbox使头部的hitbox变得非常不明显。
 楼主| 发表于 2006-4-22 17:20:21 | 显示全部楼层
Cs专业技术内幕分析系列连载之三:客户端同服务器的通讯
来源:Esai网 发布时间:2006-4-10 15:57:22  作者:Esai_n00dle
客户端-服务器通讯

客户端是半条命的程序,由玩家使用并连接到一个服务器上。半条命服务器端是一个中央程序,允许许多客户端连接上来,运行cs游戏。客户端不进行互相通讯;他们只和服务器通讯。服务器跟踪客户端的行为,以及一个客户端影响到另一个或几个客户端的行为,服务器通知那些客户端它们需要知道的事情。

整个布局象一个星型,服务器处于中心,辐射状连接到围绕着它的客户端上。

有两个基本问题同客户端-服务器通讯有关:带宽和延迟。

在一个理想的世界里,客户端-服务器的通讯将会是毫无阻碍的:没有数据流量的限制并且传送应该是即时的。于是,客户端总是同服务器处于完全相同的状态。

在现实中,有对客户端同服务器之间的数据每秒流量的限制(带宽)以及数据传送所消耗的特定时间(延迟)。

数据传送的限制发生在两个方面:

首先,服务器有一个设置,指定它同一个客户端进行通讯的最大数据流量带宽。所以,即使一个客户端通过一个cable或者xdsl连接,这种连接至少有每秒64KB的速率,服务器仍然仅仅传送通常8KB每秒的数据(这是一个典型的值,但依据服务器有所不同);服务器设定带宽限制。

这么做的原因是服务器有那么多的玩家连接进来,他们消耗着很大的带宽,这不得不需要付出代价;通过限定一个限值,服务器可以进行经济有效的处理。

其次,客户端如果在使用低带宽连接(56k modem),将比服务器限定的带宽限制拥有更小的带宽,这些不幸连接会拥有一个因为较低的实际连接带宽而设定的带宽限制。

延迟主要取决于连接方式(56k,isdn,xdsl等等)。延迟越大,数据离开客户端后到达服务器需要的时间越长。

连接 带宽 延迟
56k modem 低 高
ISDN 低 低
xDSL 高 低
卫星连接 高 高

注意,延迟同带宽是截然分开的。这就是为什么,例如,单通道isdn同双通道isdn有同样的延迟,而卫星连接-尽管每秒可达几兆的带宽-对于实时游戏却是毫无用处的,因为延迟可达到2000毫秒。



带宽问题

因为只能传送有限数据流量所导致的基本问题是,如果发生的事件很多,因此服务器需要传送的数据流量大于限定值,那么必须采取一些措施。实际所发生的是:一些数据-可能是至关重要的数据,例如一个玩家正在开枪-被简单的忽略了。

想象一个玩家只有一个56k的modem. 这只能有客户端到服务器的每秒3k的流量,以及服务器到客户端的每秒5k的流量。(大多数的连接方式是不对等的,在一个方向上传送更多的数据在另一个方向上更少)。

开始时,我们的玩家正在一个地图上的荒芜区域里遛弯。没什么太多的事情发生,除了他的位置正在变化,那么,客户端只需要传送很少的数据给服务器-大概每秒1k. 同样的,服务器也没有太多的事情需要通知客户端,因为在他的附近没有事情发生。

现在,但是,玩家转过了一个拐角,进入了一个激战区。忽然,他的客户端需要被传送大量的信息:视野里有很多人,很多枪都在开火,手雷满天飞等等。服务器需要传送给客户端每秒10k的数据以保持玩家对正在发生的事情有所了解,但是,晕了,客户端每秒只能接受5k的数据。会发生什么?服务器无法传送每秒10k的数据,于是它不得不选择某些50%的数据,应被传送的,却被抛弃了,还有50%的数据被实际传送了

确切地说,这个问题的处理还同另一个问题有关,这就是在服务器和客户端之间传送的数据是怎样被规划的-基本上,服务器能够放弃相当数量的数据,而不将有关信息提供给客户端。

实时游戏更象一卷胶片。刷新率越高,移动的显示效果越真实。但是刷新率在这里不是那个由显卡创造的刷新率,而是服务器每秒更新客户端的数据以使它知道当前正在发生的事情的速率。

想象服务器每5秒钟只通知客户端一次正在发生的事情。客户端将会见到人物瞬间移动很大的距离,会完全看不见一个手雷已经被投掷出来,并且会经常挂了却看不见他的对手,因为他的世界仅仅每5秒更新一次。

现在想象更新率每秒一次:一个很大的提高,我们的玩家不再错过手雷投掷,并且看见人物以一种合理的连续动作移动,但始终处于每秒一次的更新,他仍然发现瞄准非常困难。

现在想象更新率是每秒25次。忽然,我们的玩家进入了状态。他的客户端更新的那么快因此正常的移动效果就可以显现出来。

但是,这里有个冲突。服务器更新客户端的数据越快,需要传送的数据每秒就越多。如果产生了太多的数据,多于能够支持的连接,那么服务器就不得不开始丢弃数据。

当这个发生的时候,服务器简单的临时减少更新频率。客户端看见的世界被降了级,但仍然保持功效。

如果,另一方面,是客户端传送了过多的数据给服务器,那么客户端降低更新频率。

重要的是,在一个玩家周围发生的事情越多,越多的数据就必须在每个更新中传送出去。所以,35 updates每秒可能在一个无人区表现的很好,但会在激战中表现得惨不忍睹。

这就是使用者最终得到一些权利来配置他的客户端行为的原因。客户端的带宽流量是固定的,但是客户端同服务器相互之间更新的有多快却完全取决于使用者。这给了使用者一个粗糙的,但却有用的机会来控制数据传送流量(粗糙的是因为数据传送流量在每个更新中是不同的,并且使用者无法控制这些)

在半条命里配置客户端同服务器的通讯基本上是一个知道你有多少带宽的问题,然后就可以指定更新的频率,同时保证不会在动作频繁的时候使数据连接饱和。
发表于 2009-1-14 14:11:30 | 显示全部楼层
 不错,好东西
发表于 2009-2-11 22:32:33 | 显示全部楼层

COMEING

论坛是我家,路过要帮忙..

帮LZ顶一下
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|3D数字艺术论坛 ( 沪ICP备14023054号 )

GMT+8, 2024-11-23 22:15

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表