编程
Fundamentals
Setting Up Development Environment
UnigineScript
C++
C#
UUSL (Unified UNIGINE Shader Language)
File Formats
Rebuilding the Engine and Tools
GUI
Double Precision Coordinates
应用程序接口
Containers
Common Functionality
Controls-Related Classes
Engine-Related Classes
Filesystem Functionality
GUI-Related Classes
Math Functionality
Node-Related Classes
Networking Functionality
Pathfinding-Related Classes
Physics-Related Classes
Plugins-Related Classes
Rendering-Related Classes

Unigine::Skinner(皮肤处理)

警告
Skinner system is deprecated and no longer supported. We can't guarantee the stable work of the system.

Skinner是一种用于动画的可视化脚本系统。它允许将不同的动画混合在一起创造出具皮肤特征的复杂运动。当然有可能将具有物理特性的布偶囊括到用来播放的动画中(针对整个特性或每个骨状物品)。

Skinner基于Unigine::Schemer。 Skinner的脚本可在data/core/systems/skinner文件夹中找到。
预先定义的Skinnerblocks(块)在默认情况下可用,包含在data/core/systems/skinner/blocks/skinner.blocks文件中。

Skinner graph

Skinner图 (外部基于Qt接口)

How To Use Skinner Graph(使用Skinner图的方式)

Skinner基于Unigine::Schemer得以建立。它与Schemer使用相同的实体(参看Schemer的 综述)并共享 blocks(块)。这就意味着,您可以添加任意的Schemer块以供在Skinner图中使用。

  • Skinner图的创建方式与创建Schemer的方式相同(参看怎样引导)。
  • Skinner控制的skinned网格在脚本中进行说明(参看下方详情)。
  • 默认情况下,Skinner图应当以命名为 updateschemer.entry开始(参看 下方详情)。
  • 可以为播放单一的动画事件创建进入点。进入点可被用来创建瞬时动作,例如钻孔或者拾捡物体的动作,而不是循环播放动画。(参看 下方详情)。
  • 如Schemer的节点一样,所有图形中的Skinner节点通过拖拽路径到input而得到触发。在完成其各自的工作之后,在有下一个节点的情况下,使用一个output(输出)路径来触发下一个节点 。

要开始操作,按照下列步骤来创建一副简单的将动画设置到网格上的图:

  1. 创建命名为 updateschemer.entry作为图像的起始点。
  2. 增加将要加载动画的skinner.animation节点。通过拖拽节点将schemer.entry输出同 skinner.animationinput(输入) 联系起来。这样做,可以表明图像运行之后将执行的节点内容。
  3. 增加schemer.file节点,此节点指定蒙皮动画文件的文件名。将其与skinner.animation节点的 name锚连接起来。
  4. 增加播放动画的skinner.set节点。(即将动画设置到网格上)。此节点需要包含骨转换数据的动画缓冲。将skinner.animation缓冲连接到skinner.set 缓冲。 将skinner.animation输出连接到skinner.set输入,以此指示下一个将被执行的节点。
  5. Skinner图创建或更改之后, 点击 Run按钮。图像外会生成遵从运行的脚本。
  6. 为了使脚本得以加载,在稍后得到编辑并在运行时得到执行,您可以通过Save(保存)键将创建的脚本存为*.script文件。

下方为此简单的Skinner图的模样。节点将按规定的顺序执行。

Simple Skinner graph

简单的Skinner图

Available Skinner Blocks(可用Skinner块)

下列是从data/core/systems/skinner/blocks/skinner.blocks文件中加载的预定义Skinner块。

skinner.add 将两部动画进行求和,例如将两部摆臂动画结合在一起。当一些骨头同时在两部动画中使用时,就需要使用此功能。倘若是单独的动画,使用skinner.combine。此节点会与两部动画的缓冲相乘。
  • buffer(缓冲) — 使用相加后总的动画输出最终缓冲。
  • output(输出) — 最终节点输出。
  • weight(权值) — 范围为[0;1]的插值动画权值:
    • 值为0时,仅使用第一帧动画。
    • 值为1时,最终的结果为两帧动画的总和。
  • out 0 —退出到第一帧动画进行设置 。
  • buf 0 — 来自第一集动画的输入缓冲器。
  • in 0 — 在第一帧动画设置完后输入。
  • out 1 — 退出到第二帧动画进行设置。
  • buf 1 — 来自第二集动画的输入缓冲器。
  • in 1 — 对第二帧动画设置之后输入。
skinner.animation 加载一个动画文件并将动画数据设置到缓冲中。在此之后,可在网格上对其进行设置或者作为针对combining(结合)动画作为输入缓冲器使用等。
  • buffer(缓冲) — 最终使用播放动画的输出缓冲。
  • output(输出) — 最终节点输出。
  • name(名称) — 动画文件名称。 可通过schemer.file进行设置.
  • time(时间) (左边) — 启动动画回放的帧 (在 "from-to" 间隔内)
    • 0意味着from(起始) 帧。此为默认值。
    • 如果提供来自"from-to" 间隔范围外更大的值,那么对应的循环动画帧率会得到设置。
    • 如果通过了浮动参数,那么动画会在附近的帧之间进行插值。
    • 如果提供的是负数,那么从当前帧到from 帧的插值会得以完成。
  • speed(速度) —动画回放的速度(每秒帧数)。
  • from —起始帧的数量。默认为 -1,这意味着来自动画文件的第一帧。
  • to —结束帧的数量。默认值为-1,这意味着来自动画文件的最后一帧。
  • frames(帧) — 动画文件中帧的总数。
  • time (右方) — 动画回放中的当前帧。
skinner.animation2 加载两个动画文件将动画进行混合。最终的插值动画数据会在输出动画缓冲中得到设置。在此之后,此数据可设置到网格中或者作为用于combining(结合)动画的输入缓冲器使用等 。
  • buffer(缓冲) —使用播放动画的最终输出缓冲。
  • output(输出) — 最终节点输出。
  • name 0 — 将被混合的第一个动画文件名。可通过 schemer.file进行设置。
  • name 1 —将被混合的第二个动画文件名。可通过 schemer.file进行设置。
  • speed 0 — 第一帧动画回放的速度(每秒帧数)。
  • speed 1 — 第二帧动画回放的速度 (没秒帧数)。
  • weight(权重) —变化范围为[0;1]之间的插值动画权重:
    • 值为0时,仅使用第一帧动画。
    • 值为0.5时(默认值),两帧动画以相同的比例被使用。
    • 值为1时,仅使用第二帧动画。
