原文地址 https://www.iddevnet.com/doom3/afs.php
我用谷歌翻译翻译了一下子,我觉得翻译的质量,比我翻译的要强一点点,
处于节约时间的考虑,我觉得还是有必要看一下子的。
artifulated figure(铰链数字)大多数人被称为“布娃娃”。
以下是一个很好的文件,说明他们如何工作,由最优秀的MrElusive打造。
一个铰接的人物是将这些身体保持在一起的刚体和约束的集合。
基于牛顿力学的 动态模拟 被用来在 力量和碰撞 的影响下 将 身体移动 到世界各地。
一个铰接图的每个身体修改 骨骼模型 的一个关节。
身体相对于其初始位置的旋转变化被应用于骨骼模型的关节。
要创建一个铰接图,需要一个带骨架的md5网格(.md5mesh)。
此外,单个动画框架需要初始动画(.md5anim)。
该动画框架将模型设置为用于创建铰接图形的姿态。
对于像人物这样的角色,这通常是一个T形姿势。
初始动画的单帧还指定了由铰接图的身体修改的初始关节位置。
每个铰接的图形都在一个单独的.af文件中指定,存储在base / af /文件夹中。
要在游戏中加载和测试一个关联的图形,
在存储在base / def /文件夹中的.def文件之一中创建一个entityDef。
这样的entityDef通常如下所示:
entityDef env_ragdoll_fatty {
“editor_color”“1.5”
“editor_mins”“-8 -8 -8”
“editor_maxs”“8 8 8”
“editor_usage”“Ragdoll for monster_zombie_fat \ n”
“spawnclass”“idAFEntity”
“流血”“1”
“睡觉”“1”
“皮肤”“皮肤/模特/怪物/脂肪”
“model”“models / md5 / monsters / zfat / zfat.md5mesh”
“anim af_pose”“models / md5 / monsters / zfat / initial.md5anim”
“articulated图”“monster_zombie_fat”
}
“editor_color”“1.5”
“editor_mins”“-8 -8 -8”
“editor_maxs”“8 8 8”
“editor_usage”“Ragdoll for monster_zombie_fat \ n”
“spawnclass”“idAFEntity”
“blood”“1” (?此处英文或许不对)
“sleep”“1”
“skin” “skin/model/monsters/fat”
“model”“models / md5 / monsters / zfat / zfat.md5mesh”
“anim af_pose”“models / md5 / monsters / zfat / initial.md5anim”
“articulated图”“monster_zombie_fat”
}
“spawnclass”始终指向“idAFEntity”。
关键的“睡眠”设置为1,所以铰接的图形在生成时不会立即开始移动。
“模型”键指向md5网格。
带有“af_pose”扩展名的“anim”键指向带有初始动画的文件。
“articulatedFigure”键指向要使用的.af文件。
.af文件首先存储具有常规设置的部分,然后收集正文和约束。
铰接图设置的结构如下所示:
设置{
关键参数
}
关键参数
}
网格“md5mesh” | md5网格用于铰接图 |
动画“md5anim” | 初始动画(t-pose) |
皮肤“皮肤” | 使用皮肤 |
摩擦<线性>,<角度>,<接触> | 所有身体的默认摩擦力。 |
selfCollision 0/1 | 自检检测的默认设置 |
suspendSpeed <线速度> <角速度> <线性加速度> <角加速度> | 关节运动的身体休息 的速度指定的线性和角速度是关节运动的数字可能停止的最大速度。指定的线性和角加速度是铰接图可能停止的最大加速度。 |
totalMass <mass> | 铰链图的总质量。 如果总质量设置为大于零的值,则每个身体的质量被缩放,使得铰接图的总质量等于给定质量。 |
一个身体的结构如下:
身体“名称”{
关键参数
}
关键参数
}
联名“联名” | 身体修改的关节
该身体的位置和方向用于将整个骨骼模型移动到世界各地。 这个机构的关键是设定为“起源”。 |
模型[碰撞模型] | 身体可以使用几种不同的碰撞模型。 这样的碰撞模型是用模型键指定的: 模型框((min_x,min_y,max_z))(max_x,max_y,max_z))模型八面体((min_x,min_y,min_z),(max_x,max_y,max_z))模型十二面体((min_x,min_y,min_z)模型圆锥((min_x,min_y,min_z),(max_x,max_y,max_z),numSides)模型圆柱体((min_x,min_y,min_z)),(max_x,max_y,max_z),numSides) bone((start_x,start_y,start_z),(end_x,end_y,end_z),width)model custom(“name”) |
来源(x,y,z) | 碰撞模型必须放置在相对于身体修改的关节的正确位置。此键指定碰撞模型中心的位置。 |
角度(俯仰,偏航,滚动) | 碰撞模型可以用角度键旋转原点 |
密度<值> | 碰撞模型的密度。身体的质量等于碰撞模型体积的密度乘以。 |
摩擦<线性>,<角度>,<接触> | 可以为每个身体指定不同的摩擦性能。
接触摩擦值指定与接触面的摩擦力。 摩擦值通常在[0,1]的范围内。 |
selfCollision 0/1 | 设置每个身体的自身碰撞检测 |
包含“联合名单” | 抛物线与骨骼模型的视觉网格碰撞。 对于网格上的冲击位置,取骨骼模型的最接近的关节。 从这个关节,影响被转移到一个关键人物的身体。 每个身体都有一个列表,其关节或多或少被身体所包含。 关节附近的冲击被转移到包含关节的身体。 关节只能由一个身体包含,每个关节必须由身体包含。身体所包含的关节用包含的关节键指定。 |
可以使用几个约束来连接关节数字的物体。约束用如下结构指定:
constraintType“name”{
关键参数
}
关键参数
}
constraintType是以下约束类型之一:
- ballAndSocketJoint
- universalJoint
- 合页
- 弹簧
对于每个约束,指定两个由约束连接的主体。这些主体用body1和body2键指定。
body1“name”
body2“name”
body2“name”
body2键可以指向称为“世界”的特殊机构,在这种情况下约束将body1连接到世界。
除了两个连接的身体之外,每个约束都具有特定于下面列出的约束类型的多个设置。
锚(x,y,z) | 指定球的中心(必需) |
conelimit(axis_x,axis_y,axis_z), <angle>,(shaft_x,shaft_y,shaft_z) | 指定锥形极限。 锥轴由第一个矢量指定。顶部锥体的角度跟随。锥体连接到主体2。接下来,指定连接到主体1的轴,并且被限制为始终保持在锥体内。 |
pyramidlimit(axis1_x,axis1_y,axis1_z), <angle1>,<angle2>,<angle3>, (shaft_x,shaft_y,shaft_z) | 指定一个金字塔形极限。 金字塔轴由第一个向量指定。第一和第二个角度指定金字塔顶部的角度。第三个角度指定金字塔围绕金字塔轴的旋转。金字塔与身体2相连。接下来,指定连接到主体1的轴,并且被限制为始终保持在金字塔内。 |
摩擦<值> | 指定关节摩擦。摩擦值通常在[0,1]的范围内。 |
万向接头与球窝接头非常相似。然而,连接到主体的两个轴的旋转也受到限制。
锚(x,y,z) | 指定万向节的锚点(必需) |
轴(dir1_x,dir1_y,dir1_z), (dir2_x,dir2_y,dir2_z) | 指定两个轴(必需) 第一个轴连接到主体1并指向主体1或朝向主体1。第二轴连接到主体2并指向主体2或朝向主体2。主体1相对于主体2围绕这些轴的旋转受到约束。 |
conelimit(axis_x,axis_y,axis_z),角度 | 指定锥形极限 锥形轴由第一个矢量指定。顶部锥体的角度跟随。锥体连接到主体2。连接到主体1的第一个轴被限制为始终保持在锥体内。 |
pyramidlimit(axis1_x,axis1_y,axis1_z), angle1,angle2,angle3 | 指定一个金字塔形极限。 金字塔轴由第一个向量指定。第一和第二角度指定金字塔顶部的角度。第三个角度指定金字塔围绕金字塔轴的旋转。金字塔与身体2相连。连接到主体1的第一根轴被限制为始终保持在金字塔内。 |
摩擦<值> | 指定关节摩擦。摩擦值通常在[0,1]的范围内。 |
铰链由锚和铰链轴指定,两个主体可围绕该铰链轴相对于彼此旋转。
锚(x,y,z) | 指定锚点 |
轴(axis_x,axis_y,axis_z) | 指定铰链轴 |
极限角度1,角度2,角度3 | 指定V形极限 第一个角度指定V形极限的中心。指定V形极限宽度的角度如下。V形附在body2上。接下来,指定连接到主体1并且被限制为始终保持在V形内的轴。该轴的方向用第三个角度指定。 |
摩擦<值> | 指定关节摩擦。摩擦值通常在[0,1]的范围内。 |
弹簧由两个锚定体指定,每个约束体上有一个。
anchor1(x,y,z) | 指定第一个锚点 |
anchor2(x,y,z) | 指定第二个锚点 |
摩擦<值> | 指定关节摩擦。摩擦值通常在[0,1]的范围内。 |
拉伸<值> | 弹簧伸长时弹簧不变 |
压缩<value> | 当弹簧压缩时弹簧恒定 |
阻尼<值> | 弹簧阻尼 |
restLength <value> | 春天的休息长度 |
minLength <value> | 弹簧的最小长度 |
maxLength <value> | 弹簧的最大长度 |
3D向量用于指定身体的位置,方向和方向以及约束。在.af文件中指定这样一个向量有四种方式
(x,y,z) | 相对于md5原点的位置 |
联合(“联名”) | 关节的位置 |
bonecenter(“开始联名”,“最终联名”) | 骨关节在两个关节之间 |
bonedir(“开始联名”,“联名”) | 从一个关节到另一个关节的骨骼的方向 |
- 最小化身体和限制的数量
- 使用低复杂性的碰撞模型
- 创建一个树结构
- 尽可能不要使用接头摩擦,尽管接头摩擦会增加稳定性
- 不要对不需要自身碰撞的物体进行自身碰撞检测
- 铰接图表示奇怪或爆炸。
确保每个身体的质量在合理范围内。使用af_showMass 1显示每个身体的质量。范围[1,100]中的体重通常很好。连接一个很重的身体与轻便的身体经常会导致问题。通常明智的做法是不要使关节的数字太重。将重物保持在一起所需的力量可能会增长很大,并且可能不会在物理引擎中准确表示。 - 铰接图表示奇怪或爆炸。
确保每个身体的惯性张量描述合理的平衡对象。使用af_showInertia 1显示每个身体的惯性张量。惯性张量的非常不同的对角元素可能会导致不稳定。每体惯量标度可以用于缩放身体的惯性张量,使得对角线元素相对于彼此最终达到合理的范围。 - 关键的数字是跳跃的,能量似乎进入系统。
确保没有接触点与联合作战的约束。当例如三个主体与两个万向节连接时,并且主体相对靠近。外部两个物体可能被认为是接触的。这个数字将在接触点被拉开,而万向接头试图将身体保持在一起。跳跃行为往往是结果。在整个图形或某些物体上禁用自身碰撞可以解决问题。
几个cvars和控制台命令可用于(重新)加载和可视化关联数字。
一旦为一个铰接的数字创建了一个实体def,那么'spawn'控制台命令后跟实体def的名称可以用来加载游戏中的关联数字。'reloadAFs'控制台命令可用于重新加载所有铰接图。该命令使所有铰接的图形能够回到初始动画指定的姿势。
为了可视化关节数字的几个物理属性,可以使用以下cvars:
af_showBodies | 显示身体的碰撞模型 |
af_showBodyNames | 显示每个身体的名字 |
af_showMass | 显示每个身体的质量 |
af_showTotalMass | 显示关节数字的总质量 |
af_showInertia | 显示每个身体的惯性张量矩阵 |
af_showActive | 只有在没有休息的情况下才能显示树 |
af_showVelocity | 显示每个身体的线性和角速度矢量 |
af_showConstraints | 显示所有限制 |
af_showConstraintNames | 显示每个约束的名称 |
af_showConstrainedBodies | 显示由约束约束的两个主体 |
af_showPrimaryOnly | 仅显示主要约束 |
af_showTrees | 显示关节图的树结构 |
af_showLimits | 显示联合限制 |
通过将cvar'r_showSkel'设置为1,可以可视化md5模型的骨架。
为了测试表达式的数字,可以将它们接收并拖动它们。当cvar g_dragEntity设置为1时,可以选择并移动清晰的图形。要选择一个铰接的图形,十字准线指向视觉网格上的某个位置,并按下攻击按钮。当攻击按钮被按下时,铰接的人物可以通过走动(或以noclip模式飞行)并环绕四周而被拖动穿过世界。
选择拖动的最后一个关联图被包含在一个黄色边框中。可以使用控制台命令“deleteRagdoll”从游戏中删除此关联图。一旦关联的图形位于地图中,它们可以使用控制台命令“saveRagdolls”保存到.map文件。保存到.map文件的铰接图不会从“deleteRagdoll”命令从.map文件中删除。任何关联的图可能仍然会从级别编辑器中的.map文件中删除。
步行逆运动学使脚保持在地板上,即使在不平坦的地形上行走。