H-Anim logo

ISO/IEC FCD 19774 — Humanoid animation (H-Anim)

6 Object interfaces

对象界面

--- H-Anim separator bar ---

cube 6.1 介绍

本条款规定了由此国际标准规定的五个对象的抽象定义。这些界面的实际用法需要绑定到实际的再现系统上。附件 Annex C VRML bindingAnnex D X3D binding 中指定了两个此类的系统。允许其它的绑定但不在此国际标准中规定。

表 6.1 是此条款的内容表。

表 6.1 — 内容表

cube 6.2 Humanoid

Humanoid 对象是定义 H-Anim 人性化生物角色骨架、几何体及标记点等要素的容器。这些要素包括用于指定 H-Anim 人性化生物主要细节的 Joint 对象、Segment 对象、Site 对象、Displacer 对象、另外 Humanoid 对象中的其它域将用于指定模型作者、版权、使用限制之类的信息。

本节中描述了 Humanoid 对象的界面以及用于定义和存取此对象的域。

interface Humanoid {
   float[3]           bboxCenter
   float[3]           bboxSize
   float[3]           center
   sequence<string>   info
   sequence<Object>   joints
   string             name
   float[4]           rotation
   float[3]           scale
   float[4]           scaleOrientation
   sequence<Object>   segments
   sequence<Object>   sites
   sequence<Object>   skeleton
   sequence<Object>   skin
   sequence<float[3]> skinCoord   
   sequence<float[3]> skinNormal  
   float[3]           translation
   string             version
   sequence<Object>   viewpoints
}

bboxCenter 域和 bboxSize 域指定了一个包裹 Humanoid 对象的子的边界盒。这是一个为优化目的定义的提示。缺省的 bboxSize 值 (-1, -1, -1) 意味着没有指定边界盒,如果需要,边界盒将由浏览器计算。

center 域指定了一个相对局部坐标系原点 (0,0,0) 的偏移。rotation 域指定了整个人性化生物角色的坐标系的旋转。scale 域指定了整个人性化生物角色的坐标系的非一致缩放,scale 值应大于 0scaleOrientation 域指定了缩放前的人性化生物角色坐标系统的旋转(以指定任意方向的缩放)。scaleOrientation 只应用于缩放操作。translation 域值指定了整个人性化生物角色的坐标系的平移。

info(信息)域由一个字符串序列组成,其中每个字符串都采用 "tag=value"(标签=值)的格式。以下是当前 H-Anim 规格中定义的标签:

authorName
authorEmail
copyright
creationDate
usageRestrictions
humanoidVersion
age
gender
height
weight
gender(性别)标签的值一般为 "female"(女性)、"male"(男性)或 "neuter"(无性)humanoidVersion 标签是人性化生物版本的参考,用于追踪数据的修订Humanoid 对象的 version(版本)域和这个域是不同的,version 域是用来建立此人性化生物的 H-Anim 规格的版本的参考。在特定应用中可以根据需要包括额外的 tag=value 对,额外的 tag=value 对也可用于此国际标准的将来版本。

version(版本)域存储了保证与此 Humanoid 对象一致性所需的此国际标准的版本信息。此国际标准的当前版本值为 “200x”。

应出现的 name(名称)域储存了由 Humanoid 对象定义的人性化生物的名称。

skeleton(骨架)域包含 HumanoidRoot Joint 对象。Humanoid 被当作为 HumanoidRoot Joint 对象的父对象并为这个 HumanoidRoot Joint 对象定义了坐标空间。因而 Humanoid 对象的变换将影响 skeleton 域中定义的 Joint 对象层级。Joint 对象层级将用于在 Humanoid 对象骨架域中定义一个 H-Anim 人性化生物角色,或当人性化生物角色的几何外形不在骨架域中定义时用来表示关节层级的定义。skeleton 域也可以包含零个或多个 Site 对象,这些 Site 对象允许建立和整体人性化对象对应的标记,但这些 Site 对象并不受任何 Joint 对象移动的影响。