skinner.animation3 加载三个动画文件将动画进行混合。最终的插值动画数据会在输出动画缓冲中得到设置。在此之后,此数据可设置到网格中或者作为用于combining(结合)动画的输入缓冲器使用等 。
  • buffer(缓冲) — 使用播放动画的最终输出缓冲。
  • output(输出) — 最终节点输出。
  • name 0 — 将被混合的第一个动画文件名。可通过schemer.file进行设置。
  • name 1 — 将被混合的第二个动画文件名。可通过 schemer.file进行设置。
  • name 2 — 将被混合的第三个动画文件名。可通过 schemer.file进行设置。
  • speed 0 — 第一帧动画回放的速度(每秒帧数)。
  • speed 1 — 第二帧动画回放的速度(每秒帧数)。
  • speed 2 — 第三帧动画回放的速度(每秒帧数)。
  • weight(权重) — 变化范围为[0;1]之间的插值动画权重:
    • 值为0时,仅使用第一帧动画。
    • 值为 0.5 时(默认值),仅使用第二帧动画。
    • 值为 1时, 仅使用第三帧动画。
skinner.blend 将两帧动画混合在一起,每一帧动画的比例有各自的要求。最终的混合动画数据被设为输出动画缓冲(例如,在此之后 设置到网格上)。
混合物应当与两个skinner节点相连,这些节点将数据设置为混合物的两个动画缓冲(例如,skinner.animation节点)。第一个循环动画存在于out 0,进入另一个skinner节点并从此节点在in 0上返回。来自Skinner节点的缓冲进入混合物的buf 0 。第二个循环动画除使用了out 1in 1buf 1 外,其它都相同。在使用动画数据获得两个缓冲后,合成器会将两个缓冲合并成一个,最终以缓冲的形式输出。
用于每个动画混合的插值权重被加在一起。
  • buffer(缓冲) — 使用播放动画的最终输出缓冲。
  • output(输出) — 最终节点输出。
  • weight 0 — 变化范围为[0;1]的第一帧动画插值权重。
    • 值为0时, 使用第一帧动画。
    • 非0值时,基于所有动画权重的最终比例使用第一帧动画。
  • weight 1 — 变化范围为[0;1]的第二帧动画插值权重。
    • 值为 0时, 使用第二帧动画。
    • 非0值时,基于所有动画权重的最终比例使用第二帧动画。
  • out 0 — 退出到第一帧动画进行设置。
  • buf 0 — 来自第一集动画的输入缓冲器。
  • in 0 — 在第一帧动画设置完后输入。
  • out 1 — 退出到第二帧动画进行设置。
  • buf 1 — 来自第二集动画的输入缓冲器。
  • in 1 — 在第二帧动画设置完后输入。
skinner.blend3 将三帧动画混合在一起,每一帧动画的比例有各自的要求。最终的混合动画数据被设为输出动画缓冲(例如,在此之后设置到网格上)。
混合物应当与三个skinner节点相连,这些节点将数据设置为混合物的三个动画缓冲(例如,skinner.animation 节点)。第一个循环动画存在于out 0,进入另一个skinner节点并从此节点在in 0上返回。来自Skinner节点的缓冲进入混合物的buf 0 。其它两个循环动画除使用了out 1out 2 (和其它锚)外,其它都相同。 在使用动画数据获得三个缓冲后,合成器会将三个缓冲合并成一个,最终以 缓冲的形式输出。
用于每个动画混合的插值权重被加在一起。
  • buffer(缓冲) — 使用播放动画的最终输出缓冲。
  • output(输出) — 最终节点输出。
  • weight 0 — 变化范围为[0;1]的第一帧动画插值权重。
    • 值为 0时, 不使用第一帧动画。
    • 非0值时,基于所有动画权重的最终比例使用第一帧动画。
  • weight 1 — 变化范围为[0;1]的第二帧动画插值权重。
    • 值为 0时, 不使用第二帧动画。
    • 非0值时, 基于所有动画权重的最终比例使用第二帧动画。
  • weight 2 — 变化范围为[0;1]的第三帧动画插值权重。
    • 值为 0时, 不使用第三帧动画。
    • 非0值时, 基于所有动画权重的最终比例使用第三帧动画。
  • out 0 — 退出到第一帧动画进行设置 。
  • buf 0 — 来自第一集动画的输入缓冲器。
  • in 0 — 在第一帧动画设置完后输入。
  • out 1 — 退出到第二帧动画进行设置。
  • buf 1 — 来自第二集动画的输入缓冲器。
  • in 1 — 在第二帧动画设置完后输入。
  • out 2 — 退出到第三帧动画进行设置。
  • buf 2 — 来自第三集动画的输入缓冲器。
  • in 2 — 在第三帧动画设置完后输入。
skinner.blend4 将四帧动画混合在一起,每一帧动画的比例有各自的要求。最终的混合动画数据被设为输出动画缓冲(例如,在此之后 设置 到网格上)。
混合物应当与四个skinner节点相连,这些节点将数据设置为混合物的四个动画缓冲(例如,skinner.animation节点)。 第一个循环动画存在于out 0,进入另一个skinner节点并从此节点在in 0上返回。来自Skinner节点的缓冲进入混合物的 buf 0 。其它三个循环动画除使用了 out 1out 2out 3 (和其它锚)外,其它都相同。 在使用动画数据获得四个缓冲后,合成器会将四个缓冲合并成一个,最终以缓冲的形式输出。
用于每个动画混合的插值权重被加在一起。
  • buffer(缓冲) — 使用播放动画的最终输出缓冲。
  • output(输出) — 最终节点输出。
  • weight 0 — 变化范围为[0;1]的第一帧动画插值权重。
    • 值为0时, 不使用第一帧动画。
    • 非0值时,基于所有动画权重的最终比例使用第一帧动画。
  • weight 1 — 变化范围为[0;1]的第二帧动画插值权重。
    • 值为0时, 不使用第二帧动画。
    • 非0值时,基于所有动画权重的最终比例使用第二帧动画。
  • weight 2 — 变化范围为[0;1]的第三帧动画插值权重。
    • 值为0时, 不使用第三帧动画。
    • 非0值时,基于所有动画权重的最终比例使用第三帧动画。
  • weight 3 — 变化范围为[0;1]的第四帧动画插值权重。
    • 值为0时, 不使用第四帧动画。
    • 非0值时,基于所有动画权重的最终比例使用第四帧动画。
  • out 0 — 退出到第一帧动画进行设置。
  • buf 0 — 来自第一集动画的输入缓冲器。
  • in 0 — 在第一帧动画设置完后输入。
  • out 1 — 退出到第二帧动画进行设置。
  • buf 1 — 来自第二集动画的输入缓冲器。
  • in 1 — 在第二帧动画设置完后输入。
  • out 2 — 退出到第三帧动画进行设置。
  • buf 2 — 来自第三集动画的输入缓冲器。
  • in 2 — 在第三帧动画设置完后输入。
  • out 3 — 退出到第四帧动画进行设置。
  • buf 3 — 来自第四集动画的输入缓冲器。
  • in 3 — 在第四帧动画设置完后输入。
