Skip to content

模型加载与绘制

导入库

package/live2d 文件夹放置在使用者 main.py 同目录下,在 main.py 中使用如 import live2d.v3。若已通过 pip 安装可以直接导入。

package\live2d
|-- utils
|   |
|   |-- lipsync.py  # 口型同步工具
|   `-- log.py      # 日志工具
`-- v3
    |-- __init__.py
    |-- live2d.pyd  # 动态库/封装c++函数
    |-- live2d.pyi  # 接口&文档
    `-- params.py   # live2d 标准参数

绘制流程

1. 导入 live2d

导入适用于 3.0 版本的 live2d 库

python
import live2d.v3 as live2d

导入适用于 2.0 版本的 live2d 库

python
import live2d.v2 as live2d

2. 在加载和使用 live2d 模型前,应初始化 live2d 模块

python
live2d.init()

3. (3.0及以上版本)在对应的窗口库中设置 OpenGL 上下文后,初始化 Glew 和 OpenGL 绘制选项。不同的窗口库方法不一样,以 Pygame 为例:

python
display = (800,600)
pygame.display.set_mode(display, DOUBLEBUF|OPENGL)

# live2d.v3 还需要调用如下函数
live2d.glewInit()
live2d.setGLProperties()

4. 在上述步骤全部完成后,方可创建 LAppModel 并加载本地模型。路径如下:

Resources\Haru
|-- Haru.2048
|-- Haru.cdi3.json
|-- Haru.moc3
|-- Haru.model3.json
|-- Haru.model3.json.bak
|-- Haru.physics3.json
|-- Haru.pose3.json
|-- Haru.userdata3.json
|-- expressions
|-- motions
`-- sounds
python
model = live2d.LAppModel()
model.LoadModelJson("./Resources/Haru/Haru.model3.json")

5. 窗口大小变化时调用 LAppModelResize 方法。初次加载时,即使没有改变大小也应设置一次大小,否则模型不显示。

python
model.Resize(800, 600)

6. 鼠标点击时调用 LAppModelTouch 方法。传入的参数为鼠标点击位置在窗口坐标系的坐标,即以绘图窗口左上角为原点,右和下为正方向的坐标系。

python
# 如果鼠标点击位置是可触发动作区域,且对应动作被触发,
# 则会在动作开始播放前调用该函数
def onStartCallback(group: str, no: int):
    print(f"touched and motion [{group}_{no}] is started")

# 动作播放结束后会调用该函数
def onFinishCallback():
    print("motion finished")

x, y = pygame.mouse.get_pos()
model.Touch(x, y, onStartCallback, onFinishCallback)

7. 每帧绘制图像时,使用 live2d.clearBuffer,清空画布(可用其他 OpenGL 函数替代)。重置 live2d 模型的各个参数LAppModel.Update,再调用 LAppModel.Draw 进行绘制。在使用具体的窗口库时,可能还需要调用缓冲刷新函数。

若要对模型动作参数进行控制,则应先后调用 UpdateSetParameterValue/AddParameterValueDraw

python
live2d.clearBuffer()

# 初始化呼吸、动作、姿势、表情、各部分透明度等必要的参数值(如果对应的功能开启
model.Update()

# 设置面部朝向偏右15度
# 直接赋值
model.SetParameterValue("ParamAngleX", 15, 1.)
# 在原值基础上添加
# model.AddParameterValue("ParamAngleX", 15)

# 执行绘制
model.Draw()

8. 不再使用 live2d 模块,则应调用 live2d.dispose 释放内存。

python
live2d.dispose()

9. 开关选项。

python
# 以下选项,默认均为开启状态
# 日志开关
live2d.setLogEnable(False)
# 自动呼吸开关
model.SetAutoBreathEnable(False)
# 自动眨眼开关
model.SetAutoBlinkEnable(False)

10. 播放动作

python
# 动作开始播放前调用该函数
def onStartCallback(group: str, no: int):
    print(f"touched and motion [{group}_{no}] is started")

# 动作播放结束后会调用该函数
def onFinishCallback():
    print("motion finished")

# 播放名称为 Idle 的动作组中第一个动作
model.StartMotion("Idle", 0, onStartCallback, onFinishCallback)

11. 参数控制

python
# 默认可操作参数见官方文档:
# https://docs.live2d.com/en/cubism-editor-manual/standard-parameter-list/

# 下面的示例:设置上下唇开合,取值浮点数,0.0~1.0,权重为 1.0
# "ParamMouthOpenY" 为 live2d 模型内嵌的参数 id
# 权重:当前传入的值和原值的比例,
# 调用时机:在CalcParameters 后,在 Update 之前 

# 最终值 = 原值 * (1 - weight) + 传入值 * weight
model.SetParameterValue("ParamMouthOpenY", 1.0, 1.0)
# 最终值 = 原值 + 传入值
model.AddParameterValue("ParamMouthOpenY", 1.0)

默认参数 id 可从 live2d.vX.params.StandardParams 中获取

python
# v3
from live2d.v3.params import StandardParams
# v2
# from live2d.v3.params import StandardParams

model.SetParameterValue(StandardParams.ParamMouthOpenY, 1.0, 1.0)

部分模型除了官方的默认模型,还会自定义一部分模型,例如水印等,下面举去除水印的例子。

python

# 根据模型发布者或者模型 XXX.cdi3.json 中可查找到水印对应的参数 id

# 假设查找到的模型参数 id 为 Param261,假设值为 0 表示显示水印,值为 1 表示消失
model.SetParameterValue("Param261", 1, 1)

打印模型的所有参数

python
# 获取全部可用参数
for i in range(model.GetParameterCount()):
    param: Parameter = model.GetParameter(i)
    print(param.id, param.type, param.value, param.max, param.min, param.default)