joints(关节)域包含了一个参考列表,列表中的每一项都对应一个 Humanoid 对象 skeleton 域层级中定义的 Joint 对象。关节列出的顺序是不相关的,因为关节的名称将存储在 Joint 对象自身中。

segments(段)域包含了一个参考列表,列表中的每一项都对应一个 Humanoid 对象 skeleton 域层级中定义的 Segment 对象。段列出的顺序是不相关的,因为段的名称将存储在 Segment 对象自身中。

sites(标记点) 域包含了一个参考列表,列表中的每一项都对应一个 Humanoid 对象 skeleton 域层级中定义的 Site 对象。标记点列出的顺序是不相关的,因为标记点将存储在 Site 对象自身中。

viewpoints(视点)域相对 jointssegmentssites 域有不同的功能和行为模式。viewpoints 域可以包含零个或多个 Site 对象定义。viewpoints 域中定义的 Site 对象将受到应用于 Humanoid 对象的变换的影响,但不受任何在 skeleton 域中定义的在骨架层级上执行的变换的影响。这些 Site 对象将用于在 Humanoid 对象的参考系中定义一个虚拟摄像机的位置。以这种方式定义的 Site 对象应被用作为附着点,从此附着点应可以看见某个视角(例如查看面部还是查看人性化生物角色的侧面)。

skin(蒙皮)域包含了一个或多个索引面集定义。这些索引面集定义将利用 Humanoid 对象的 skinCoord 域和 skinNormal 域中定义的点和法线的数据。这里这个域将不定义为明确的类型,表示方法的细节将根据绑定的不同的呈现系统规定。Annex C VRML binding 中包含了与 VRML 绑定的方法。Annex D X3D binding 描述了 ISO/IEC 19775-1(见 2.[I19775-1])中规定的 X3D 人性化动画(Humanoid animation)组件。

skinCoord(蒙皮坐标)域包含了单个点的序列,Humanoid 对象将按内部机制根据此域和 skin 域中的索引面集定义建立适当表面变形以建立将被实际渲染表面几何体。

skinNormal(蒙皮法线)域包含了法线数据定义,Humanoid 对象将按内部机制根据此域和 skin 域中的索引面集定义建立适当表面变形以建立将被实际渲染表面几何体。

cube 6.3 Joint

Joint 对象是建立表示身体部分的块的基础。

本节中描述了 Joint 对象的界面以及用于定义和存取此对象的域。

interface Joint {
   float[3]           center
   sequence<Object>   children
   sequence<Object>   displacers
   sequence<float[3]> llimit
   float[4]           limitOrientation
   string             name
   float[4]           rotation
   float[3]           scale
   float[4]           scaleOrientation
   sequence<int>      skinCoordIndex
   sequence<float>    skinCoordWeight
   sequence<float[3]> stiffness
   float[3]           translation
   sequence<float[3]> ulimit
}

center 域指定了一个相对整个人性化生物身体的根的偏移,在大多情况下这个域都不接受事件。因为所有的 Joint 对象的 centre 值都定义在相同的坐标空间中,所以每个段的长度都可以通过计算父 Joint 对象 center 中心值和子 Joint 对象 center 中心值之间的距离而得。另外对于手指和脚趾末端的段,将使用 Segment 对象中的 Site 最终受动器对象来计算。

rotation 域使用四元组来指定 Joint 对象坐标系的旋转。scale 域指定了整个人性化生物角色的坐标系的非一致缩放,scale 值应大于 0。scaleOrientation 域指定了缩放前的人性化生物角色坐标系统的旋转(以指定任意方向的缩放)。scaleOrientation 只应用于缩放操作。translation 域值指定了整个人性化生物角色的坐标系的平移。

skinCoordWeight(蒙皮坐标权重)域中包含了一个浮点值的列表,这些值都在 0.0 到 1.0 之间,用于描述 Humanoid 对象 skinCoord 域中特定顶点受影响的权重量。此列表中的每一项将对应一个 Joint 对象 skinCoordIndex 域中的索引值以指示具体哪一个坐标将受影响。