skinner.blend5 将五帧动画混合在一起,每一帧动画的比例有各自的要求。最终的混合动画数据被设为输出动画缓冲(例如,在此之后 设置 到网格上)。
混合物应当与五个skinner节点相连,这些节点将数据设置为混合物的五个动画缓冲(例如,skinner.animation 节点)。 第一个循环动画存在于out 0,进入另一个skinner节点并从此节点在in 0上返回。来自Skinner节点的缓冲进入混合物的 buf 0 。其它四个循环动画除使用了 out 1out 2out 3 (和其它锚)外,其它都相同。 在使用动画数据获得五个缓冲后,合成器会将五个缓冲合并成一个,最终以缓冲的形式输出。
用于每个动画混合的插值权重被加在一起。
  • buffer(缓冲) — 使用播放动画的最终输出缓冲。
  • output(输出) — 最终节点输出。
  • weight 0 — 变化范围为[0;1]的第一帧动画插值权重。
    • 值为 0时, 不使用第一帧动画。
    • 非0值时,基于所有动画权重的最终比例使用第一帧动画。
  • weight 1 — 变化范围为[0;1]的第二帧动画插值权重。
    • 值为 0时, 不使用第二帧动画。
    • 非0值时,基于所有动画权重的最终比例使用第二帧动画。
  • weight 2 — 变化范围为[0;1]的第三帧动画插值权重。
    • 值为 0时, 不使用第三帧动画。
    • 非0值时,基于所有动画权重的最终比例使用第三帧动画。
  • weight 3 — 变化范围为[0;1]的第四帧动画插值权重。
    • 值为 0时, 不使用第四帧动画。
    • 非0值时,基于所有动画权重的最终比例使用第四帧动画。
  • weight 4 — 变化范围为[0;1]的第五帧动画插值权重。
    • 值为 0时, 不使用第五帧动画。
    • 非0值时,基于所有动画权重的最终比例使用第五帧动画。
  • out 0 — 退出到第一帧动画进行设置。
  • buf 0 — 来自第一集动画的输入缓冲器。
  • in 0 — 在第一帧动画设置完后输入。
  • out 1 — 退出到第二帧动画进行设置。
  • buf 1 — 来自第二集动画的输入缓冲器。
  • in 1 — 在第二帧动画设置完后输入。
  • out 2 — 退出到第三帧动画进行设置。
  • buf 2 — 来自第三集动画的输入缓冲器。
  • in 2 — 在第三帧动画设置完后输入。
  • out 3 — 退出到第四帧动画进行设置。
  • buf 3 — 来自第四集动画的输入缓冲器。
  • in 3 — 在第四帧动画设置完后输入。
  • out 4 — 退出到第五帧动画进行设置。
  • buf 4 — 来自第五集动画的输入缓冲器。
  • in 4 — 在第五帧动画设置完后输入。
skinner.bone 为骨设置一个名称。在设置一个骨之后,其可用于 ragdoll(布偶猫)动画或者用于定制转换
  • bone — bone来自于skinned网格,负载在Skinner的start-up之上。
skinner.combine 将两帧单独的动画结合在一起,例如将arms动画同legs动画结合在一起。当两部动画中无同时使用的骨时,使用此功能。否则使用skinner.add
此合成器应与两个skinner节点相连接,这两个节点将数据设置为合成器的两个动画缓冲。(例如, skinner.animation节点)。第一个循环动画存在于out 0之上,进入另一个skinner节点,并从此节点返回到 in 0上。来自此节点的缓冲进入合成器的buf 0。第二个循环动画除使用out 1in 1buf 1之外,其它部分与第一个循环动画相同。在使用动画数据得到两个缓冲之后,融合器会将此两个缓冲融合成一个,并将其作为最终缓冲 输出,此缓冲可被设置到网格上。
  • buffer(缓冲) — 使用结合动画的最终输出缓冲。
  • output(输出) — 最终合成器节点输出。
  • out 0 — 退出到第一帧动画进行设置。
  • buf 0 — 来自第一集动画的输入缓冲器。
  • in 0 — 在第一帧动画设置完后输入。
  • out 1 — 退出到第二帧动画进行设置。
  • buf 1 — 来自第二集动画的输入缓冲器。
  • in 1 — 在第二帧动画设置完后输入。
skinner.combine3 将三帧单独的动画结合在一起,例如将arms动画,legs动画和torso动画结合在一起。当三部动画中无同时使用的骨时,使用此功能。否则使用 skinner.add
此合成器应与三个skinner节点相连接,这三个节点将数据设置为合成器的两个动画缓冲。(例如, skinner.animation节点)。第一个循环动画存在于out 0之上,进入另一个skinner节点,并从此节点返回到in 0上。 来自此节点的缓冲进入合成器的buf 0。第二个与第三个循环动画除使用out 1out 2 (以及其它的锚)之外,其它的都相同。在使用动画数据得到三个缓冲之后,融合器会将此三个缓冲融合成一个,并将其作为最终 缓冲 输出,此缓冲可被 设置 到网格上。
  • buffer(缓冲) — 使用结合动画的最终输出缓冲。
  • output(输出) — 最终合成器节点输出。
  • out 0 — 退出到第一帧动画进行设置。
  • buf 0 — 来自第一集动画的输入缓冲器。
  • in 0 — 在第一帧动画设置完后输入。
  • out 1 — 退出到第二帧动画进行设置。
  • buf 1 — 来自第二集动画的输入缓冲器。
  • in 1 — 在第三帧动画设置完后输入。
  • out 2 — 退出到第三帧动画进行设置。
  • buf 2 — 来自第三集动画的输入缓冲器。
  • in 2 — 在第三帧动画设置完后输入。
