Pose (Cocos Creator)

最終更新: 2023年3月14日

概述

Pose是管理Pose设置格式.pose3.json中描述的部件群显示状态的功能。
通过使用Pose,您可以管理不想同时显示在画面上的部件,例如“放下状态的手臂”和“交叉时的手臂”。
此外,通过使用Pose,可以支持具有不同Part ID的模型(换装等)。

.pose3.json可以在Cubism Viewer for OW中设置。
有关如何设置部件等详细信息,请参考此处

将OW方法载入的模型与常规方法的模型进行比较时,根据Pose的不同,以下三点会发生变化。

  • CubismPosePart被附加到[Prefab根]/Parts/以下的GameObject。
  • 如果AnimationClip中的PartOpacity曲线与Stepped匹配,则会被加工为Linear曲线。
  • 从AnimationClip中删除未在pose3.json中描述的Opacity曲线。

Pose执行以下处理:

  1. 在Pose动态内加工通过Stepped设置的Parts的Opacity(不透明度)曲线
  2. 识别Pose用部件
  3. 保存部件的Opacity以确定要显示哪个Pose部件
  4. Pose的计算与应用
  5. 不透明度联动

在Pose动态内加工通过Stepped设置的Parts的Opacity(不透明度)曲线

如Editor手册中的姿势设置所述,Pose处理的部件不透明度(PartOpacity)曲线假定曲线类型为步(Stepped)。
在Cubism SDK for Cocos Creator中,这条曲线被加工成直线(Linear)并输出到AnimationClip。

如果您设置了除Stepped以外的曲线,则该曲线将不会被加工,并将按原样输出到AnimationClip。

if (
  shouldImportAsOriginalWorkflow &&
  poseJson != null &&
  poseJson.adeInTime != 0.0
) {
  let track = CubismMotion3Json.convertSteppedCurveToLinerCurver(
    curve,
    poseJson.fadeInTime
  );
}

加工该Opacity曲线的处理由CubismMotion3Json.toAnimationClipB()执行。

识别Pose用部件

当您使用OW方法载入模型时,会附加CubismPosePart。
要附加的Node将与置入[Prefab根]/Parts/下的.pose3.json中描述的ID具有相同的名称。

// 获取Pose的部件
const part = ArrayExtensionMethods.findByIdFromParts(
  parts,
  group[partIndex].id
);

// 附加CubismPosePart
posePart = part.node.addComponent(CubismPosePart)!;

// 将Pose信息设置为CubismPosePart
posePart.groupIndex = groupIndex;
posePart.partIndex = partIndex;
posePart.link = group[partIndex].link;

保存部件的Opacity以确定要显示哪个Pose部件

通过将CubismPart.opacity的当前值与前一帧缓存的值进行比较,确定.pose3.json中描述的组中的显示部件。
该值使用CubismPoseController.savePartOpacities()进行缓存。

Pose的计算与应用

使用AnimatinoClip应用显示部件。

使用CubismPoseController.doFade()应用隐藏部件。

隐藏部件的Opacity因为与显示部件的不透明度的关系,将不透明度降低到背景不透明的水平。
在CubismPoseController.doFade()中寻找显示部件,然后设置隐藏部件Opacity。

不透明度联动

不透明度联动在应用Pose后,在CubismPosePart.link中编写Opacity的联动部件使用CubismPoseController.copyPartOpacities设置Opacity。

请问这篇文章对您有帮助吗?
关于本报道,敬请提出您的意见及要求。