参数操作

[最近更新时间:2019/01/18]

 

CubismIdHandle

为了最终识别Cubism中的一个参数,我们需要得到一个Index,它是一个参数列表。
用ID指定时,作为参数的字符串的ID将被核对。
该框架有一个名为 CubismIdHandle 的类型,用于降低排序规则的计算成本。

 

Native

CubismIdHandle类型的实际状态是CubismId类的指针类型,可以通过管理类的函数CubismIdManager::GetId函数获取。
由于 CubismIdManager :: GetId 函数如果是相同的字符串则返回相同的指针,
如果 CubismIdHandles 相互比较,并且指针地址相同,则可以保证它们是相同的字符串。

您可以使用静态 CubismFramework :: GetIdManager 函数访问 CubismIdManager 实例。

值操作函数有两种方法:通过 Index 访问和通过 CubismIdHandle 访问。

 

Web

CubismIdHandle 类型的实际状态是 CubismId 类的对象类型,可以通过管理类的函数 CubismIdManager.getId 函数获取。
由于 CubismIdManager.getId 函数返回相同的实例,如果它是相同的字符串,
如果 CubismIdHandles 相互比较,它们是同一个对象,则可以保证它们是同一个字符串。

您可以使用静态 CubismFramework.getIdManager 函数访问 CubismIdManager 实例。

值操作函数的访问方式有两种:索引访问和CubismIdHandle访问。

 

设定参数

参数通常从运动中播放,但您也可以直接指定值。
根据应用值的计算方法,有三种类型的参数操作函数,如下所示。

 

1.覆盖值

使用本机 (C++) CubismModel :: SetParameterValue 函数或 Web (TypeScript) CubismModel.setParameterValueById 函数。
在第一个参数中设定参数 ID 或索引,在第二个参数中设定值,在第三个参数中设定影响程度。
影响程度是可选的,在这种情况下它将是1。
例如,如果将其设定为 0.5,则会在保留前一个值的 50% 影响的同时进行设定。

例子

 

 

2.添加到当前值

使用本机 (C ++) CubismModel :: AddParameterValue 函数或 Web (TypeScript) CubismModel.addParameterValueById 函数。
参数与 Native (C ++) CubismModel :: SetParameterValue 函数或 Web (TypeScript) CubismModel.setParameterValueById 函数相同。
此函数设定的值将添加到当前为该参数设定的值。

例子

 

 

3.乘以当前值

使用本机 (C ++) CubismModel :: MultiplyParameterValue 函数或 Web (TypeScript) CubismModel.multiplyParameterValueById 函数。
参数与 Native (C ++) CubismModel :: SetParameterValue 函数或 Web (TypeScript) CubismModel.setParameterValueById 函数相同。
此函数设定的值乘以当前为该参数设定的值。

例子

此外,使用 Native (C ++) CubismModel :: GetParameterValue 函数或 Web (TypeScript) CubismModel.getParameterValueById 函数来获取当前参数值。

 

参数指标规范

参数ID的指定方式有两种,一种是指定由字符串生成的ID类型,另一种是通过索引指定。
缓存后使用索引会更快,比如提前获取索引,所以建议在调用频率高的时候使用索引。
参数索引可以通过 Native (C++) CubismModel :: GetParameterIndex 函数或 Web (TypeScript) CubismModel.getParameterIndex 函数获取。

例子

 

 

保存和恢复参数值

要临时保存模型的当前参数值,可以使用 Native (C++) CubismModel::SaveParameters 函数或 Web (TypeScript) CubismModel.saveParameters 函数。
这样做会临时保存所有参数值,并在下次读取 Native (C++) CubismModel::LoadParameters 函数或 Web (TypeScript) CubismModel.loadParameters 函数时恢复。

例子

 

 

如何在 LAppModel 中使用 SaveParameters 和 LoadParameters :: 更新

SaveParameters 和 LoadParameters 作为 API 保存和调用值,
在实际的 LAppModel::Update 函数中,调用 LoadParameter 重置为之前的状态,并且
应用运动播放后,我正在运行保存参数。

 

此方法的目的是对不播放运动或运动播放未指定的参数。
通过在进入更新的其他操作之前的值覆盖,它是创建加法/正片叠底计算的基础。

如果此功能不可用,如果添加到运动中未指定的参数,则每次更新都会添加该值,并且该值将超出范围。

即使仅在动作播放前加载,您也可以为加法/正片叠底创建基础,
运动播放后进入保存,可以保留运动的最终状态。

 

获取和设定部件的不透明度

要设定部件的不透明度,请使用 Native (C ++) CubismModel :: SetPart不透明度 函数或 Web (TypeScript) CubismModel.setPart不透明度ById 函数。
要获取部件的不透明度,请使用 Native (C ++) CubismModel :: GetPart不透明度 函数或 Web (TypeScript) CubismModel.getPart不透明度ById 函数。

例子

 

 

参数应用时间和成本

设定参数时,只重写参数值,不计算顶点。
顶点由Native(C++)的CubismModel::Update函数在参数改变后或Web的CubismModel.update函数(TypeScript)计算。
之后,通过Native (C++) 的CubismRenderer :: DrawModel 函数或Web (TypeScript) 的CubismRenderer.drawModel 函数绘制应用参数后的模型。

 

参数计算顺序的重要性

参数操作分为三种类型:覆盖、加法和正片叠底。
第一次正片叠底计算不会影响以后的加法或覆盖。
如果最后执行覆盖,则到该点为止的所有计算结果都将被忽略。
应用覆盖、加法和正片叠底是很常见的。

在难以将计算内容作为程序组件等检查的情况下。
您需要知道哪个操作执行哪个计算并设定按顺序应用组件的顺序。

 

让我们看看是什么样的代码差异导致了上面 Gif 所示的眼睛张开差异。
这是将眨眼和面部表情应用于 SDK 中包含的模型范例 haru 的示例。
关于面部表情设定,是在播放f06.exp3.json的状态下睁眼闭眼两次。
只贴出 C++ 代码,因为计算顺序是唯一的问题。

覆盖操作自动眨眼后,设定正片叠底操作的面部表情A更新

 

设定好正片叠底运算的面部表情后,自动眨眼覆盖运算B的Update

 

在 A 中,您可以看到由于眨眼后面部表情的影响,眼睛睁大了。
另一方面,在B的计算中,被眨眼覆盖,被抑制到标准的开闭眼。
由于计算顺序不同,模型所表达的细微差别很大。

与设计师分享动作、面部表情、功能的计算顺序。

© 2010 - 2022 Live2D Inc.