skinner.combine4 将四帧单独的动画结合在一起,例如将arms动画,legs动画,torso动画和head动画结合在一起。当四部动画中无同时使用的骨时,使用此功能。否则使用 skinner.add
此合成器应与四个skinner节点相连接,这四个节点将数据设置为合成器的两个动画缓冲。(例如, skinner.animation 节点)。 第一个循环动画存在于out 0之上,进入另一个skinner节点,并从此节点返回到in 0上。来自此节点的缓冲进入合成器的buf 0 。其它的动画除使用out 1out 2out 3 (以及其它的锚)之外,都相同。在使用动画数据得到四个缓冲之后,融合器会将此四个缓冲融合成一个,并将其作为最终缓冲 输出,此缓冲可被 设置到网格上。
  • buffer(缓冲) — 使用结合动画的输出缓冲。
  • output(输出) — 最终合成器节点输出。
  • out 0 — 退出到第一帧动画进行设置。
  • buf 0 — 来自第一集动画的输入缓冲器。
  • in 0 — 在第一帧动画设置完后输入。
  • out 1 — 退出到第二帧动画进行设置。
  • buf 1 — 来自第二集动画的输入缓冲器。
  • in 1 — 在第三帧动画设置完后输入。
  • out 2 — 退出到第三帧动画进行设置。
  • buf 2 — 来自第三集动画的输入缓冲器。
  • in 2 — 在第三帧动画设置完后输入。
  • out 3 — 退出到第四帧动画进行设置。
  • buf 3 — 来自第四集动画的输入缓冲器。
  • in 3 — 在第四帧动画设置完后输入。
skinner.combine5 将五帧单独的动画结合在一起。当动画中无同时使用的骨时,使用此功能。否则使用 skinner.add
此合成器应与五个skinner节点相连接,这五个节点将数据设置为合成器的两个动画缓冲。(例如, skinner.animation 节点)。 第一个循环动画存在于out 0之上,进入另一个skinner节点,并从此节点返回到in 0上。来自此节点的缓冲进入合成器的buf 0 。其它的动画除使用 out 1out 2out 3out 4 (以及其它的锚)之外,都相同。 在使用动画数据得到五个缓冲之后,融合器会将此五个缓冲融合成一个,并将其作为最终 缓冲输出,此缓冲可被设置到网格上。
  • buffer(缓冲) — 使用结合动画的输出缓冲。
  • output(输出) — 最终合成器节点输出。
  • out 0 — 退出到第一帧动画进行设置。
  • buf 0 — 来自第一集动画的输入缓冲器。
  • in 0 — 在第一帧动画设置完后输入。
  • out 1 — 退出到第二帧动画进行设置。
  • buf 1 — 来自第二集动画的输入缓冲器。
  • in 1 — 在第三帧动画设置完后输入。
  • out 2 — 退出到第三帧动画进行设置。
  • buf 2 — 来自第三集动画的输入缓冲器。
  • in 2 — 在第三帧动画设置完后输入。
  • out 3 — 退出到第四帧动画进行设置。
  • buf 3 — 来自第四集动画的输入缓冲器。
  • in 3 — 在第四帧动画设置完后输入。
  • out 4 — 退出到第五帧动画进行设置。
  • buf 4 —来自第五集动画的输入缓冲器
  • in 4 — 在第五帧动画设置完后输入。
skinner.difference 计算加载动画参考系与此动画的其它框架之间的差别。它计算用于相对播放动画的每个框架在骨转换时的差别,例如绑定姿势(0框架)。在此之后,此数据会被输出到缓冲并被负载到另一帧动画上,例如,将breathing动画(通过差异性进行计算)与其它含有torso运动的动画结合起来。
  • buffer(缓冲) — 使用对相对于参考系进行计算所得出的动画数据进行缓冲输出。
  • output(输出) — 最终节点输出。
  • name(名称) — 负载动画的名称。
  • reference (0.0f) — 来自负载动画的参考。默认情况为绑定姿势(0 框架)。如果数值不是整数,参考动画框架会在加载的框架之间插值。
  • time(时间) (左边) — 用来开始动画回放的起始位置的帧(在"from-to"间隔中) 。
    • 0意味着from 框架。此为默认值。
    • 如果在"from-to"间隔外提供更大的值,循环动画对应的框架会得到设置。
    • 如果通过了某个浮动参数,那么动画会在附近的框架之间进行插值。
    • 如果提供的为负值,那么从当前框架到from框架都将完成插值。
  • speed(速度) — 动画回放速度(每秒帧数)。
  • from — 开始帧数量。 默认值-1指来自动画文件的第一帧。
  • to — 结束帧数量。默认值-1指来自动画文件的最后一帧。
  • frames — 动画文件中帧的总数量。
  • time(时间) (右方) — 动画回放中当前帧。
skinner.get 在当前播放的skinned动画外创建缓冲。它被用来在skinned动画与ragdoll动画之间进行混合。此节点应当与将动画设置在网格上的节点或者基于框架的节点或者ragdoll节点进行连接。通常,其通过大量的节点得到连接,这些节点在分枝图的末端将动画缓冲设置成skinner.set
  • output(输出) (左方) — 在get block完成其自身的工作后输出。
  • output(输出) (右方) — 即刻输出。
  • buffer(缓冲) — 使用存储动画数据的输出缓冲。
  • input(输入) — 在即刻输出退出后输入。
