VRML/X3D H-Anim 人性化动画标准

编译 http://17de.com/x3d/

Humanoid Animation Group

随着因特网上的三维需求不断增长,也需要在虚拟的网络环境中描述人类活动。为此需要创建可互换的人性化库。这样可以用不同创作工具,更容易地新建人性化动画。 这就是 Web3D 联盟建立 H-Anim 标准制订的目的。

H-Anim 标准(参见 http://www.h-anim.org/)制订了在 VRML97/X3D 中使用人性化的方法。这个标准允许使用创作工具人性化地建立从一个矢量到另一个矢量的动画。H-Anim 可以使用关键帧(keyframing)或反向动力学 IK( inverse kinematics)或其他技术来执行动画。

H-Anim 的设计目标是:

  • 兼容性人性化将可以在任何VRML97兼容的浏览器中工作。
  • 适应性:不假定将使用人性化应用程序的类型。
  • 简单性:规格可以在将来扩展。

H-Anim 很多设计都是为了达到以上三个目标。兼容性需要避免使用脚本,因为VRML97规格不考虑再执行特别的脚本。适应性需要 必须要保持规格的“底层”性,这就是说要能直接存取人性化身体的关节的每个身体部分的顶点。简单性需要关注规格的人性化 ,而不是去处理每个关节的属性。

为此 H-Anim 设置了一些新的节点。

H-Anim 标准通过Joint节点将整个实体组织成一个分层的结构。实体由一定数量的段 (segments)构成的,比如前臂、手或脚,这些段是由关节 (joints)连接在一起的,比如肘、手腕或踝关节。除开根节点HumanoidRoot,每个Joint节点是另外一个Joint节点的子节点。作为Joint原型的典型实现,可以是一个Translation节点,这样,可以对Joint进行平移动和转动等操作从而改变作为身体段的Segment节点以及该Joint节点的Joint子节点,实现人物动画。

另外在这些节点中可以包含丰富的信息,比如身体段的质量,包围整个身体段或者人物的长方体尺寸,关节的运动范围等。Segment节点可以包含 Site 节点和 Displacer 节点,Site节点用来定义相对于该 Segment 的位置,可用于往身体段上附着衣服以及定义反向动力学方法的终端效应器等,Displacer 节点用于定义一组具有特殊特征或者配置的顶点,可以用于肌肉变形动画等。标准还规定了建立人物模型必须遵循的规则,如人物必须面对正Z方向,正上方是正Y方向,身体左侧是正X方向,原点在两脚中间位置等。

这样 H-Anim 可以综合使用关键帧、反向动力学、运动捕捉等方法产生动画。就像3DSMAX里的 Character Studio,当角色移动是,你不需要调节每个点。你知道“如果膀子这样动,腿就一定会那样动”,它们之间是相联系的,所以可以自动演算出模型其他部分的变形。因为移动一组而不是移动一个个单独的点,角色动画将会更流畅,文件大小也会大大地减小,特别对于复杂的角色。H-Anim 被称为人性化动画(Human Animation),但并不限制只用于人物动画,甚至可以用 H-Anim 来做个53条腿的虫子。 可以到以下网址浏览 H-Anim 1.0 and 1.1 的范例
 

用以下的工具可以制作 H-anim 格式的动画。

Web3D 联盟已经将 H-anim 作为附件加入 VRML97 标准。现在的大多数的 VRML/X3D 浏览器都支持 H-anim 标准。Parallel Graphics Cortona VRML Client  Bitmanagement BS Contact 都内建了H-anim 标准支持。H-anim 还被正式收入即将推出的 X3D 标准。

  参考:http://www.hanim.org

发表评论:http://www.86vr.com/forum/dispbbs.asp?boardID=3&RootID=13746&ID=13746

原文链接 http://17de.com/x3d/hanim.html

 

附:HAnim 的节点说明

(最新版本参见 Extensible 3D (X3D) 中文工具提示)

 

 m17design.myetang.com

top   credits   help
HAnimDisplacer HAnimDisplacer 可以按照三种不同的方式使用: (a) 指定了HAnimSegment中节点的相应的顶点特性, (b) 描述如何线型或半径地替换顶点的方向来模拟精确的肌肉动作, (c) 描述了Segment 中的完整的顶点构造. 举例来说, 在脸上可以为每个面部表情使用一个Displacer. 提示: name 的后缀包括 _feature, _action, _config. 多个 Displacer 节点必须连续地在 Segment节点中出现.
DEF [DEF ID #IMPLIED]
DEF给这个节点定义了唯一的ID, 这样在其它节点里就可以引用这个节点.
提示: 为DEF命名时,使用有意义的描述性的名称可以帮助规范文件, 以提高文件可读性.
USE [USE IDREF #IMPLIED]
USE用来引用DEF定义的节点ID, 同时忽略其它的属性和子对象.
提示: 使用USE引用其它的对象而不是复制节点可以提高性能.
警告: 使用USE的代码不要包括DEF或其他的属性值!
name [name: type SFString CDATA #IMPLIED]
必须命名以使Humanoid 运行时能够识别. name 要匹配DEF名!
coordIndex [coordIndex: type MFInt32 CDATA #IMPLIED]
定义HAnimSegment顶点坐标的数组, 提供给Displacer使用. 顶点坐标按索引顺序排列, 编号的起点为0, 一组设置间可以使用逗号分割以便于阅读代码 使用-1 分开每组.
displacements [displacements: type MFVec3f CDATA #IMPLIED]
一系列的三维坐标值, 引用coordIndex域为Segment顶点添加中间值或静止位置.
containerField [containerField: NMTOKEN "displacers"]
containerField 是field标签的前缀, 表明了子节点和父节点的关系. 比如: geometry Box, children Group, proxy Shape. containerField 属性只有在X3D场景用XML编码时才使用.
class [class CDATA #IMPLIED]
class 是用空格分开的类的列表, 保留给XML样式表使用. 只有X3D场景用XML编码时才支持class 属性.
  top   credits   help
HAnimHumanoid HAnimHumanoid 节点用来: (a) 存储相关的关节, 身体部分和视点, (b) 包含整个人性化的节点, (c) 简化整个人性化节点在环境中的移动, (d) 存储相关可读数据比如作者或版权信息. Humanoid节点也包括了humanoidBody (v1.1) 或skeleton (V2.0) field. HAnimHumanoid 节点包括 HAnimJoint, HAnimSegment, HAnimSite, Viewpoint, and skin (v2.0)节点.
DEF [DEF ID #IMPLIED]
DEF给这个节点定义了唯一的ID, 这样在其它节点里就可以引用这个节点.
提示: 为DEF命名时,使用有意义的描述性的名称可以帮助规范文件, 以提高文件可读性.
USE [USE IDREF #IMPLIED]
USE用来引用DEF定义的节点ID, 同时忽略其它的属性和子对象.
提示: 使用USE引用其它的对象而不是复制节点可以提高性能.
警告: 使用USE的代码不要包括DEF或其他的属性值!
name [name: type SFString CDATA #IMPLIED]
必须命名以使Humanoid 运行时能够识别.
version [version: (1.1|2.0) #IMPLIED]
Humanoid Animation 规格的版本
humanoidVersion [humanoidVersion: type SFString CDATA #IMPLIED]
Metadata keyword=value 元数据对.
authorName [authorName: type SFString CDATA #IMPLIED]
Author name.
提示: 能被编码为信息属性对(info attribute keyword=value).
authorEmail [authorEmail: type SFString CDATA #IMPLIED]
作者Email 地址.
提示: 能被编码为信息属性对(info attribute keyword=value).
copyright [copyright: type SFString CDATA #IMPLIED]
版权信息.
提示: 能被编码为信息属性对(info attribute keyword=value).
creationDate [creationDate: type SFString CDATA #IMPLIED]
Humanoid 模型创建时间.
提示: 能被编码为信息属性对(info attribute keyword=value).
usageRestrictions [usageRestrictions: type SFString CDATA #IMPLIED]
作者/所有者指定的使用限制.
提示: 能被编码为信息属性对(info attribute keyword=value).
age [age: type SFString CDATA #IMPLIED]
Humanoid 模型年龄.
提示: 能被编码为信息属性对(info attribute keyword=value).
gender [gender: type SFString CDATA #IMPLIED]
Humanoid 模型性别(典型值 male / female).
height [height: type SFString CDATA #IMPLIED]
Humanoid 模型身高 (米).
提示: 能被编码为信息属性对(info attribute keyword=value).
weight [weight: type SFString CDATA #IMPLIED]
Humanoid 模型体重(千克).
提示: 能被编码为信息属性对(info attribute keyword=value).
info [info: type MFString CDATA #IMPLIED]
元数据对(Metadata keyword=value) VRML 97 编码时, info中包括所有规定的 keyword=value 字符对.
提示: 由于其它 XML Humanoid 属性 可以包括所有信息, info域可以被忽略.
translation [translation: type SFVec3f CDATA "0 0 0"]
子节点的局部坐标系统原点的位置.
rotation [rotation: type SFRotation CDATA "0 0 1 0"]
子节点的局部坐标系统的方位.
scale [scale: type SFVec3f CDATA "1 1 1"]
子节点的局部坐标系统的非一致的x-y-z 比例, 由center和scaleOrientation调节.
scaleOrientation [scaleOrientation: type SFRotation CDATA "0 0 1 0"]
缩放前子节点局部坐标系统的预旋转(允许沿着子节点任意方向缩放).
center [center: type SFVec3f CDATA "0 0 0"]
从局部坐标系统原点的位置偏移.
bboxCenter [bboxCenter: initializeOnly type SFVec3f CDATA "0 0 0"]
边界盒的中心: 从局部坐标系统原点的位置偏移.
bboxSize [bboxSize: initializeOnly type SFVec3f CDATA "-1 -1 -1"]
边界盒尺寸: 缺省情况下是自动计算的, 为了优化场景, 也可以强制指定.
containerField [containerField: NMTOKEN "children"]
containerField 是field标签的前缀, 表明了子节点和父节点的关系. 比如: geometry Box, children Group, proxy Shape. containerField 属性只有在X3D场景用XML编码时才使用.
class [class CDATA #IMPLIED]
class 是用空格分开的类的列表, 保留给XML样式表使用. 只有X3D场景用XML编码时才支持class 属性.
  top   credits   help
HAnimJoint 身体的每一个关节使用Joint节点表现. HAnimJoint 只可能作为另一个HAnimJoint 节点的子节点, 或humanoidBody field中的一个子节点. 提示: Joint 不一定是Segment 的子节点.
DEF [DEF ID #IMPLIED]
DEF给这个节点定义了唯一的ID, 这样在其它节点里就可以引用这个节点.
提示: 为DEF命名时,使用有意义的描述性的名称可以帮助规范文件, 以提高文件可读性.
USE [USE IDREF #IMPLIED]
USE用来引用DEF定义的节点ID, 同时忽略其它的属性和子对象.
提示: 使用USE引用其它的对象而不是复制节点可以提高性能.
警告: 使用USE的代码不要包括DEF或其他的属性值!
name [name: type SFString CDATA #IMPLIED]
Joint 命名很重要! 使用H-Anim 规格中的定义 比如: l_knee r_ankle vc6 l_acromioclavicular r_wrist 之类.
ulimit [ulimit: type MFFloat CDATA #IMPLIED]
最大关节点旋转值限制.
提示: 包括3个值, 每个值对应一个局部轴.
llimit [llimit: type MFFloat CDATA #IMPLIED]
最小关节点旋转值限制.
提示: 包括3个值, 每个值对应一个局部轴.
limitOrientation [limitOrientation: SFRotationLabel; "0 0 1 0"]
旋转上/下限的方位, 向对于关节中心(Joint center).
skinCoordIndex [skinCoordIndex: MFFloatLabel; #IMPLIED]
Coordinate 索引值, 指出关节影响的顶点.
skinCoordWeight [skinCoordWeight: MFFloatLabel; #IMPLIED]
对应skinCoordIndex 域值的变形权重值.
stiffness [stiffness: MFFloatLabel; "0 0 0" (0..1)]
值 (范围0..1) 指示关节如何自动移动. 较大的stiffness值意味着更多的抗力(沿局部 X, Y, Z 轴).
提示: 由反向动力学(IK)系统使用.
translation [translation: type SFVec3f CDATA "0 0 0"]
子节点的局部坐标系统原点的位置.
rotation [rotation: type SFRotation CDATA "0 0 1 0"]
子节点的局部坐标系统的方位.
scale [scale: type SFVec3f CDATA "1 1 1"]
子节点的局部坐标系统的非一致的x-y-z 比例, 由center和scaleOrientation调节.
scaleOrientation [scaleOrientation: type SFRotation CDATA "0 0 1 0"]
缩放前子节点局部坐标系统的预旋转(允许沿着子节点任意方向缩放).
center [center: type SFVec3f CDATA "0 0 0"]
从局部坐标系统原点的位置偏移.
bboxCenter [bboxCenter: initializeOnly type SFVec3f CDATA "0 0 0"]
边界盒的中心: 从局部坐标系统原点的位置偏移.
bboxSize [bboxSize: initializeOnly type SFVec3f CDATA "-1 -1 -1"]
边界盒尺寸: 缺省情况下是自动计算的, 为了优化场景, 也可以强制指定.
containerField [containerField: NMTOKEN "children"]
containerField 是field标签的前缀, 表明了子节点和父节点的关系. 比如: geometry Box, children Group, proxy Shape. containerField 属性只有在X3D场景用XML编码时才使用.
class [class CDATA #IMPLIED]
class 是用空格分开的类的列表, 保留给XML样式表使用. 只有X3D场景用XML编码时才支持class 属性.
  top   credits   help
HAnimSegment 每一个身体部分存在一个HAnimSegment 节点中. HAnimSegment 包含Coordinate, HAnimDisplacer 和children 子节点.
DEF [DEF ID #IMPLIED]
DEF给这个节点定义了唯一的ID, 这样在其它节点里就可以引用这个节点.
提示: 为DEF命名时,使用有意义的描述性的名称可以帮助规范文件, 以提高文件可读性.
USE [USE IDREF #IMPLIED]
USE用来引用DEF定义的节点ID, 同时忽略其它的属性和子对象.
提示: 使用USE引用其它的对象而不是复制节点可以提高性能.
警告: 使用USE的代码不要包括DEF或其他的属性值!
name [name: type SFString CDATA #IMPLIED]
Segment 命名很重要! 使用H-Anim 规格中的定义 比如: l_knee r_ankle vc6 l_acromioclavicular r_wrist 之类.
mass [mass: type SFFloat CDATA "0"]
全部segment的质量, 如果空值将被认为0.
centerOfMass [centerOfMass: type SFVec3f CDATA "0 0 0"]
segment 中的重心位置.
momentsOfInertia [momentsOfInertia: type MFFloat CDATA]
3x3 的力学惯性矩阵. 缺省值: 0 0 0 0 0 0 0 0 0.
bboxCenter [bboxCenter: initializeOnly type SFVec3f CDATA "0 0 0"]
边界盒的中心: 从局部坐标系统原点的位置偏移.
bboxSize [bboxSize: initializeOnly type SFVec3f CDATA "-1 -1 -1"]
边界盒尺寸: 缺省情况下是自动计算的, 为了优化场景, 也可以强制指定.
containerField [containerField: NMTOKEN "children"]
containerField 是field标签的前缀, 表明了子节点和父节点的关系. 比如: geometry Box, children Group, proxy Shape. containerField 属性只有在X3D场景用XML编码时才使用.
class [class CDATA #IMPLIED]
class 是用空格分开的类的列表, 保留给XML样式表使用. 只有X3D场景用XML编码时才支持class 属性.
  top   credits   help
HAnimSite HAnimSite 节点可以满足以下三个目标: (a) 定义一个反向动力学系统IK使用的最终受动器"end effector" 的位置, (b) 定义附件的相关点, 比如首饰或服装 (c) 定义HAnimSegment 参考系中的虚拟摄像机位置 (比如视点 "through the eyes" 用以在多用户环境中使用). 提示: HAnimSegment的子节点中存储HAnimSite节点.
DEF [DEF ID #IMPLIED]
DEF给这个节点定义了唯一的ID, 这样在其它节点里就可以引用这个节点.
提示: 为DEF命名时,使用有意义的描述性的名称可以帮助规范文件, 以提高文件可读性.
USE [USE IDREF #IMPLIED]
USE用来引用DEF定义的节点ID, 同时忽略其它的属性和子对象.
提示: 使用USE引用其它的对象而不是复制节点可以提高性能.
警告: 使用USE的代码不要包括DEF或其他的属性值!
name [name: type SFString CDATA #IMPLIED]
必须命名以使Humanoid 运行时能够识别.
translation [translation: type SFVec3f CDATA "0 0 0"]
子节点的局部坐标系统原点的位置.
rotation [rotation: type SFRotation CDATA "0 0 1 0"]
子节点的局部坐标系统的方位.
scale [scale: type SFVec3f CDATA "1 1 1"]
子节点的局部坐标系统的非一致的x-y-z 比例, 由center和scaleOrientation调节.
scaleOrientation [scaleOrientation: type SFRotation CDATA "0 0 1 0"]
缩放前子节点局部坐标系统的预旋转(允许沿着子节点任意方向缩放).
center [center: type SFVec3f CDATA "0 0 0"]
从局部坐标系统原点的位置偏移.
bboxCenter [bboxCenter: initializeOnly type SFVec3f CDATA "0 0 0"]
边界盒的中心: 从局部坐标系统原点的位置偏移.
bboxSize [bboxSize: initializeOnly type SFVec3f CDATA "-1 -1 -1"]
边界盒尺寸: 缺省情况下是自动计算的, 为了优化场景, 也可以强制指定.
containerField [containerField: NMTOKEN "children"]
containerField 是field标签的前缀, 表明了子节点和父节点的关系. 比如: geometry Box, children Group, proxy Shape. containerField 属性只有在X3D场景用XML编码时才使用.
class [class CDATA #IMPLIED]
class 是用空格分开的类的列表, 保留给XML样式表使用. 只有X3D场景用XML编码时才支持class 属性.

http://17de.com/x3d