参数操作

[最后更新时间:2022/12/08]

CubismIdHandle

为了最终识别Cubism中的一个参数,我们需要得到一个Index,它是一个参数列表。
用ID指定时,作为参数的字符串的ID将被核对。
在 Native 和 Web 框架中,我们准备了一个名为 CubismIdHandle 的类型来降低匹配的计算成本。

由于无法在 Java 中定义新类型,我们采用了另一种方法。

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访问。

 

Java

与上述两种不同的是,SDK for Java 没有 CubismIdHandle 类型,因为它无法定义。
管理类的 CubismIdManager.getId 函数返回 CubismId 类型。

CubismId 覆盖了 equals 函数,因此如果将 CubismIds 与 equals 函数进行比较,可以保证它们是同一个字符串。

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

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

设定参数

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

 

1.覆盖值

使用以下功能之一。

  • 本机 (C++) CubismModel::SetParameterValue 函数
  • Web (TypeScript) CubismModel.setParameterValueById 函数
  • Java 中的 CubismModel.setParameterValue 函数

在第一个参数中设定参数 ID 或索引,在第二个参数中设定值,在第三个参数中设定影响程度。
影响程度是可选的,在这种情况下它将是1。
例如,如果将其设定为 0.5,则会在保留前一个值的 50% 影响的同时进行设定。

例子

 

 

2.添加到当前值

使用以下功能之一。

  • 本机 (C++) CubismModel::AddParameterValue 函数
  • Web (TypeScript) CubismModel.addParameterValueById 函数
  • Java 中的 CubismModel.addParameterValue 函数

参数与以下函数之一相同。

  • 本机 (C++) CubismModel::SetParameterValue 函数
  • Web (TypeScript) CubismModel.setParameterValueById 函数
  • Java 中的 CubismModel.setParameterValue 函数

此函数设定的值将添加到当前为该参数设定的值。

例子

 

 

3.乘以当前值

使用以下功能之一。

  • 本机 (C++) CubismModel::MultiplyParameterValue 函数
  • Web (TypeScript) CubismModel.multiplyParameterValueById 函数
  • Java 中的 CubismModel.multiplyParameterValue 函数

参数与以下函数之一相同。

  • CubismModel::MultiplyParameterValue 函数
  • Web (TypeScript) CubismModel.multiplyParameterValueById 函数
  • Java 中的 CubismModel.multiplyParameterValue 函数

此函数设定的值乘以当前为该参数设定的值。

例子

此外,使用以下函数之一来获取当前参数值。

  • 本机 (C++) CubismModel::GetParameterValue 函数
  • Web (TypeScript) CubismModel.getParameterValueById 函数
  • Java 中的 CubismModel.getParameterValue 函数

 

参数指标规范

参数ID的指定方式有两种,一种是指定由字符串生成的ID类型,另一种是通过索引指定。
缓存后使用索引会更快,比如提前获取索引,所以建议在调用频率高的时候使用索引。
您可以使用以下函数之一获取参数索引:

  • 本机 (C ++) CubismModel::GetParameterIndex 函数
  • Web (TypeScript) CubismModel.getParameterIndex 函数
  • Java 中的 CubismModel.getParameterIndex 函数

例子

 

 

保存和恢复参数值

使用以下功能之一临时存储模型的当前参数值。

  • 本机 (C++) CubismModel::SaveParameters 函数
  • Web (TypeScript) CubismModel.saveParameters 函数
  • Java 中的 CubismModel.saveParameters 函数

使用以下功能之一恢复临时保存的模型参数值。

  • 本机 (C++) CubismModel::LoadParameters 函数
  • Web (TypeScript) CubismModel.loadParameters 函数
  • Java 中的 CubismModel.loadParameters 函数

例子

 

 

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

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

 

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

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

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

 

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

使用以下功能之一设置零件的不透明度。

  • 本机 (C++) CubismModel::SetPartOpacity 函数
  • Web (TypeScript) CubismModel.setPartOpacityById 函数
  • Java 中的 CubismModel.setPartOpactiy 函数

使用以下函数之一来获取零件的不透明度。

  • 本机 (C++) CubismModel::GetPartOpacity 函数
  • Web (TypeScript) CubismModel.getPartOpacityById 函数
  • Java 中的 CubismModel.getPartOpacity 函数

例子

 

 

参数应用时间和成本

设定参数时,只重写参数值,不计算顶点。
更改参数后,使用以下函数之一计算顶点。

  • 本机 (C++) CubismModel::Updatel 函数
  • Web (TypeScript) CubismModel.updatel 函数
  • Java 中的 CubismModel.updatel 函数

之后,使用以下功能之一绘制应用参数后的模型。

  • 本机 (C++) CubismRenderer::DrawModel 函数
  • Web (TypeScript) CubismRenderer.drawModel 函数
  • Java 中的 CubismRenderer.drawModel 函数

 

参数计算顺序的重要性

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

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

 

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

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

 

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

 

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

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

© 2010 - 2022 Live2D Inc.