skinner.inverse 使动画发生反转。此节点应与另一个skinner节点相连接,此skinner节点将数据设置为动画缓冲(例如, skinner.animation 节点)。循环动画存在于右方的output上,进入另一个skinner节点并从此节点返回到右方的input。来自某个skinner节点的缓冲进入到右方的缓冲
此版块根据下列公式进行工作:
源代码 (UnigineScript)
pos = -src_pos;
rot = inverse(src_rot)(-src_rot);
scale = 1.0/src_scale;
  • output(输出) (右方) — 即刻输出。
  • buffer(缓冲) (右方) — 使用存储动画数据的输入缓冲器。
  • input(输入) (右方) — 即刻输出退出后输入得到使用。
  • output(输出) (左边) — 在Get block完成其自身的工作后输出。
  • buffer(缓冲) (左方) — 使用经颠倒处理过动画的输出缓冲。
skinner.lerp 在两部动画间按照所需比例进行线性插值。
此节点应当与两个skinner节点相连接,这两个节点将数据设置为动画缓冲(例如,skinner.animation节点)。第一部循环动画存在于out 0上,进入另一个skinner节点并从此节点返回到in 0上。来自Skinner节点的缓冲进入插值器的buf 0。第二部循环动画除使用out 1in 1buf 1外,其它都相同。在使用动画数据获得两个缓冲后,插值器会将两个缓冲篡改成一个,作为最终缓冲输出。
  • buffer(缓冲) — 使用被插值动画的输出缓冲。
  • output(输出) (左方) — 插值器在完成其自身的工作后的输出。
  • weight(权值) — 用于范围为[0;1]的插值动画权值:
    • 值为0时,仅使用第一帧动画。
    • 值为0.5时(默认值),会使用两部动画。
    • 值为1时,仅使用第二部动画。
  • out 0 — 退出到第一帧动画进行设置。
  • buf 0 — 来自第一集动画的输入缓冲器。
  • in 0 — 在第一帧动画设置完后输入。
  • out 1 — 退出到第二帧动画进行设置。
  • buf 1 — 来自第二集动画的输入缓冲器。
  • in 1 — 在第二帧动画设置完后输入。
skinner.lerp3 在三部动画间按照所需比例进行线性插值。
此节点应当与三个skinner节点相连接,这三个节点将数据设置为动画缓冲(例如,skinner.animation节点)。第一部循环动画存在于out 0上,进入另一个skinner节点并从此节点返回到in 0上。来自Skinner节点的缓冲进入插值器的buf 0。其它循环动画除使用out 1out 2 (和其它锚) 外,其它都相同。 在使用动画数据获得三个缓冲后,插值器会将三个缓冲篡改成一个,作为最终缓冲输出。
  • buffer(缓冲) — 使用被插值动画的输出缓冲。
  • output(输出) (左方) — 插值器在完成其自身的工作后的输出。
  • weight(权值) — 用于范围为[0;1]的插值动画权值:
    • 值为0时,仅使用第一帧动画。
    • 值为0.5时(默认值),仅使用第二部动画。
    • 值为1时,仅使用第三部动画。
  • out 0 — 退出到第一帧动画进行设置。
  • buf 0 — 来自第一集动画的输入缓冲器。
  • in 0 — 在第一帧动画设置完后输入。
  • out 1 —退出到第二帧动画进行设置。
  • buf 1 — 来自第二集动画的输入缓冲器。
  • in 1 — 在第二帧动画设置完后输入。
  • out 2 — 退出到第三帧动画进行设置。
  • buf 2 — 来自第三集动画的输入缓冲器。
  • in 2 — 在第三帧动画设置完后输入。
skinner.lookat 考虑到头顶方向的控制。例如,其可被用来控制3D空间内字符在什么情况下显示。
此节点应当和一个skinner节点相连接,此skinner节点将数据设置为动画缓冲(例如,skinner.animation 节点)。循环动画存在于out 0上,进入另一个skinner节点并从此节点返回到in 0上。来自Skinner节点的缓冲进入Lookat节点的buf 0
  • buffer(缓冲) — 使用被控制动画的输出缓冲。
  • output(输出) (左方) — Lookat节点在完成其自身的工作后的输出。
  • bone(骨) — 骨 (每个Lookat节点仅使用一根骨)。可通过skinner.bone对其进行设置。
  • pos —指向look at。默认情况下,其为其为世界坐标的原点。
  • speed(速度) — 头部运动到指定位置处的运动速度。默认值为每秒360度。
  • min x — 沿着X轴的最大旋转 (对于左边的文字)。默认为-90度。
  • min y — 沿着Y轴的最大旋转 (朝上)。 默认为-90度。
  • max x — 沿着X轴的最大旋转 (朝向文字的右方)。默认为90度。
  • max x — 沿着X轴的最大旋转(朝下)。 默认为90度。
  • output(输出) — 退出到循环动画。
  • buffer(缓冲) — 来自设置的动画输入缓冲器。
  • input(输入) — 在动画设置之后输入。
skinner.ragdoll 启用用于skinned网格的物理性驱动ragdoll动画("death")。可针对整个网格(如果无具体指定的骨)或者针对一个单独的骨对其进行设置。
  • enables(启用)0意味着禁用一个ragdoll。1意味着启用ragdoll。
  • bone(骨) — 一个将为物理所驱动的骨。(仅应使用一个骨)。可通过skinner.bone对其进行设置。
skinner.rotation 沿着指定轴通过所给的角度对骨进行旋转。
此节点应与一个skinner节点相连接,此skinner节点会将数据设置成动画缓冲(例如, skinner.animation 节点)。 循环动画存在于右方的output之上,进入另一个skinner节点,并从此节点返回到右方的input。 来自Skinner节点的缓冲进入Lookat节点右方的缓冲
  • buffer(缓冲) (左方) — 使用旋转骨的输出动画缓冲。
  • output(输出) (左方) — 在旋转节点完成其自身工作之后输出。
  • bone(骨) — 将被旋转的骨(仅使用一根骨)。可通过skinner.bone进行设置。
  • axis(轴) — 旋转骨时围绕的轴。默认情况下为vec3(0,0,1),即围绕Z轴旋转。
  • angle(角度) — 旋转角度。默认为0,即无旋转。
  • output(输出) (右方) — 退出到循环动画。
  • buffer(缓冲) — 来自设置的动画输入缓冲器。
  • input(输入) — 在动画设置之后输入。