Joint 对象的 ulimit(上限)llimit(下限)域指定了关节旋转的上限和下限。这两个域都是三元浮点序列,包含了对立的 X、Y、Z 轴旋转限制值。ulimit 域存储了沿 X、Y、Z 这些轴旋转的较高(例如最大)值。llimit 域存储了沿这些轴旋转的较低(例如最小)值。这两个域的缺省值空(null)表示关节不受限制。

limitOrientation(限制方向)域给定了解释 ulimitllimit 值时使用的坐标框架的方向。limitOrientation 描述了相对 Joint 对象 center 域描述的中心位置的此局部坐标框架的方向。

如果设定有 stiffness(刚度)域,则应包含有范围在 0.0 到 1.0 之间的值,这个值将规定在每一步反向动力学演算 中每个自由度(DOF - degree of freedom)将按照怎样的比例对关节旋转施加影响。 

范例 一个 Joint 对象的刚度 可以用在手臂关节链上以设定各关节的优先顺序,可以设定先移动左手腕,然后是左肘,最后才会移动左肩这样会n,或可以在单个 Joint 对象中设定多个自由度以赋予对独立的自由度设定优先顺序。

stiffness 域中的值将用作为相应轴的比例因素(X、Y、Z 对应 stiffness 域中的第 0、1、2 项)。

范例 如果一个关节的 X 自由度(DOF)的 stiffness 值为 0.5,相对不存在比例因素时的移动距离,关节将移动一半距离。(见 [BADLER])。

每个 Joint 对象应有一个用于区分此对象的 name 域。在 Humanoid 对象的局部适用范围中,每一个 Joint 对象可以用各自的名称(例如 r_shoulderl_hipskullbase)来引用。然而在更大的适用范围或整体命名适用范围中引用 Joint 对象时,Humanoid 对象的名称将被添加为前缀以便区分。

范例 如果 Humanoid 对象的 name 域包含的值为 joe,此 Humanoid 对象的 l_hip 关节对象在整体范围中将用joe_l_hip名来引用。

如果在整体命名适用范围中只定义了单一的人性化生物,则此 Humanoid 对象的 name 域一般可以包含一个 “hanim_” 前缀。这时此 Humanoid 对象的 l_hip Joint 对象在整体适用范围中将用 “hanim_l_hip” 名来引用。

name(名称)域是唯一必须定义的域,所有其它的域都是可选的。然而要注意的是,即使这些域中没有定义任何实际的 Joint 对象,这些域仍然需要保留为界面的一部份。

displacers 域包含了一个 Displacer 对象的参考列表,可以使用这些 Displacer 对象中定义的变形目标对可变形网格施加变形。更多信息参见 Displacer 对象。

创建人性化生物的作者可能希望在身体上添加额外的关节。身体形式上保持为人性化生物,并仍应有 4.9 Structure of a humanoid 中描述的基本关节。基本关节即为可以添加额外 Joint 对象(例如可卷曲的尾巴)的基本 Joint 对象集。更多细节见 4.9.6 Additional Joint and Segment objects。 

如果需要,可以忽略某些关节(例如某些椎骨)。细节见 Annex A Nominal body dimensions and levels of articulation

cube 6.4 Segment

Segment 对象是身体段的相关信息容器。

interface Segment {
   float[3]           bboxCenter
   float[3]           bboxSize
   float[3]           centerOfMass
   sequence<Object>   children
   sequence<float[3]> coord
   sequence<Object>   displacers
   float              mass
   float[9]           momentsOfInertia
   string             name
   sequence<Object>   addChildren
   sequence<Object>   removeChildren
}

bboxCenter 域和 bboxSize 域指定了一个包裹 Segment 对象的子的边界盒。这是一个为优化目的定义的提示。缺省的 bboxSize 值 (-1, -1, -1) 意味着没有指定边界盒,如果需要,边界盒将由浏览器计算。

每一个 Segment 对象应有 name 域,以使其可以和其它的 Segment 对象区分开。在 Humanoid 对象的局部适用范围中,每一个 Segment 对象可以用各自的名称(例如 r_upperarml_thighskull)来引用。然而在更大的适用范围或整体命名适用范围中引用  Segment 对象时,Humanoid 对象的名称将被添加为前缀以便区分。 

