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执行以下处理:
- 在Pose动态内加工通过Stepped设置的Parts的Opacity(不透明度)曲线
- 识别Pose用部件
- 保存部件的Opacity以确定要显示哪个Pose部件
- Pose的计算与应用
- 不透明度联动
在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。