栏目列表
站长现在干嘛?
热门关键字:
  • 业余放松
  • 生活
当前位置 :| 主页>教程>地图制作>

道具类型概述

来源: 作者:page 时间:2008-05-14 Tag:props   CS   hammer   点击:

注意:本篇文章中文译文来自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 文件中加入如下一行,你可以把某个分组于某种材质对应起来:

%detailtype = "detail_group_name"

detail_group_name 一项就是你在 detail.vbsp 中定义的组名。

这里有从detail.vbsp中摘抄出来的简单的例子:

swamp_grass_and_rocks
{
"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的例子:

Group1
{
"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轴旋转以尽量面对摄像机。


最新评论 共有 0 位网友发表了评论
发表评论
评论内容:不能超过250字,需审核,请自觉遵守互联网相关政策法规。
用户名: 密码: 匿名?
您可以复制、发行、展览、表演、放映、广播或通过信息网络传播本站作品,唯有遵循知识共享协议,即 知识共享署名-非商业性使用 2.5 中国大陆许可协议。
愿祖国繁荣富强!