范例 如果 Humanoid 对象的 name 域包含的值为 joe,此 Humanoid 对象的 l_thigh Segment 对象在整体范围中将用 “joe_l_thigh” 名来引用。

如果在整体命名适用范围中只定义了单一的人性化生物,则此 Humanoid 对象的 name 域一般可以包含一个 “hanim_” 前缀。这时此 Humanoid 对象的 l_thigh Segment 对象在整体适用范围中将用 "hanim_l_thigh" 来引用。

name(名称)域是唯一必须定义的域,所有其它的域都是可选的。然而要注意的是,即使这些域中没有定义任何实际的 Segment 对象,这些域仍然需要保留为界面的一部份。

mass(质量)域是此段的总体质量。

centerOfMass(质量中心)域此段的质量中心位置。centerOfMass 的 -1 值表示没有可用的质量值。

momentsOfInertia(转动惯量)包含了转动惯量的矩阵。前三个元素是 3×3 矩阵的第一行,下三个元素是第二行,最后是第三行。

coord(坐标)域在包含可变形网格的 Segment 对象中使用,coord 域应包含参考 Segment 对象所用索引面集的坐标。坐标将被赋予和 Segment 对象相同的名称,但将添加一个 "_coords" 后缀(例如 "skull_coords")。 

displacers(置换器)域用于存储特定 Segment 对象所用的 Displacer 对象。

cube 6.5 Site

Site 对象指示了附件语义的标记点的位置。

interface Site {
  float[3]         center
  sequence<Object> children
  string           name
  float[4]         rotation
  float[3]         scale
  float[4]         scaleOrientation
  float[3]         translation
  sequence<Object> addChildren
  sequence<Object> removeChildren
}

name(名称)域是唯一必须定义的域,所有其它的域都是可选的。然而要注意的是,即使这些域中没有定义任何实际的 Segment 对象,这些域仍然需要保留为界面的一部份。

每一个 Site 对象应有 name 域,以使其可以和其它的 Site 对象区分开。在 Humanoid 对象的局部适用范围中,每一个 Site  对象可以用各自的名称(例如 r_arml_hipskullbase) 来引用。然而在更大的适用范围或整体命名适用范围中引用 Site 对象时,Humanoid 对象的名称将被添加为前缀以便区分。

范例 如果 Humanoid 对象的 name 域包含的值为 joe,则此 Humanoid 对象的 l_index_distal_tip Site 对象在整体范围中将用 "joe_l_index_distal_tip" 来引应用。

如果在整体命名适用范围中只定义了单一的人性化生物,则此 Humanoid 对象的 name 域一般可以包含一个 “hanim_” 前缀。这时此 Humanoid 对象的 l_index_distal_tip Segment 对象在整体适用范围中将用 hanim_l_index_distal_tip” 来引用。

按照预定的目的,Site 对象的 name 域的前缀应为描述其功能做适当的改变。如果用做最终受动器,Site 对象的名称应由其附着的 Segment 的名称加上一个 “_tip” 后缀构成。例如,食指的最终受动器 Site 应命名为 r_index_distal_tip,且此 Site 对象应为 r_index_distal Segment 的子。用于定义视点位置的 Site 对象应附加一个 “_view” 后缀。Site 对象如不用于最终受动器或摄像机位置时则应有一个 “_pt” 后缀。 

当一个 Site 对象被创建时,只应指定 name 域。其它域是可选的。

center 域指定了一个相对整个人性化生物身体的根的偏移,在大多情况下这个域都不接受事件。因为所有的 Site 对象和 Joint 对象的 center 值都定义在相同的坐标空间中,所以每个段的长度都可以通过计算父 Joint 对象 center 中心值和子 Joint 对象 center 中心值之间的距离而得。另外对于手指和脚趾末端的段,将使用 Segment 对象中的 Site 最终受动器对象来计算。

rotation 域指定了 Site 对象坐标系的旋转。