skinner.sequence 加载动画,并将动画设置为动画缓冲。当节点通过play(播放) 输入被触发时,此动画仅能播放一次。当动画回放快结束时,定序器会触发下一个通过stop输出而连接的节点。在此之后,动画会一直播放直至结束。为保证定序器进行合适的工作,stop 输出应当时刻返回到右边的输入(如有必要,可在传递给其它节点之后进行)。
  • buffer(缓冲) — 使用加载动画的输出动画缓冲。
  • output(输出) (左方) — 用于创建循环动画的输出(将动画设置为另一个节点)。
  • name(名称) — 将被加载的动画文件名。可通过schemer.file进行设置。
  • threshold(阈值) — 回放结束用来触发stop 输出前的时间(以秒计算)。默认值为1秒。
  • speed(速度) — 动画回放的速度。
  • from — 用于动画回放的开始帧数量。 默认值-1意味着来自动画文件的第一帧。
  • to — 动画回放的结束帧数量。默认值-1意味着来自动画文件的最后一帧。
  • stop — 在动画完全停止之前有多余threshold(阈值)时间时,触发输出。输出应当同右方的input(输入)相连接。
  • input(输入) (右方) — 在使用stop输出之后输出。
  • frames(帧) — 动画文件中帧的总数。
  • weight(权值) — 范围为[0;1]的系数,此系数表明在最终threshold(阈值)时间间隔期间用于停止动画的进程。
    • 在播放动画时返回 0值,直到其达到stop(停止)点。
    • 当动画回放完全停止时,返回1值。
  • play(播放) — 触发动画回放的输入。
  • output(输出) (底部)— 当动画播放到末尾时使用的输出(不同于会在动画实际结束之前触发的stop输出)。
skinner.set 将动画设置到网格上进行播放。此节点可与另一个从文件中加载动画且将数据设置为动画缓冲的节点相连接(例如,skinner.animation 节点)。 循环动画存在于右方的 output之上,进入另一个skinner节点,并从此节点返回到右方的input。来自Skinner节点的动画数据进入到缓冲中。
  • output(输出) (左方) — 在Set节点完成其自身工作后使用输出。
  • input(输入) (右方) — 来自循环动画的返回输入。
  • buffer(缓冲) — 使用将被渲染的动画数据的输入缓冲。
skinner.smooth 允许根据当前帧速率作出的值的平顺改变。在计算动画参数时,使用此块来避免不必要的尖峰电压。使用其计算参数值(三角点)方面的变化并通过 "每秒values(数值)"对其进行限制。
  • value(数值) (左方) — 输入数值以实现平滑。
  • speed(速度) — 对数值进行平滑处理的速度。
    • 默认值为每秒1
    • 数值越高,数值平滑处理的速度就越快。
  • min — 将使用的最小可能性值。如果输入值更低,它将被固定为此值。默认值为0
  • max — 将使用的最大可能性值。如果输入的值更高,那么就会固定为此值。默认值为1
  • output(输出) — 在Set节点完成其自身工作后使用输出。
  • value(数值) (右方) — 输出经平顺处理的值。
skinner.sub 减去来自第一个skinner的第二幅动画。
此减法单元应当与两个skinner节点相连接,这两个节点将数据设置为两个动画缓冲(例如,skinner.animation 节点)。 第一个循环动画存在于out 0之上,进入另一个skinner节点,并从此节点返回到in 0。来自Skinner节点的缓冲进入混合器的buf 0。第二帧循环动画除使用out 1in 1buf 1 外其它都一样。 在使用动画数据得到两个缓冲之后,减法单元会减去来自第二个缓冲的第一个缓冲并将最终结果输出为缓冲
  • buffer(缓冲) — 使用被减后的动画数据的输出缓冲。
  • output(输出) — 在减法单元完成其自身工作后使用的输出。
  • weight(权值) — 范围为[0;1]的插值动画权值;
    • 值为0时,仅使用第一帧动画。
    • 值为 1时 (默认值),结果等于第一帧动画减去第二帧动画的值。
  • out 0 — 退回到第一帧动画进行设置。
  • buf 0 — 来自第一集动画的输入缓冲器。
  • in 0 — 在第一帧动画设置完后输入。
  • out 1 — 退回到第二帧动画进行设置。
  • buf 1 — 来自第二集动画的输入缓冲器。
  • in 1 — 在第二帧动画设置完后输入。
skinner.switch 允许依靠触发值在两部不同的动画间进行转换。如果触发值等于0,将播放第一帧动画。如果触发值等于1,会选择第二帧动画。当触发器表明应当完成动画状态间的转换时,对动画的平滑插值会进行。使用所给速度可融合成新的动画状态。可使用转换器,例如在基于文件的动画和物理驱动的ragdoll之间进行转换。
转换器应该与两个skinner节点相连接,这两个节点将数据设置为两部动画缓冲(例如,skinner.animation节点)。第一部循环动画存在于out 0之上,进入另一个skinner节点,并从此节点返回到in 0。来自Skinner节点的缓冲进入转换器的buf 0。第二部循环动画除使用out 1in 1buf 1 外其它都一样。在使用动画数据获得两个缓冲后,转换器会选择将被输出的动画或者以必要的比例将动画混合在一起将结果输出到缓冲中。
  • buffer(缓冲) — 使用动画数据的输出缓冲。
  • output(输出) — 在转换器完成其工作后使用的输出。
  • value(值) — 在范围为[0;1]的两部动画间进行转换的触发值。
    • 值为0时 (默认情况),仅播放第一帧动画。
    • 值为1时,仅播放第二帧动画。
    • 01 之间的值表明动画状态间的转换。
  • speed(速度) — 动画状态间的转换速度。
    • 默认每秒的权值为1
    • 数值越高,动画状态间的转换速度越快。
  • out 0 — 退出到第一帧动画进行设置。
  • buf 0 — 来自第一集动画的输入缓冲器。
  • in 0 — 在第一帧动画设置完后输入。
  • out 1 — 退回到第二帧动画进行设置。
  • buf 1 — 来自第二集动画的输入缓冲器。
  • in 1 — 在第二帧动画设置完后输入。
  • weight 0 — 用于范围为[0;1]的第一帧动画插值状态的当前权值:
    • 值为0时表示未使用第一帧动画。
    • 值为 1时表示第一帧动画被完全使用。
  • weight 1 — 用于范围为[0;1]的第二帧动画插值状态的当前权值:
    • 值为0时表示未使用第二帧动画。
    • 值为 1时表示第二帧动画被完全使用。
