ISO/IEC FCD 19774 — Humanoid animation (H-Anim)
4 Concepts
概念
本条款描述了 H-Anim 的核心概念,包括如何构建并操作 H-Anim 角色。
表 4.1 是此条款的内容表。
此国际标准这部分中使用如下的约定:
斜体字(Italics) 用于域名,也用于介绍新的条款和涉及变量的等式。
等宽(fixed-space)
字体用于 URL 地址和源代码范例。
对象名采用首字母大写并表示为粗体(例如 “Joint 对象是一个...”)。
在此国际标准中,涉及的外部参考文档使用 "x.[ABCD]" 形式表示,其中 “x” 表示涉及的条款,“ABCD” 是涉及的标题的缩写。在参考目录(Bibliography)中,省略为 “x.”。例如,2.[ABCD] 引用了 2 Normative references 中的参考描述,[ABCD] 则引用了 Bibliography(参考目录)中的描述。
此国际标准指定了 H-Anim 角色的结构和操作方式。H-Anim 角色(H-Anim figures)是用来再现角色的一个由关节铰接的 3D 的表示方法。虽然 H-Anim 角色的目的是再现象人一样的角色,但 H-Anim 角色是一个一般概念,并不限制其肢体、头、或其它的身体部分必须有典型的人类特征。单个的 H-Anim 角色称为 humanoid(人性化生物)。
H-Anim 角色使用以下 H-Anim 对象描述:
Humanoid(人性化生物)对象是 H-Anim 角色的根对象,它提供用以附加人性化生物的其它部分的框架。Humanoid 对象的更详细的信息在 4.3 Humanoid 对象 中规定。
Joint(关节)对象附加在 Humanoid 对象或其它的 Joint 对象上,通过一个位移来指定用以附加相关身体部分的关节的当前状态,Joint 对象的更详细的信息在 4.4 Joint 对象 中规定。
Segment(段)对象指定了人性化角色的关节之间的物理连接的属性。Segment 对象的更详细的信息在 4.5 Segment 对象 中规定。
Site(标记点)对象指定了一个可以用来附加其它已知语义的位置。Site 对象的更详细的信息在 4.6 Site 对象 中规定。
Displacer(置换器)对象指定了其嵌入的对象允许移动的范围的信息。Displacer 对象的更详细的信息在 4.7 Displacer 对象 中规定。
骨架化的 H-Anim 角色的描述由一个
Joint 对象的树状结构构成,它定义了人性化生物中从 HumanoidRoot
Joint 根关节到每个肢体的最终受动器的位移。此国际标准定义骨架层级的唯一要求就是必须有一个 HumanoidRoot
Joint 根对象。对于保持 H-Anim 规格的兼容性,所有其它的
Joint 对象都是可选的即不必需的。但希望
H-Anim 角色大多情况下还是应定义许多的关节而不只是必需的
HumanoidRoot。术语 关节层级(LOA - level of articulation)指为人性化角色定义的关节编号。有
14 个关节的人性化角色被称为“低级关节级别”,而有
72 个关节的人性化角色被称为“高级关节级别”。只包含一个 HumanoidRoot
Joint 根关节的人性化角色是 H-Anim 角色允许的最低级的关节级别。
Annex A 中定义了四个不同的常用 LOA,用这四个 LOA 可以对 H-Anim 人类角色的全部移动能力进行描述和一般性分类。然而,H-Anim 人类角色并不局限于使用这四个 LOA 中一个,也可以使用任何合适的 LOA。个别的人类角色可以按其特定目的更改骨架层级。这个层级可以包含任意数量的模型特有的关节对象,这些可选的关节对象可以分散地插入标准 H-Anim 关节对象中。只要保留祖先的标准 Joint 对象顺序,模型指定的 Joint 对象可以被插入到标准 Joint 对象层级中。
H-Anim 角色骨架层级的用于描述 4.9 人性化生物的结构 中规定的人。
通过在置换器(displacer)信息限定的相关关节上应用变换,可以对 H-Anim 角色使用动画。H-Anim 角色重新安排身体和肢体的能力 将由用来指定身体和每个肢体的关节数以及段数决定。更多的关节和段将导致更复杂的角色。角色中减少关节将减少复杂性。
指定 H-Anim 人性化生物角色身体的几何体可以按以下两种方式描述:
每一种方法将在以下描述。Humanoid 对象的界面在 6.2 Humanoid 中规定。
骨架化模式在骨架层级的场景图中指定几何体,骨架层级将被定义在 Humanoid 对象的 skeleton 域中。在此层级的 Segment 对象中将定义几何体,这些几何体将把身体描述为分离的几何体块。虽然这种模式计算效率高,但是可能会导致某些破坏人性化角色对象外观的视觉异常(例如撕裂或褶皱)。
蒙皮模式把身体指定为一个连续的几何体块,这个几何体块将被定义在 Humanoid 对象的 skin
域中。这种模式下,点和法线矢量数据集被预先定义在
Humanoid 对象的 skinCoord 域和 skinNormal 域中(见 6.2 Humanoid)。
数据定义的方法和 Humanoid 对象使用此信息的内在机制是分离的。Humanoid
对象使用坐标和法线矢量集描述构成人性化生物角色的蒙皮表面的几何体。这个表面可执行为单一的索引面集(见 2.[I19775-1])
,或为多个索引面集,或为其它任何可提供相同功能的表示方式。基于图形管线中渲染索引面集的方式以及人性化生物角色的构造,使用多个索引面集把连续表面分割为多个局部表面可能会提供更好的性能。因此规格中不限定蒙皮表面的执行为某个单一的模式。Humanoid
对象也可以操作 skinCoord 域和 skinNormal 域中定义的坐标和法线矢量数据集,以反映 skeleton 域的骨架场景图中发生的改变。在蒙皮变形的前后关系中,骨架层级的每一个 Joint
对象都定义了一个坐标框架,连续网格上位于这个框架中的顶点将在此 Joint
对象控制下变形。顶点操作的更多细节见在 Joint 对象如何运作的描述。
Joint(关节)对象是一个建立的用来描述人性化生物角色的关节的块。人性化生物角色的每一个关节将用一个 Joint 对象来表示。这些 Joint 对象被组织到一个层级中,此层级描述了骨架的 Joint 对象的固有的父 - 子关系,另外这些 Joint 对象还提供了为每个骨架的指定信息的容器。
Joint 对象为自身和其 children 子域中定义的对象指定了坐标系。此坐标系是相对其父对象坐标系的,大多情况下其父对象为另一个 Joint 对象,但也可以是 Humanoid 对象。这就是说,Joint 对象是一种特殊的组对象,它只可用作为另一个 Joint 对象的子,另外特殊的情况是骨架层级的第一个 HumanoidRoot Joint 对象要定义在 Humanoid 对象的 skeleton 域中。
Joint 对象有两个域用以允许操作 Humanoid 的 skinCoord 域中定义的单独的顶点。输入 Joint 对象的 rotation 域事件将以 Joint 对象 vertexWeight(顶点权重)域中描述的相应值为系数影响由 skinCoordIndex(蒙皮坐标索引)域指出的顶点。vertexWeight 域包含了一个浮点值列表,以描述影响 Humanoid 对象的 skinCoord 域中相应顶点(由 skinCoordIndex 域指出)的“权重” 值。vertexWeight 域和 skinCoordIndex 域只在定义了连续网格类的 H-Anim 模型时才使用。
Joint 对象也用来存储其它的节点细节信息。特别提供的关节 name(名称)能帮助应用程序识别 Joint 对象。关节对象也可以包含控制 H-Anim 角色的方向动力学系统的属性。这些属性包括上下级关节的限制、关节方向的限制、刚度/阻尼值。应用程序可以负责强制执行这些限制,但也可以选择忽略其中的某些限制。
Joint 对象的对象界面在
6.3 Joint 中指定。
人性化生物角色的每一个身体部分(例如前臂、大腿、小腿)将表示为一个 Segment(段)对象。这些 Segment 对象将被组织在人性化生物的 Joint 对象的骨架层级中, Segment 对象还是为身体每个段指定信息的容器。
Segment 对象是一种特殊的组对象,它可以在其 children 域中包容其它对象。Segment 对象只可以定义为一个 Joint 对象的子并应按照 4.9 人性化生物的结构 中的规格匹配恰当的 Joint 对象。
Segment 对象的对象界面在 6.4 Segment 中指定。
Site(标记点)对象将用于以下三种目的。首先是用于定义反向动力学系统所使用的“最终受动器(end effector)”的位置。其次是用于定义衣服或饰品之类的附件的附着点。再次 是用于定义 Segment 对象的参考系中的虚拟摄像机位置(例如多用户场景中使用的人性化生物的“通过眼睛观看(through the eyes)”的视角。被用作设定从此附着点(例如左眼和右眼)可以看见某个视角时的 Site 对象应被定向到面向摄像机观看的方向。
推荐的 Site 对象的列表、标称的身体尺寸、关节层级(LOA)参见 Annex A Nominal body dimensions and levels of articulation.
Site 对象是只可以在 Segment 对象的 children 域中定义的组对象。Site 对象的 rotation 域和 translation 域定义了最终受动器在 Segment 的参考坐标系中的位置和方向。Site 对象的 children 域用来存储任何可以被附着到 Segment 对象的附件。Site 对象指定了 children 域中对象使用的相对其父对象坐标系的坐标系。
Site 对象的对象界面在 6.5 Site 中指定。
独立网格对象的形状可以按照应用程序的需要而改变。在大多的基本层级下,这将通过操作存储在网格对象的 coord 域中的数据来完成。在为关节铰接替身时,网格对象保存在 Segment 对象中。在为可变形网格替身时,网格对象由 Humanoid 对象的 skin 域指定。
可能需要能够指出网格中的指定顶点组。
范例 应用程序可能需要知道头部中的哪些顶点将组成左眼球。
也可能需要提供每个顶点将要移动向那个方向的“提示”。这些信息将存储在 Displacer 对象中。对于关节铰接替身,一个 Segment 对象特定的 Displacer 对象将被存储在此 Segment 对象的 displacers 域中。对于可变形网格替身,Displacer 对象被存储在此替身的 Joint 对象的 displacers 域中。这些信息被称为 displacements(置换量),将被指定在特定 Joint 对象的局部空间中,并在其被应用到网格前被变换到 Humanoid 的空间系中。
Displacer 对象可以按以下三种方法使用。最基本层时只是简单地用作指示顶点对应在网格中的特定特性。第二层时可以把顶点置换到不同的方向以表示特定的肌肉动作。第三层时可以用一个 Displacer 对象表现一个网格中所有顶点的完整构造。
范例 面部方案中可以为每个面部表情设定一个 Displacer 对象。
每个 Displacer 对象指定了一个位置,称作 morph target(变形对象),可以用来修改角色的置换量属性。这些 Displacer 对象的置换量的标量的大小可以由外部源动态地驱动,例如由一个插值器驱动。这样,通过把基本网格和由 Displacer 对象定义的 displacements(置换量)线形结合就可以使网格平滑的变形。
虽然 Displacer 对象大多用来控制面部的形状,但它也可以用于身体的其它部分。
范例 Displacer 对象可以用来改变一个手臂 Segment 的形状以使其伸缩,从而模拟肌肉膨胀的效果。
Displacer 对象的对象界面在 6.6 Displacer 中指定。建议的 Displacer 对象的基本列表见 Annex B Feature points for the human body。
此国际标准限定了 H-Anim 人类角色的建模以确保为一个 H-Anim 人类角色设计的动画另一个 H-Anim 人类角色采用。这限定了没有应用任何动画之前的模型的状态规格,也确保了跨 H-Anim 人类角色模型的一致性。
人性化生物的建模采用标准的位置,即面对 +Z 方向,+Y 为上方向,+X 为人性化生物的左方向。原点 (0, 0, 0) 应为地平面上人性化生物两脚之间。
脚应平放在地面上,两脚之间的距离应等于两髋关节之间的距离。脚底应位于 Y=0 平面。两臂应伸直并平行于身体的两侧,手掌应向内对着大腿。手应展平,手指“1”到“3”的关节的轴应平行于 Y 轴,大拇指的轴应沿 +Z 轴向上转 π/2 弧度角。大拇指每个关节的坐标系的方向仍然和人性化生物的整体方向对齐。
手指“0”关节的移动一般都是受限制的,每个手指关节的刚度也是不同的。布置、方向和“0”关节的移动的更多细节可以从任何解剖学的参考文本中获取。
面部的建模应使眉毛处于平静状态,嘴闭着且眼睛睁大。
人性化生物的建模应按照实际的合理的尺寸。所有的尺寸以米为单位。典型的人的身高约为 1.75 米。附图 4.1 描述了人性化生物的缺省位置:
在此位置下,所有关节的角度应为零。这就是说,所有的 Joint 对象的 rotation 域的应为缺省值 (0 0 1 0)。另外 translation 域应缺省值 (0 0 0),scale 缩放因素应为缺省值 (1 1 1)。唯一应为非缺省值的是 centre 值,此值 用于指定关节(及其任何附属的子和身体段)将绕哪一点旋转。当所有关节的平移值、旋转值、缩放值都被设置缺省值时,身体应处于以上描述的中性位置。为了方便处理,每个 Joint 对象的坐标系将被定向以和整个 Humanoid 对象对齐。
每个 Joint 对象的 centre 域应按照关节在真实人类身体上的旋转方式进行设置。
附图 4.2 演示了手的方位。十字标记建议了可能的手指关节位置对应的 Joint 对象 centre 域值,以及指尖对应的 Site 对象 centre 域值。
建议(但不必须)把所有的身体 Segment 对象建立在适当的位置。这就是说,每部分和相邻部分连接时都要求没有平移、旋转、缩放过。
范例 手将建立在其相对前臂的正确的位置。前臂将建立在其相对于上臂的正确位置,等等。
所有的身体坐标分享一个人性化生物自身的共同的原点。如果创作工具执行起来有困难,也可以在编码语言中使用任何的几何变换机制把每个 Segment 对象中定义的几何体移动到正确的位置。使用这样的变换代替建立几何体可能会影响性能。
人类身体由一系列段(例如前臂、手、脚)组成并由关节(例如肘、腕、踝关节)连接到一起。此国际标准定义了这些段和关节的抽象概念以对人类身体进行结构化和标准化地描述。H-Anim 身体将建立为一系列嵌套的 Joint 对象,其中每个 Joint 对象也可以附带一个 Segment 对象。4.9.5 层级 中描述的层级展示了此国际标准中的 Joint:Segment 对象匹配对。如果定义了一个标准 H-Anim Joint 对象且此 Joint 对象定义了一个 Segment 对象,则 Segment 对象应使用此层级中适当的名称。
范例 如果定义了 l_upperarm Segment 对象,则它应被定义为 l_shoulder Joint 对象或类似对象的子。如果定义了一个 r_knee Joint 对象且其子域中定义了一个 Segment 对象,那么这个 Segment 对象应为一个 r_calf Segment 对象。
身体各 Joint 对象的名称在 表 4.2 中指定。
l_hip | l_knee | l_ankle | l_subtalar | l_midtarsal | l_metatarsal | |
r_hip | r_knee | r_ankle | r_subtalar | r_midtarsal | r_metatarsal | |
vl5 | vl4 | vl3 | vl2 | vl1 | ||
vt12 | vt11 | vt10 | vt9 | vt8 | vt7 | |
vt6 | vt5 | vt4 | vt3 | vt2 | vt1 | |
vc7 | vc6 | vc5 | vc4 | vc3 | vc2 | vc1 |
l_sternoclavicular | l_acromioclavicular | l_shoulder | l_elbow | l_wrist | ||
r_sternoclavicular | r_acromioclavicular | r_shoulder | r_elbow | r_wrist | ||
HumanoidRoot | sacroiliac (pelvis) | skullbase |
vl5 Joint 对象和 sacroiliac Joint 对象为 HumanoidRoot Joint 对象的子。HumanoidRoot 将被存储在 Humanoid 对象的 humanoidBody 域中,但其它 Joint 对象将由 vl5 或 sacroiliac 延伸下来。如果缺少这些 Joint 对象,低层级 Joint 对象可以为 HumanoidRoot 的子。
手的各 Joint 对象的名称在 表 4.3 中指定。
l_pinky0 | l_pinky1 | l_pinky2 | l_pinky3 | l_ring0 | l_ring1 | l_ring2 | l_ring3 |
l_middle0 | l_middle1 | l_middle2 | l_middle3 | l_index0 | l_index1 | l_index2 | l_index3 |
l_thumb1 | l_thumb2 | l_thumb3 | |||||
r_pinky0 | r_pinky1 | r_pinky2 | r_pinky3 | r_ring0 | r_ring1 | r_ring2 | r_ring3 |
r_middle0 | r_middle1 | r_middle2 | r_middle3 | r_index0 | r_index1 | r_index2 | r_index3 |
r_thumb1 | r_thumb2 | r_thumb3 |
许多人性化执行模式使用关节化面部结构来模拟面部表情。这和木偶表演的面部部分动作相似。以下基本面部 Joint 对象和 Segment 对象集将支持这种类型的面部动画。
这里使用后缀 “_joint” 因为这些特性将由肌肉组控制,而不是由实际的关节控制,但 temporomandibular Joint 对象例外。“_joint” 后缀用以区别 Joint 对象和相应的 Segment 对象的名称。
所有的面部 Joint 对象都为 skullbase Joint 对象的子。眼睛和眼睑的旋转中心是眼球的几何中心。眼睑缺省状态下为零弧度值,可以往正 π 弧度值旋转直到眼睑闭起来。缺省状态下眼球位于零弧度旋转值并可以沿眼球中心旋转。当 temporomandibular Joint 对象为零弧度时嘴是闭着的。
面部各 Joint 对象的名称在 表 4.4 中指定。
l_eyeball_joint | r_eyeball_joint |
l_eyebrow_joint | r_eyebrow_joint |
l_eyelid_joint | r_eyelid_joint |
temporomandibular |
附加可能的面部关节点的细节见 4.9.6 额外的 Joint 对象和 Segment 对象。
基本 Joint 对象集中的面部 Joint 对象提供了面部动画的主要形式。功能更强的面部动画形式由 MPEG-4 Facial Animation Parameters(见 2.[I14496-2])指定。
基本 Joint 对象集的完整形式在 附图 4.3 中指定,并且表中还在关节名称边上列出了其附加的段的名称。
HumanoidRoot : sacrum
sacroiliac : pelvis
| l_hip : l_thigh
| l_knee : l_calf
| l_ankle : l_hindfoot
| l_subtalar : l_midproximal
| l_midtarsal : l_middistal
| l_metatarsal : l_forefoot
| r_hip : r_thigh
| r_knee : r_calf
| r_ankle : r_hindfoot
| r_subtalar : r_midproximal
| r_midtarsal : r_middistal
| r_metatarsal : r_forefoot
vl5 : l5
vl4 : l4
vl3 : l3
vl2 : l2
vl1 : l1
vt12 : t12
vt11 : t11
vt10 : t10
vt9 : t9
vt8 : t8
vt7 : t7
vt6 : t6
vt5 : t5
vt4 : t4
vt3 : t3
vt2 : t2
vt1 : t1
vc7 : c7
| vc6 : c6
| vc5 : c5
| vc4 : c4
| vc3 : c3
| vc2 : c2
| vc1 : c1
| skullbase : skull
| l_eyelid_joint : l_eyelid
| r_eyelid_joint : r_eyelid
| l_eyeball_joint : l_eyeball
| r_eyeball_joint : r_eyeball
| l_eyebrow_joint : l_eyebrow
| r_eyebrow_joint : r_eyebrow
| temporomandibular : jaw
l_sternoclavicular : l_clavicle
| l_acromioclavicular : l_scapula
| l_shoulder : l_upperarm
| l_elbow : l_forearm
| l_wrist : l_hand
| l_thumb1 : l_thumb_metacarpal
| l_thumb2 : l_thumb_proximal
| l_thumb3 : l_thumb_distal
| l_index0 : l_index_metacarpal
| l_index1 : l_index_proximal
| l_index2 : l_index_middle
| l_index3 : l_index_distal
| l_middle0 : l_middle_metacarpal
| l_middle1 : l_middle_proximal
| l_middle2 : l_middle_middle
| l_middle3 : l_middle_distal
| l_ring0 : l_ring_metacarpal
| l_ring1 : l_ring_proximal
| l_ring2 l_ring_middle
| l_ring3 : l_ring_distal
| l_pinky0 : l_pinky_metacarpal
| l_pinky1 : l_pinky_proximal
| l_pinky2 : l_pinky_middle
| l_pinky3 : l_pinky_distal
r_sternoclavicular : r_clavicle
r_acromioclavicular : r_scapula
r_shoulder : r_upperarm
r_elbow : r_forearm
r_wrist : r_hand
r_thumb1 : r_thumb_metacarpal
r_thumb2 : r_thumb_proximal
r_thumb3 : r_thumb_distal
r_index0 : r_index_metacarpal
r_index1 : r_index_proximal
r_index2 : r_index_middle
r_index3 : r_index_distal
r_middle0 : r_middle_metacarpal
r_middle1 : r_middle_proximal
r_middle2 : r_middle_middle
r_middle3 : r_middle_distal
r_ring0 : r_ring_metacarpal
r_ring1 : r_ring_proximal
r_ring2 : r_ring_middle
r_ring3 : r_ring_distal
r_pinky0 : r_pinky_metacarpal
r_pinky1 : r_pinky_proximal
r_pinky2 : r_pinky_middle
r_pinky3 : r_pinky_distal
附图 4.3 — 基本 Joint 集的层级
可以定义额外的 Joint 对象和身体 Segment 对象。定义时只要满足以下三个要求:
不允许在标准 Joint 层级的链中插入新的 Joint 节点。然而这些非标准 Joint 节点可以为标准 Joint 节点或非标准 Joint 节点的子。
范例 额外的肘不能被加到臂上。然而新的附加物(例如头发、尾巴之类)可以通过建立新的 Joint
节点添加到其它现存的 Joint
节点的子中。
额外的 Joint 节点的加入不应影响到标准 Joint 节点的移动,即使这些额外的 Joint 节点不使用动画也不不应影响到标准 Joint 节点的移动。
基本 Joint 集里的节点的动画应不依赖于任何可能为其父 Joint 节点(或这些 Joint 节点的子)的动画。反向动力学系统执行计算时可能需要但也不一定需要考虑额外的 Joint 节点。
额外的 Joint 节点应被赋予前缀 “x_”(例如 hanim_x_pigtails),以使其和标准的基本 Joint 对象集类似的名称区别开。
翻译 m17 保留版权 如需转载请联系 http://17de.com/x3d/