道具类型概述
注意:本篇文章中文译文来自MODchina,更详细资料,请访问其论坛。
在Source里道具这个词通常等于低面模型,有许多种不同的道具实体类型,每一种模型都有特定的功能,每一种模型都在特定的情况下适用,各自对于系统性能的消耗也不同。下面是关卡设计师使用的主要道具模型种类的列表,以及他们所有的特点:
| 模型实体 | 道具描述 |
| prop_detail | 细节模型-那些不会移动的静态模型,不包含任何物理道具或者碰撞数据,不能被破坏,不显示阴影。一般来说都不是由关卡设计者手动的一个一个放置的,而是通过对于特定表面制定材质使其被自动放置。最不消耗渲染资源的模型,在低端机器上甚至都不会渲染。 例子: 草, 石头, 植物. |
| prop_static | 静态道具-不移动的模型,不包含任何物理道具或者碰撞数据,不能打破,不能和其他物体关联或者动画。产生光照贴图阴影,渲染不太费资源。 例子: 管道, 固定灯, 石头, 电线杆. |
| prop_physics | 具有动力学的模型,可通过刚体动力学系统产生碰撞和移动,可被其他动力学物体铰链或约束,当受到足够伤害时还能被破坏。产生动态阴影,渲染比较费资源。 例子: 桶, 小碎片, 家具. |
| prop_ragdoll | 具有玩具娃娃(ragdoll) 动力学骨架的动力学道具,具有所有物理属性,玩具娃娃系统也适用于它,可以用来做互相连接的部分。渲染和动力学计算非常耗资源。 例子: 猎头蟹寄生体,combine特种兵, 打开的纸板盒, 床垫. |
| prop_dynamic | 可以表演动画、可设置层级关系以及具有关联作用的模型,受到足够伤害时可被破坏,可附在其他物体上并有层级关系,产生动态阴影。相对静态道具而言,他非常消耗资源,但又比prop_physics动力学物体节省资源。 例子:机器人手臂, 机械, 场景中的模型动画 |
| prop_physics_multiplayer | 为多人游戏模式所设计,使用单一动力学碰撞系统的动力学道具,相比标准动力学模型而言,他更节省网络带宽资源,是多人游戏模式低带宽环境所必须的。 |
| prop_physics_override | 一个特殊的道具类型,可用于把不是为了prop_physics设计的模型强制指定为prop_physics模型,资源耗费情况和和prop_physics一样. (DogKarl)注意:这里所说的可能有一点难于理解,因此在此加入一点说明。 在Half-life2中,prop模型在设计时就被指定了其实体属性。例如其表面性质,质量,质心等等重要的物理参数。例如:在你创建 prop_physics实体时,你选定的模型的物理属性就被读入了。但是某一些模型,例如机车模型,它本身并不是为prop_physics设计的模 型,如果你强行在一个prop_physics实体中指定一个火车头做模型,你会发现只有一个后果:你的模型在游戏中根本就不会出现。 为了解决这个矛盾,把不是为了prop_physics设计的模型强制指定为prop_physics模型,就有了这样的一个实体类型。仍然用火车头的例 子,因为火车头本来是作为prop_dynamic模型而设计的,因此如果你想把它变成prop_physics实体,就必须使用 prop_physics_override来覆盖模型本身的内在属性。 |
| prop_dynamic_override | 一个特殊的道具类型,可用于把不是为了prop_dynamic设计的模型强制指定为prop_dynamic模型,,资源耗费情况和 prop_dynamic一样 注意:这和上面提到的prop_physics_override的情况是一样的 |
道具类型深层详述
这个部分讲述了不同道具类型的更多详细情况,下面的表格说明了道具类型不同之处的情形
|
模型实体 |
在关卡中的最多数量 | 总是被渲染 | 碰撞检测 | 灯光 | 投影 | 动力学 |
|
prop_detail |
10,000个 | 不 | 没有 | 点光源Point | 不产生 | 静态 No 动力学 No 层级 No animation |
|
prop_static |
1,000个 | 是的 | 是的 | 天光 Vertex |
静态 (lightmap) | 静态 No 动力学 No 层级 No animation |
|
prop_dynamic |
100个 | 是的 | 是的 | 天光Vertex | 动态 (projected) | 层级 + animation |
|
prop_physics |
10个到100个 | 是的 | 是的 | 天光Vertex | 动态 (projected) | 层级 + animation + physics |
|
prop_ragdoll |
少于 10个 | 是的 | 是的 | 天光Vertex | 动态 (projected) | 层级 + 动画 + ragdoll 动力学 |
表格说明: 在关卡中的最多数量: 如果不想死机的话,你可以在一个关卡中使用的最大数目。
总是被渲染: 是否无论有多少面,都会被渲染。
碰撞检测: 道具类型是否能被其他物体碰撞的性能
光照计算方式: 物体如何被灯光照射/产生阴影.
是否投影: 是否产生静态lightmap阴影,或者产生动态dynamic projected阴影
动力学计算:物体动力学计算和骨骼动画的属性
prop_detail特性:
- 可在一个关卡内放置10000个
- 可以是 .MDLs 或 sprites。 Sprites 比 .MDLs.渲染速度快
- 通过给表面材质指定detail类型,编辑器会自动放置。一般来说不是由关卡设计师手动来使用。最不耗资源的方法,在低端机器上面甚至都不会被渲染。.
- 无法碰撞.
- 照射的光线颜色是固定不变的 (为了最优化资源).
- 不会对光照贴图的计算产生影响.
- 根据玩家距离自动衰减(淡出)(通过控制台命令来实现:cl_detaildist 以及 cl_detailfade变量)
- 在低配置电脑上可能无法渲染.
- 调用的模型必须是静态道具的.qc 文件编译而成的
- 不会让你的网络过载 + 内存使用极低
- 不是一个真正意义的实体,没有输入输出
- 没有动画.
- 无法附在另一个实体上.
- 从可视化的角度来说,它们就像是点模型
prop_static特性:
- 可在关卡中放置1000个.
- 可在Hammer editor中放置.
- 可与为它们设置碰撞和关联.
- 可对光照贴图产生影响,可以产生静态光照贴图阴影
- 对投射到上面的光线使用的是标准顶点着色方法。
- 可以使用细节控制系统( LOD system.,就是根据距离远近不同决定其渲染精度)
- 在低配置电脑上用户可选择是否显示(渲染)该道具
- 衰减距离(淡出)可在Hammmer编辑器中设置.
- 必须使用通过静态道具的qc文件编译成的模型.
- 不会让你的网络过载 + 内存使用极低
- 不是一个真正意义的实体,没有输入输出.
- 没有动画或者连接.
- 无法附加到其他实体上.
- 从可视化的角度来说,他们是物体的凸起近似外轮廓
prop_dynamic特性:
- 在关卡中可放置100个
- 可在 Hammer editor中放置.
- 可与他们产生碰撞和关联.
- 无法和lightmaps产生影响,但可产生动态阴影.
- 对投射到上面的光线使用的是标准顶点着色方法。
- 可以使用细节控制系统
- 可在低配置电脑上显示(渲染).
- 衰减距离(淡出)可在Hammmer编辑器中设置.
- 使用不是静态道具编译的模型.
- 可以有动画.
- 占用非常低的网络带宽(但不是0!) +稍高的内存需求(和实体一样)
- 这是一个真正意义的实体,具有输入输出.
- 可以带层级关系的附加到其他实体上.
- Optimal from a visibility standpoint, it uses the convex hull of the object.
- 从可视化的角度来说,它们就像是盒子
prop_physics特性:
- 关卡中可放置几千个, 或者更少,主要取决于模型的复杂程度。
- 可在Hammer编辑器中放入.
- 必须具有与之对应的碰撞检测数据
- 不和lightmaps互相产生影响, 但可以产生动态阴影.
- 对投射到上面的光线使用的是标准顶点着色方法。
- 可以使用细节控制系统
- 衰减距离(淡出)可在Hammmer编辑器中设置.
- 在低配置机器上衰减距离更小,除非作了特殊设置。
- 可以使用不是加了 $staticprop参数编译的模型。
- 可以有动画.
- 占用非常低的网络带宽(但不是0!) +稍高的内存需求(和实体一样)
- 这是一个真正意义的实体,具有输入输出..
- 无法带分级关系的附加到其他实体上
- 可以使用多种动力学约束与其他物体联结。
- Optimal from a visibility standpoint, it uses the convex hull of the object.
- 从可视化的角度来说,它们就像是盒子
- 具有某些附加特性。
prop_ragdoll特性:
- 除了具有自身的骨骼系统以外,和prop_physics其他方面都是相似的。
- 占用大量的网络带宽
如何使用材质系统自动
在固体表面放置 prop_details 模型
通过对固体表面制定一个特定的材质,可以实现prop_detail 模型的随机布置(例如,把草随机放到地面上)。detail.vbsp 文件定义了 detail prop 的分组。每一个分组都制定了该组将会随即生成何种prop_detail 模型。通过在 .vmt 文件中加入如下一行,你可以把某个分组于某种材质对应起来:
detail_group_name 一项就是你在 detail.vbsp 中定义的组名。
这里有从detail.vbsp中摘抄出来的简单的例子:
{
"density" "800.0" Group1
{
"alpha" "1.0" Model1
{
"model" "models/junk/rock1.mdl" "amount" "0.3"
}
Model2
{ "model" "models/junk/rock2.mdl" "amount" "0.3" }
}
Group2
{ "alpha" "0.0" Model1
{ "model" "models/foliage/Grass_tuft_003a.mdl" "amount" "0.1" }
Model2
{ "model" "models/foliage/Grass_tuft_004b.mdl" "amount" "0.3"
}
}
}
"Density(密度)" 定义了使用该detail prop 组的表面会随机产生多少点。设成比较大的值会产生更多的detail prop模型。
接 下来,你就可以根据你的需要设定任意数量的 detail props 组了。在非置换表面上的材质只能是用一个detail props 组,但是置换表面则可以使用多个detail props 组。每组都可以制定一系列的可以随机散布的模型。 model 域定义了使用何种模型,其中的 "amount" 一项则指定了当前的模型出现的相对概率。对于精通的玩家:如果一个组里面所有的模型的出现概率加起来没有1的话,系统随机分布在表面上的detail props物体的真实密度就没有你在"density"中指定的值大.
"alpha" 域专用于置换表面。当在置换表面使用某一种混合了两种纹理的材质时,alpha通道可以用来指定每一种纹理将会被如何使用。对于detail prop模型而言,系统会根据alpha通道的值来决定在表面上使用哪一组的detail prop模型。例如:你在某个置换表面上使用了一种由两个纹理混合而成的材质:其中一个是“路面”(alpha = 1 代表路面),另一个是“草地” (alpha = 0 代表草地)。在这种情况下,系统会自动在“路面”上随机生成岩石的detail props模型,而会在草地上随机布置草丛的detail props模型,因为你事先声明了 "alpha" "1.0" 组中都包含的是岩石模型,而"alpha" "0.0" 组则都是草丛的模型。注意你可以声明任意多的分组;例如,如果你再加入一个"alpha" "0.5"的分组,那么这一组的模型就会在草地和路面交界的过渡地带出现。
在detail prop系统中使用.MDLs 模型是很不划算的,因为在DirectX中对于每一个这种模型的开销都很大。为了避开这个瓶颈,你可以在 detail prop 系统中使用sprites模型, 他的开销很小,而且比用.MDLs要快上十倍不止。下面是一个如何在 detail 模型分组中使用 detail sprites的例子:
{
"alpha" "1" Model1
{
"sprite" "288 0 128 128 512"
"spritesize" "0.5 0.0 19 25"
"spriterandomscale" "0.2"
"amount" "0.2"
"detailOrientation" "2"
}
Model2
{
"sprite" "0 0 128 128 512"
"spritesize" "0.5 0.0 23 30"
"spriterandomscale" "0.2"
"amount" "0.1"
"detailOrientation" "2"
}
}
用于 detail sprites 材质必须放到 "detailsprite.vtf"的一个子区域声明下面。
在"sprite" 域中的头两项是用来指定当使用detailsprite.vtf 中的纹理时sprite左上角相对的(X, Y)坐标。接下来的两个数字指定了sprite的宽度和高度。最后一个数字是 detailsprite.vtf 纹理以像素表示的大小。
"spritesize" 一行中的头两个数字指定了detail sprite的旋转中心的规整化坐标: (0,0)代表左下角, (1,1) 代表右上角。在上面的例子里,sprite的旋转中心位于其下边的中心。"spritesize"一行最后的两个数字则规定了sprite 被渲染时的大小,以世界单位表示。
"spriterandomscale" 指定了对于detail sprite模型的随机缩放的上限和下限(例如,在上面所指定的例子中sprite 模型的随机缩放比例是在80% 到120%之间)。
最后的 "detailOrientation" 指定了detail sprite会如何移动。0代表他不会旋转;1 代表它会总是朝向摄像机,而2 则代表它会绕着自身Z轴旋转以尽量面对摄像机。