skinner.switch3 允许依靠触发值在三部不同的动画间进行转换。如果触发值等于0,将播放第一帧动画。如果触发值等于1,会选择第二帧动画。如果触发值等于2,将播放第三帧动画。当触发器表明应当完成动画状态间的转换时,对动画的平滑插值会进行。使用所给速度可融合成新的动画状态。
转换器应该与三个skinner节点相连接,这三个节点将数据设置为三部动画缓冲(例如,skinner.animation 节点)。第一部循环动画存在于out 0之上,进入另一个skinner节点,并从此节点返回到in 0。来自Skinner节点的缓冲进入转换器的buf 0。其它循环动画除使用out 1out 2 (和其它锚)外其它都一样。在使用动画数据获得三个缓冲后,转换器会选择将被输出的动画或者以必要的比例将动画混合在一起将结果输出到缓冲中。
  • buffer(缓冲) — 使用动画数据的输出缓冲。
  • output(输出) — 在转换器完成其工作后使用的输出。
  • value(值) — 在范围为[0;1]的两部动画间进行转换的触发值。
    • 值为0时 (默认情况),仅使用第一帧动画。
    • 值为1时,仅使用第二帧动画。
    • 值为 2时,仅使用第三帧动画。
    • 范围在(0;1) 和 (1;2)之间的值表明动画状态间的转换。
  • speed(速度) — 动画状态间的转换速度。
    • 默认每秒的权值为1
    • 数值越高,动画状态间的转换速度越快。
  • out 0 — 退出到第一帧动画进行设置。
  • buf 0 — 来自第一集动画的输入缓冲器。
  • in 0 — 在第一帧动画设置完后输入。
  • out 1 — 退回到第二帧动画进行设置。
  • buf 1 — 来自第二集动画的输入缓冲器。
  • in 1 — 在第二帧动画设置完后输入。
  • out 2 — 退回到第三帧动画进行设置。
  • buf 2 — 来自第三集动画的输入缓冲器。
  • in 2 — 在第三帧动画设置完后输入。
  • weight 0 — 用于范围为[0;1]的第一帧动画插值状态的当前权值:
    • 值为0时表示未使用第一帧动画。
    • 值为1时表示第一帧动画被完全使用。
  • weight 1 — 用于范围为[0;1]的第二帧动画插值状态的当前权值:
    • 值为0时表示未使用第二帧动画。
    • 值为1时表示第二帧动画被完全使用。
  • weight 2 — 用于范围为[0;1]的第三帧动画插值状态的当前权值:
    • 值为0时表示未使用第三帧动画。
    • 值为1时表示第三帧动画被完全使用。
skinner.switch4 允许依靠触发值在四部不同的动画间进行转换。如果触发值等于0,将播放第一帧动画。如果触发值等于1,会选择第二帧动画等。当触发器表明应当完成动画状态间的转换时,对动画的平滑插值会进行。使用所给速度可融合成新的动画状态。
转换器应该与四个skinner节点相连接,这四个节点将数据设置为四部动画缓冲(例如, skinner.animation节点)。第一部循环动画存在于out 0之上,进入另一个skinner节点,并从此节点返回到in 0。来自Skinner节点的缓冲进入转换器的buf 0。其它循环动画除使用out 1out 2out 3(和其它锚)外其它都一样。在使用动画数据获得四个缓冲后,转换器会选择将被输出的动画或者以必要的比例将动画混合在一起将结果输出到缓冲中。
  • buffer(缓冲) — 使用动画数据的输出缓冲。
  • output(输出) —在转换器完成其工作后使用的输出。
  • value(值) — 在范围为[0;1]的两部动画间进行转换的触发值。
    • 值为0时 (默认情况),仅使用第一帧动画。
    • 值为1时,仅使用第二帧动画。
    • 值为2时,仅使用第三帧动画。
    • 值为3时,仅使用第四帧动画。
    • 范围在(0;1),(1;2) 和 (2;3)之间的值表明动画状态间的转换。
  • speed(速度) — 动画状态间的转换速度。
    • 默认每秒的权值为1
    • 数值越高,动画状态间的转换速度越快。
  • out 0 — 退出到第一帧动画进行设置。
  • buf 0 — 来自第一集动画的输入缓冲器。
  • in 0 — 在第一帧动画设置完后输入。
  • out 1 — 退回到第二帧动画进行设置。
  • buf 1 — 来自第二集动画的输入缓冲器。
  • in 1 — 在第二帧动画设置完后输入。
  • out 2 — 退回到第三帧动画进行设置。
  • buf 2 — 来自第三集动画的输入缓冲器。
  • in 2 — 在第三帧动画设置完后输入。
  • out 3 — 退回到第四帧动画进行设置。
  • buf 3 — 来自第四集动画的输入缓冲器。
  • in 3 — 在第四帧动画设置完后输入。
  • weight 0 — 用于范围为[0;1]的第一帧动画插值状态的当前权值:
    • 值为0时表示未使用第一帧动画。
    • 值为1时表示第一帧动画被完全使用。
  • weight 1 — 用于范围为[0;1]的第二帧动画插值状态的当前权值:
    • 值为0时表示未使用第二帧动画。
    • 值为1时表示第二帧动画被完全使用。
  • weight 2 — 用于范围为[0;1]的第三帧动画插值状态的当前权值:
    • 值为0时表示未使用第三帧动画。
    • 值为1时表示第三帧动画被完全使用。
  • weight 3 — 用于范围为[0;1]的第四帧动画插值状态的当前权值:
    • 值为0时表示未使用第四帧动画。
    • 值为1时表示第四帧动画被完全使用。
