Pose

最終更新: 2019年9月3日

概述

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 Unity中,这条曲线被加工成直线(Linear)并输出到AnimationClip。

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

if(shouldImportAsOriginalWorkflow && poseJson != null && poseJson.FadeInTime != 0.0f)
{
    animationCurve = ConvertSteppedCurveToLinerCurver(curve, poseJson.FadeInTime);
}

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

识别Pose用部件

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

// 获取Pose的部件
var part = parts.FindById(group[partIndex].Id);

// 附加CubismPosePart
posePart = part.gameObject.AddComponent<CubismPosePart>();

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

这个处理由CubismPoseMotionImporter.InitializePosePart()执行。

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

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

Pose的计算与应用

使用AnimatinoClip应用显示部件。

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

在CubismPoseController.DoFade()中寻找显示部件,然后设置隐藏部件Opacity。

隐藏部件的Opacity因为与显示部件的不透明度的关系,将不透明度降低到背景不透明的水平。

不透明度联动

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

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