scale 域指定了 Site 对象坐标系的非一致缩放,scale 值应大于 0。

scaleOrientation 域指定了缩放前的 Site 对象坐标系的旋转。scaleOrientation 只应用于缩放操作。方向将以四元组的方式来指定。

translation 域值指定了 Site 对象坐标系的平移。

cube 6.6 Displacer

Displacer 是指定 H-Anim 角色某部分的置换量信息的容器。

interface Displacer {
   sequence<int>   coordIndex
   sequence<float> displacements
   string          name
   float           weight
}

每一个 Displacer 对象应有 name 域,以使其可以和其它的 Displacer 对象区分开。所有其它的域都是可选的。在 Humanoid 对象的局部适用范围中,每一个 Displacer 对象可以用各自的名称(例如 l_eyebrow_feature l_eyebrow_raiser_action)来引用。然而在更大的适用范围或整体命名适用范围中引用 Displacer 对象时,Humanoid 对象的名称将被添加为前缀以便区分。

范例 如果 Humanoid 对象的 name 域包含的值为 “joe”,此 Humanoid 对象的 l_eyebrow_feature Displacer 对象在整体范围中将用 “joe_l_eyebrow_feature”名来引用。

如果在整体命名适用范围中只定义了单一的人性化生物,则此 Humanoid 对象的 name 域一般可以包含一个 “hanim_” 前缀。这时此 Humanoid 对象的 l_eyebrow_feature Displacer 对象在整体适用范围中将用 "hanim_l_eyebrow_feature" 来引用。

Displacer 对象应使用带 “_feature” 后缀的名称以指示此 Displacer 对象的特征。用于改变特征的 Displacer 对象应被给定一个 “_action” 后缀, 一般还在后缀前预先附加一个预后缀以指示动作的类型(例如 “l_eyebrow_raiser_action”)。对应特定顶点外形设置的 Displacer 对象应用一个 “_config” 后缀。

coordIndex 域包含了由 Displacer 影响的网格的顶点在坐标数组中的索引,例如,

Displacer {
    coordIndex [ 7, 12, 21, 18 ]
    name "l_eyebrow_feature"
}

意味着网格的顶点 7、12、21、18 是左眼球上的。

如果有 displacements(置换量)域,则将提供一系列 3D 值,这些值将添加到从相关网格的 coordIndex 域中引用的顶点的中间位置或休止位置上。这些值一对一地对应网格的 coordIndex 数组中的值。值应为最大的 displacements(置换量),应用程序会根据 weight 域的值先进行缩放再将其添加到中间状态的顶点位置上。

范例

Displacer {
    coordIndex [ 7, 12, 21, 18 ]
    displacements [ 0 0.0025 0, 0 0.005 0, 0 0.0025 0, 0 0.001 0 ]
    name "l_eyebrow_raiser_action"
}

这将在垂直方向上抬高左眼球上的四个顶点。顶点 7将在垂直(Y)方向上向上置换 2.5 毫米,顶点 12 将向上置换 5 毫米,顶点 21 将向上 2.5 毫米,顶点 18 将向上 1 毫米。

应用程序应按权重域的值对 displacements 进行一致缩放。

通过动态修改 Displacer 对象权重域的值,应用程序能通过结合 Displacer 对象中定义的 变形目标使网格对象变形。对于包含在 Segment 对象 displacers 域中的 Displacer 对象,displacementsSegment 坐标系中定义和使用。Segment 变形前的基本网格是 Segment 中定义的原始网格。对于包含在 Joint 对象 displacers 域中的 Displacer 对象,displacements 将被应用到 Humanoid 对象 skinCoord 域中指定的可变形网格上。displacements 被定义在包含此 Displacer 对象的 Joint 对象的局部坐标系。加权重后的 displacements 应在 Humanoid 对象的坐标系被应用到 skinCoord 数组中。因此,displacements 应从 Joint 对象空间转换到 Humanoid 对象空间。变形后的蒙皮的基本网格是蒙皮根据骨架变形后的结果。

--- H-Anim separator bar ---