FEATURED · 精选文章

pygame里live2d的使用方法(live2d-py)

发布时间 / 2026/8/23 14:18:49
来源 / 创域科博编辑部
栏目 / 资讯中心
pygame里live2d的使用方法(live2d-py) 前言首先我们需要明确对于pygame框架是由SDL写出来的而SDL是OpenGL一步步写出来的。所以说在pygame框架里使用live2d就需要pygame的OPENGL模式以及live2d-py库。所以本篇文章主要介绍1live2d-py库的使用方法2OpenGL与pygame的交互已更新3部分OpenGL基础知识目录前言live2d-py①、导入模块②、初始化③、实例化模型对象④、加载模型⑤、正常pygame循环⑥、其他常用方法1、Resize调整live2d大小2、SetScale设置模型缩放比例3、SetAutoBreathEnable开启/关闭 自动呼吸4、SetAutoBlinkEnable开启/关闭 自动眨眼5、SetOffset设置模型偏移量6、SetExpression设置live2d表情7、SetRandomExpression随机设置一个live2d表情8、StartMotion设置live2d动作9、StartRandomMotion随机设置一个live2d动作10、IsMotionFinished判断当前动作是否完成11、ResetExpression重新设置live2d表情为默认表情12、StopAllMotions停止所有的动作⑦、其它注意事项1、禁止/允许日志输出2、与pygame交互OpenGL Pygame交互①、安装OpenGL②、渲染图片新版1、导入图片类2、使用图片类3、放置旧版③、渲染文字④、注意1、多放置2、v2模型的特殊性3、V3模型的特殊性实例V2新版旧版实例V3新版旧版后记live2d-py首先肯定是需要pip一下pip install live2d-py之后我们需要知道对于live2d有v2与v3之分大致也就是2d与3d的区别。区别方式就是v2里面会有.moc文件而v3里面的是.moc3文件。①、导入模块这时候就要根据我们的模型的版本进行导入。如果是v2模型import live2d.v2 as live2d import pygame from pygame.locals import * #这个之后讲暂时未用到 from OpenGL.GL import *反之是v3模型import live2d.v3 as live2d import pygame from pygame.locals import * #这个之后讲暂时未用到 from OpenGL.GL import *不管是什么版本的模型之后的操作类似但不完全相同。②、初始化之后就是初始化#以pygame的交互为例 pygame.init() live2d.init() #但如果是对于v3模型需要加一句 if live2d.LIVE2D_VERSION 3: #这个函数会激活内部的OpenGL函数 #其实v2模型也能用这个函数但最好区分一下 live2d.glewInit() #这时候用到了pygame的OpenGL模式 pygame.display.set_mode((1200, 800), DOUBLEBUF | OPENGL, vsync 1)③、实例化模型对象之后就是需要实例化模型对象以此通过一些方法来控制live2d的行为。model live2d.LAppModel()之后就可以调用这个对象里的方法控制live2d。④、加载模型需要让对象知道控制的哪个live2d#对于v2模型一般导入的是后缀名是(.model.json)的json文件路径 #如 model_json_path: str my_v2_model.model.json #对于v3模型一般导入的是后缀名是(.model3.json)的json文件路径 #如 model_json_path: str my_v3_model.model3.json #最后加载live2d model.LoadModelJson(model_json_path)⑤、正常pygame循环之后就可以通过pygame的事件来进行一系列操作了。一般调用的顺序就是clearBuffer - Update - Draw - flip/updaterun: bool True while run: for event in pygame.event.get(): match event.type: case pygame.QUIT: run not run break case _: pass #其他的操作之后就要刷新live2d了 ... #1、清除缓冲区 live2d.clearBuffer() #2、更新live2d到缓冲区 model.Update() #3、渲染live2d到屏幕 model.Draw() #4、需要用的pygame刷新 pygame.display.flip() #或者是pygame.display.update() #之后是其他的操作 ... #退出之后 #1、结束live2d live2d.dispose() #2、结束pygame pygame.quit() #3、结束程序 exit()这样就能正常显示live2d了。但是可能达不到自己想要的效果比如大小、位置、动作、表情之类的还没有设置那么请看下文所讲述的。⑥、其他常用方法这个对象还有好多方法来控制live2d的一些属性。1、Resize调整live2d大小window_width: int 800 window_height: int 600 model.Resize(window_width, window_height)2、SetScale设置模型缩放比例live2d_scale: float 0.8 #缩小了20%也就是变成了原来大小的80% model.SetScale(live2d_scale)3、SetAutoBreathEnable开启/关闭 自动呼吸#开启自动呼吸 model.SetAutoBreathEnable(True) #关闭自动呼吸 model.SetAutoBreathEnable(False)4、SetAutoBlinkEnable开启/关闭 自动眨眼#开启自动眨眼 model.SetAutoBlinkEnable(True) #关闭自动眨眼 model.SetAutoBlinkEnable(False)5、SetOffset设置模型偏移量offset_x: int 100 offset_y: int 100 #现在live2d会偏移原点(100, 100) model.SetOffset(offset_x, offset_y)6、SetExpression设置live2d表情#这个函数的第一个参数是字符串类型的表情ID #这个ID可以去相应的.model.json里去查看 #进入后找到expressions键里面的name都是表情ID #例如 model.SetExpression(cry) model.SetExpression(default)7、SetRandomExpression随机设置一个live2d表情#单纯的随机挑选一个live2d表情 model.SetRandomExpression()8、StartMotion设置live2d动作#这个函数有三个主要参数分别是 #group: str - 和SetExpression类似都是填入.model.json里面的name #no: int - 默认为0就行 #priority: int - 代表这个动作的优先级毕竟动作的发生需要时间没有特殊需求那就1即可 #例如 model.StartMotion(happy, 0, 1)9、StartRandomMotion随机设置一个live2d动作#类似于SetRandonExpression model.StartRandomMotion()10、IsMotionFinished判断当前动作是否完成#若当前动作完成 print(model.IsMotionFinished()) #输出True #若当前动作未完成 print(model.IsMotionFinished()) #输出False11、ResetExpression重新设置live2d表情为默认表情#那什么是默认的表情呢 #就是.model.json里面Expression里的default表情 model.ResetExpression()12、StopAllMotions停止所有的动作model.StopAllMotions()⑦、其它注意事项1、禁止/允许日志输出在正常情况下live2d-py这个库会不断地输出日志到缓冲区可能会扰乱我们的正常工作。那么需要调用下列函数来“禁止日志输出”import live2d.v2 as live2d #参数是False则禁止日志输出 #反之允许日志输出 live2d.setLogEnable(False)2、与pygame交互因为使用的是pygame的OpenGL模式所以pygame的图片/文字渲染就行不通了现在需要使用OpenGL来进行操作了。更新文章现有内置图片放置方法请直跳新版OpenGL Pygame交互我们需要知道OpenGL是一个状态机就是通过改变全局OpenGL的状态来进行差异化“输出”。OpenGL主要由三个包构成分别是-OpenGL.GL是核心API包含了主要函数-OpenGL.GLU包含了许多被包装的实用方法-OpenGL.GLUT包含了关于屏幕的创建以及基本事件而我们在这里只需要使用OpenGL.GL包就满足了。①、安装OpenGLpip install PyOpenGL PyOpenGL-accelerate②、渲染图片现在live2d-py的最新版本“0.5.4”内置了图片放置方法比我之前自己琢磨的方法更加靠谱且快速请忽略旧版内容直接学习新版方法即可。新版1、导入图片类from live2d.utils.image import Image2、使用图片类#这个函数就一个参数代表路径 my_img: Image Image(你的图片的路径) #例如在相对路径有个图片叫“img.png” my_img: Image Image(img.png)3、放置#官方案例节选 ... running True while True: for event in pygame.event.get(): if event.type pygame.QUIT: running False break if event.type pygame.MOUSEMOTION: model.Drag(*pygame.mouse.get_pos()) if not running: break live2d.clearBuffer() #就在这里放置 my_img.Draw() model.Update() model.Draw() pygame.display.flip() ...旧版我们知道在pygame里都是以pygame.SurfaceType进行渲染的而要在OpenGL的话需要将pygame.SurfaceType转换成字节串bytes来转换。需要注意的是OpenGL的坐标系和pygame的坐标系不一样-OpenGL是以中心为原点的权值/±1坐标系-pygame是以TopLeft为原点的数值坐标系。如下图具体方法讲解如下#导入OpenGL.GL包 #下面没见过的函数都是来自这里 from OpenGL.GL import * import pygame surface pygame.image.load(image.png).convert_alpha() #1、将surface对象转成成字节串并保持RGB通道 texture_data: bytes pygame.image.tostring(surface, RGBA, 1) #2、获得纹理id可以看成申请一段空间 id glGenTextures(1) #3、告诉OpenGL这段空间的纹理是2D纹理图片 glBindTexture(GL_TEXTURE_2D, id) #4、将图片的字节串绑定到这段空间里下面细讲 glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, surface.get_width(), surface.get_height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, texture_data ) #5、设置参数开启模糊但反锯齿模式可以这么理解 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR) #6、为了防止中间可能的其他函数的干扰需要再绑定一次 glBindTexture(GL_TEXTURE_2D, id) #7、渲染的开始并且通过“四边形”模式图片渲染 glBegin(GL_QUADS) #8、如上图 glTexCoord2f(0, 0); glVertex3f(x1, y1, z1) #如图图片左下角分别对应xyz的权值z10即可 glTexCoord2f(1, 0); glVertex3f(x2, y2, z2) #如图图片右下角分别对应xyz的权值z20即可 glTexCoord2f(1, 1); glVertex3f(x3, y3, z3) #如图图片右上角分别对应xyz的权值z30即可 glTexCoord2f(0, 1); glVertex3f(x4, y4, z4) #如图图片左上角分别对应xyz的权值z40即可 #9、结束渲染 glEnd()而这些函数需要在pygame基本循环里去使用就类似于pygame的blit一样。当然最好不要直接用最好把它们封装成函数或类毕竟没必要一直生成id直接一个变量保存下来就行。例如class Live2D(object): staticmethod def render(surface: pygame.SurfaceType) - object: texture_data: bytes pygame.image.tostring(surface, RGBA, 1) id: object glGenTextures(1) glBindTexture(GL_TEXTURE_2D, id) glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, surface.get_width(), surface.get_height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, texture_data ) glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR) return id staticmethod def blit(id: object, *args: tuple[tuple[3], tuple[3], tuple[3], tuple[3]]) - None: glBindTexture(GL_TEXTURE_2D, id) glBegin(GL_QUADS) glTexCoord2f(0, 0); glVertex3f(*args[3]) glTexCoord2f(1, 0); glVertex3f(*args[1]) glTexCoord2f(1, 1); glVertex3f(*args[2]) glTexCoord2f(0, 1); glVertex3f(*args[0]) glEnd()其中对于glTexImage2D函数C解释来自微软void WINAPI glTexImage2D( GLenum target, #模式GL_TEXTURE_2D GLint level, #细节级别编号。 级别 0 是基础图像级别。 GLint internalformat, #纹理中颜色分量的数量与tostring的相同,GL_RGBA GLsizei width, #长度 GLsizei height, #宽度 GLint border, #边框的宽度必须为 0 或 1为1就行。 GLint format, #和level一样都选GL_RGBA GLenum type, #字节串类型bytes const GLvoid *pixels #纹理数据就是那个字节串 );③、渲染文字和渲染图片类似需要注意的是back_color (255, 255, 255) font_color (0, 0, 0) text_surface pygame.font.SysFont(幼圆, 36).render(Hello, True, font_color, back_color) #注意这里的back_color不能省略了如果省略那么文字不能正常显示了④、注意新版无需阅读此处一般以上方法都是可以使用的但真正实践的时候有复杂需求的话会出现诸多问题有些我能解决但有些解决不了1、多放置新版已解决不允许多放置放置多个时放置的不知道为什么全是第一个。局限在v2模型2、v2模型的特殊性仅仅在v2模型的展示时需要在最后加一句glUseProgram(0)来恢复设置才能正常的放置图片/文字并显示run: bool True while run: #其他的操作之后就要刷新live2d了 ... #1、清除缓冲区 live2d.clearBuffer() #2、加载图片 Live2D.blit(back, *back_pos) #3、更新live2d到缓冲区 model.Update() #4、渲染live2d到屏幕 model.Draw() #5、需要用的pygame刷新 pygame.display.flip() #或者是pygame.display.update() #之后是其他的操作 ... #⭐、就是这句话 glUseProgram(0) #退出之后 #1、结束live2d live2d.dispose() #2、结束pygame pygame.quit() #3、结束程序 exit()3、V3模型的特殊性仅仅在v3模型的展示时需要在加载图片前加一句glEnable(GL_TEXTURE_2D)才能正常的放置图片/文字并显示run: bool True while run: #其他的操作之后就要刷新live2d了 ... #1、清除缓冲区 live2d.clearBuffer() #⭐、就是这句话 glEnable(GL_TEXTURE_2D) #2、加载图片 Live2D.blit(back, *back_pos) #3、更新live2d到缓冲区 model.Update() #4、渲染live2d到屏幕 model.Draw() #5、需要用的pygame刷新 pygame.display.flip() #或者是pygame.display.update() #之后是其他的操作 ... #而这句话不能有了 #glUseProgram(0) #退出之后 #1、结束live2d live2d.dispose() #2、结束pygame pygame.quit() #3、结束程序 exit()⭐如果大家能解决的话一定要发出来造福大家啊实例V2最后就举个完整的实例来结束文章下面的全部上面都出现过新版# -*- coding: utf-8 -*- # -*- file: live2d_test.py -*- import pygame import live2d.v2 as live2d from pygame.locals import * from live2d.utils.image import Image #导入新版的图片模块 live2d.setLogEnable(False) pygame.init() live2d.init() pygame.display.set_mode((1200, 800), DOUBLEBUF | OPENGL, vsync 1) model: live2d.LAppModel live2d.LAppModel() model.LoadModelJson(rv2\kasumi2\kasumi2.model.json) model.Resize(1200, 800) model.SetAutoBlinkEnable(True) model.SetAutoBreathEnable(True) model.StartRandomMotion() #创建图片对象 back: Image Image(beach1.jpg) run: bool True while run: for event in pygame.event.get(): if event.type pygame.QUIT: run not run break live2d.clearBuffer() #放置图片 back.Draw() model.Update() model.Draw() pygame.display.flip() live2d.dispose() pygame.quit() exit()旧版# -*- coding: utf-8 -*- # -*- file: live2d_test.py -*- import live2d.v2 as live2d import pygame from pygame.locals import * from OpenGL.GL import * class Live2D(object): staticmethod def render(surface: pygame.SurfaceType) - object: texture_data pygame.image.tostring(surface, RGBA, 1) id: object glGenTextures(1) glBindTexture(GL_TEXTURE_2D, id) glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, surface.get_width(), surface.get_height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, texture_data ) glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR) return id staticmethod def blit(id: object, *args: tuple[tuple[3], tuple[3], tuple[3], tuple[3]]) - None: glBindTexture(GL_TEXTURE_2D, id) glBegin(GL_QUADS) glTexCoord2f(0, 0); glVertex3f(*args[3]) glTexCoord2f(1, 0); glVertex3f(*args[1]) glTexCoord2f(1, 1); glVertex3f(*args[2]) glTexCoord2f(0, 1); glVertex3f(*args[0]) glEnd() live2d.setLogEnable(False) pygame.init() live2d.init() pygame.display.set_mode((1200, 800), DOUBLEBUF | OPENGL, vsync 1) model: live2d.LAppModel live2d.LAppModel() model.LoadModelJson(rv2\kasumi2\kasumi2.model.json) model.Resize(1200, 800) model.SetAutoBlinkEnable(True) model.SetAutoBreathEnable(True) model.StartRandomMotion() back Live2D.render(pygame.image.load(rbeach1.jpg).convert_alpha()) back_pos ((-1.0, 1.0, 0), (1.0, -1.0, 0), (1.0, 1.0, 0), (-1.0, -1.0, 0)) run: bool True while run: for event in pygame.event.get(): if event.type pygame.QUIT: run not run break live2d.clearBuffer() Live2D.blit(back, *back_pos) model.Update() model.Draw() pygame.display.flip() if live2d.LIVE2D_VERSION 2: glUseProgram(0) live2d.dispose() pygame.quit() exit()实例V3新版# -*- coding: utf-8 -*- # -*- file: live2d_test.py -*- import pygame import live2d.v3 as live2d from pygame.locals import * from live2d.utils.image import Image #导入新版的图片模块 live2d.setLogEnable(False) pygame.init() live2d.init() pygame.display.set_mode((1200, 800), DOUBLEBUF | OPENGL, vsync 1) if live2d.LIVE2D_VERSION 3: #注意此处最好使用新版的live2d.glInit()来代替旧版的live2d.glewInit() live2d.glInit() model: live2d.LAppModel live2d.LAppModel() model.LoadModelJson(rv3\Mao\Mao.model3.json) model.Resize(1200, 800) model.SetAutoBlinkEnable(True) model.SetAutoBreathEnable(True) model.StartRandomMotion() #创建图片对象 back: Image Image(beach1.jpg) run: bool True while run: for event in pygame.event.get(): if event.type pygame.QUIT: run not run break live2d.clearBuffer() #放置图片 back.Draw() model.Update() model.Draw() pygame.display.flip() live2d.dispose() pygame.quit() exit()旧版# -*- coding: utf-8 -*- # -*- file: live2d_test.py -*- import live2d.v3 as live2d import pygame from pygame.locals import * from OpenGL.GL import * class Live2D(object): staticmethod def render(surface: pygame.SurfaceType) - object: texture_data pygame.image.tostring(surface, RGBA, 1) id: object glGenTextures(1) glBindTexture(GL_TEXTURE_2D, id) glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, surface.get_width(), surface.get_height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, texture_data ) glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR) return id staticmethod def blit(id: object, *args: tuple[tuple[3], tuple[3], tuple[3], tuple[3]]) - None: glBindTexture(GL_TEXTURE_2D, id) glBegin(GL_QUADS) glTexCoord2f(0, 0); glVertex3f(*args[3]) glTexCoord2f(1, 0); glVertex3f(*args[1]) glTexCoord2f(1, 1); glVertex3f(*args[2]) glTexCoord2f(0, 1); glVertex3f(*args[0]) glEnd() live2d.setLogEnable(False) pygame.init() live2d.init() pygame.display.set_mode((1200, 800), DOUBLEBUF | OPENGL, vsync 1) if live2d.LIVE2D_VERSION 3: live2d.glewInit() model: live2d.LAppModel live2d.LAppModel() model.LoadModelJson(rResources\v3\Mao\Mao.model3.json) model.Resize(1200, 800) model.SetAutoBlinkEnable(True) model.SetAutoBreathEnable(True) model.StartRandomMotion() back Live2D.render(pygame.image.load(rbeach1.jpg).convert_alpha()) back_pos ((-1.0, 1.0, 0), (1.0, -1.0, 0), (1.0, 1.0, 0), (-1.0, -1.0, 0)) run: bool True while run: for event in pygame.event.get(): if event.type pygame.QUIT: run not run break live2d.clearBuffer() glEnable(GL_TEXTURE_2D) Live2D.blit(back, *back_pos) model.Update() model.Draw() pygame.display.flip() live2d.dispose() pygame.quit() exit()后记文章有问题还请大家指正。live2d-py项目是国人发起的作者在BiliBili上有账号。文章更新时间2025.10.01kirakiradokidoki⭐~
RELATED — 相关阅读

相关资讯

LATEST — 最新资讯

最新发布

TODAY — 本日精选

新闻

WEEKLY — 本周精选

新闻

MONTHLY — 本月精选

新闻