skinner.switch5 允许依靠触发值在五部不同的动画间进行转换。如果触发值等于0,将播放第一帧动画。如果触发值等于1,会选择第二帧动画等。当触发器表明应当完成动画状态间的转换时,对动画的平滑插值会进行。使用所给速度可融合成新的动画状态。
转换器应该与五个skinner节点相连接,这五个节点将数据设置为五部动画缓冲(例如,skinner.animation 节点)。第一部循环动画存在于out 0之上,进入另一个skinner节点,并从此节点返回到in 0。来自Skinner节点的缓冲进入转换器的buf 0。其它循环动画除使用out 1out 2out 3out 4(和其它锚)外其它都一样。在使用动画数据获得五个缓冲后,转换器会选择将被输出的动画或者以必要的比例将动画混合在一起将结果输出到缓冲中。
  • buffer(缓冲) — 使用动画数据的输出缓冲。
  • output(输出) — 在转换器完成其工作后使用的输出。
  • value(值) — 在范围为[0;1]的两部动画间进行转换的触发值。
    • 值为0时 (默认情况),仅使用第一帧动画。
    • 值为1时,仅使用第二帧动画。
    • 值为2时,仅使用第三帧动画。
    • 值为3时,仅使用第四帧动画。
    • 值为4时,仅使用第五帧动画。
    • 范围在(0;1),(1;2),(2;3)和(3;4) 之间的值表明动画状态间的转换。(3;4)
  • speed(速度) —动画状态间的转换速度。
    • 默认每秒的权值为1
    • 数值越高,动画状态间的转换速度越快。
  • out 0 — 退出到第一帧动画进行设置。
  • buf 0 — 来自第一集动画的输入缓冲器。
  • in 0 — 在第一帧动画设置完后输入。
  • out 1 — 退回到第二帧动画进行设置。
  • buf 1 — 来自第二集动画的输入缓冲器。
  • in 1 — 在第二帧动画设置完后输入。
  • out 2 — 退回到第三帧动画进行设置。
  • buf 2 — 来自第三集动画的输入缓冲器。
  • in 2 — 在第三帧动画设置完后输入。
  • out 3 — 退回到第四帧动画进行设置。
  • buf 3 — 来自第四集动画的输入缓冲器。
  • in 3 — 在第四帧动画设置完后输入。
  • out 4 — 退回到第五帧动画进行设置。
  • buf 4 — 自第五集动画的输入缓冲器。
  • in 4 — 在第五帧动画设置完后输入。
  • weight 0 —用于范围为[0;1]的第一帧动画插值状态的当前权值:
    • 值为0时表示未使用第一帧动画。
    • 值为1时表示第一帧动画被完全使用。
  • weight 1 — 用于范围为[0;1]的第二帧动画插值状态的当前权值:
    • 值为0时表示未使用第二帧动画。
    • 值为1时表示第二帧动画被完全使用。
  • weight 2 — 用于范围为[0;1]的第三帧动画插值状态的当前权值:
    • 值为0时表示未使用第三帧动画。
    • 值为1时表示第三帧动画被完全使用。
  • weight 3 — 用于范围为[0;1]的第四帧动画插值状态的当前权值:
    • 值为0时表示未使用第四帧动画。
    • 值为1时表示第四帧动画被完全使用。
  • weight 4 — 用于范围为[0;1]的第五帧动画插值状态的当前权值:
    • 值为0时表示未使用第五帧动画。
    • 值为1时表示第五帧动画被完全使用。
skinner.transform 允许将一个定制的转变设置为骨,例如,对其进行旋转,使用转换的节点对整个动画进行输出。作为输入值,此节点将接收到一个矩阵。
转换器应该与一个skinner节点相连,此节点将数据设置为转换器的一个动画缓冲。(例如,skinner.animation节点)。循环动画存在于out 0之上,进入另一个skinner节点,并从此节点返回到in 0。来自动画的缓冲进入转换器的buf 0。在此之后,其可对具体的骨进行转换,将剩下的动画数据作为改进后的缓冲对结果进行输出。
  • buffer(缓冲) — 使用改进动画数据的输出缓冲。
  • output(输出) (左方) — 在节点完成其自身工作后使用的输出。
  • bone(骨) — 将被转换的骨(每个节点仅应使用一个骨)。可通过skinner.bone对其进行设置。
  • value(值) — 变换矩阵 (mat4)。

How to Run Skinner Script(怎样运行Skinner脚本)

要初始化Skinner(此处无视觉编辑器),您需要添加如下面所举示例中的代码。首先,指定一个由Skinned控制的网格。之后,同running a Schemer(运行Schmer)相类似,您需要调用update()的功能。然而,其必须从来自世界坐标脚本内的update()才能得到调用并且此功能需要得到用来播放动画的相反FPS的通过。更新方法将一个一个地触发Skinner图中所有节点的执行操作,从名为updateschemer.entry处以指定的顺序开始。

源代码 (UnigineScript)
#include <core/scripts/utils.h>
#include <core/systems/skinner/skinner.h>
#include <samples/common/common.h>

Unigine::Skinner::Skinner skinner;
Unigine::Skinner::SkinnerMesh skinner_mesh;
/*
 */
int init() {

	// Use Skinner namespace.
	using Unigine::Skinner;
	
	// Load the skinned mesh and add it into the editor.
	ObjectMeshSkinned mesh = add_editor(node_load("samples/skinner/meshes/agent.node"));

	// Create a Skinner.
	skinner = new Skinner();
	
	// Create SkinnerMesh that will manage the executable script compiled from a graph.
	skinner_mesh = new SkinnerMesh(skinner,mesh);
	
	// Load a graph that scripts character behavior.
	skinner_mesh.loadScript("samples/skinner/scripts/agent_00.script");

	return 1;
}

int update() {

	float ifps = engine.game.getIFps();
	
	// Update Skinner mesh.
	skinner_mesh.update(ifps);

	return 1;
}

倘若要使用ragdolls,世界脚本中的render()而不是update()就可被用来作为图像的起始点。其允许获取当前帧中的动画转换信息并使用此数据来模仿物理驱动的ragdoll(参看render()的详细信息)。这样,schemer.entry被命名为 render

源代码 (UnigineScript)
int render() {
	
	float ifps = engine.game.getIFps();
	// Run the Skinner graph script from "render" entry.
	skinner_mesh.render(ifps);
	}
	
	return 1;
}

How to Run Event(怎样运行事件)

要创建一个一次性动作,您可以调用Skinner中event()的功能(可在data/core/systems/skinner/skinner_mesh.h中找到)。它将简单地调用用于Sinner脚本的更新功能,此脚本来自使用通过名称的图得以创建。

源代码 (UnigineScript)
int id = skinner_mesh.getEventID(entry_name);
skinner_mesh.event(id);
最新更新: 2017-07-03