When you cry for missing the sun, you will miss the stars again.
当你为错过太阳而哭泣时,你也要再错过群星了。
——泰戈尔
一、Live2d 简介
Live2D是一种基于2D图像的动态角色技术,它能够将静态的2D角色转化为具有丰富表情和动作的实时交互角色。通过使用Live2D,开发者可以为游戏、动画、虚拟主播等应用创建出生动活泼的角色。
Live2D的核心技术是基于多层次的2D绘制,通过对角色进行分割并赋予不同部位独立的动作能力,从而实现角色的自由变形和动态效果。这种技术使得角色能够根据用户的操作或者外部输入实时响应,展现出更加真实的表情和动作。
除了基本的动作表现,Live2D还提供了丰富的特效功能,如光影效果、粒子效果等,使得角色在交互过程中更加生动有趣。同时,Live2D还支持与其他引擎和平台的集成,方便开发者将其应用到各种不同的项目中。
二、Live2d Web
L2Dwidget.min.js 是一个基于 WebGL 技术的开源库,用于在网页上实现可爱的 Live2D 角色模型。Live2D 是一种二维动画技术,可以将静态的插图转化为具有动态效果的角色模型。
L2Dwidget.min.js 提供了一些简单易用的接口,使得开发者可以轻松地将 Live2D 模型嵌入到网页中。它支持鼠标交互、触摸事件和设备重力感应等功能,使得用户可以与 Live2D 模型进行互动。
使用 L2Dwidget.min.js,你可以通过引入相应的 JavaScript 文件和配置文件,将 Live2D 模型添加到你的网页中。你可以自定义模型的大小、位置、动作等属性,并且可以根据需要添加额外的特效和动画效果。
网上很多文章都有介绍使用 L2Dwidget.min.js 实现看板娘效果,我们也来实现一个简单的 demo,
1、编译 L2Dwidget.min.js
git clone https://github.com/xiazeyu/live2d-widget.js.git
把源代码克隆下来,进入根目录,准备安装依赖,
# 使用 cnpm i 有问题 npm i
# 模块打包 yarn add webpack webpack-cli --dev yarn webpack
模块打包完成后不会自动退出,可以直接在 ./lib 目录下看到已经生成了 L2Dwidget.0.min.js 和 L2Dwidget.min.js,
2、运行效果
启动一个 node server 来代理 html 入口,
npm install -g serve serve .
访问 localhost:3000,然后 dev.html,
可以看到右下角成功显示了看板娘,
3、源代码解析
我们来看下 dev.html 里面都有些什么,
<!-- dev.html -->
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>Live2d Test Env</title>
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body>
<script src="lib/L2Dwidget.min.js"></script>
<script type="text/javascript">
L2Dwidget.init();
</script>
</body>
</html>
页面引入了 L2Dwidget.min.js 库,并且做了初始化 L2Dwidget.init(); ,默认加载的是 live2d-widget-model-shizuku 这个模型,在 src/config/defaultConfig.js 中可以看到默认配置如下,
/ * @description The storage of configs. Intend to unify serverJs and clientJs's config */ / * Default settings for defaulter * @type {Object} */ const defaultConfig = { model: { jsonPath: 'https://unpkg.com/live2d-widget-model-shizuku@latest/assets/shizuku.model.json', scale: 1, }, display: { superSample: 2, width: 200, height: 400, position: 'right', hOffset: 0, vOffset: -20, }, mobile: { show: true, scale: 0.8, motion: true, }, name: { canvas: 'live2dcanvas', div: 'live2d-widget', }, react: { opacity: 1, }, dev: { border: false }, dialog: { enable: false, script: null } } module.exports = defaultConfig;
在 src/index.js 文件中可以看到配置的说明如下,
// Created by xiazeyu. // Celebrate for the 3.0 version! // / * @description The entry point of live2d-widget. */ 'use strict'; import device from 'current-device'; import { config, configApplyer }from './config/configMgr'; import { EventEmitter } from './utils/EventEmitter'; if (process.env.NODE_ENV === 'development'){ console.log('--- --- --- --- ---\nLive2Dwidget: Hey that, notice that you are now in DEV MODE.\n--- --- --- --- ---'); } / * The main entry point, which is ... nothing */ class L2Dwidget extends EventEmitter { constructor() { super(); this.config = config; } / * The init function * @param {Object} [userConfig] User's custom config 用户自定义设置 * @param {String} [userConfig.model.jsonPath = ''] Path to Live2D model's main json eg. `https://test.com/miku.model.json` model主文件路径 * @param {Number} [userConfig.model.scale = 1] Scale between the model and the canvas 模型与canvas的缩放 * @param {Number} [userConfig.display.superSample = 2] rate for super sampling rate 超采样等级 * @param {Number} [userConfig.display.width = 150] Width to the canvas which shows the model canvas的长度 * @param {Number} [userConfig.display.height = 300] Height to the canvas which shows the model canvas的高度 * @param {String} [userConfig.display.position = 'right'] Left of right side to show 显示位置:左或右 * @param {Number} [userConfig.display.hOffset = 0] Horizontal offset of the canvas canvas水平偏移 * @param {Number} [userConfig.display.vOffset = -20] Vertical offset of the canvas canvas垂直偏移 * @param {Boolean} [userConfig.mobile.show = true] Whether to show on mobile device 是否在移动设备上显示 * @param {Number} [userConfig.mobile.scale = 0.5] Scale on mobile device 移动设备上的缩放 * @param {String} [userConfig.name.canvas = 'live2dcanvas'] ID name of the canvas canvas素的ID * @param {String} [userConfig.name.div = 'live2d-widget'] ID name of the div div素的ID * @param {Number} [userConfig.react.opacity = 0.7] opacity 透明度 * @param {Boolean} [userConfig.dev.border = false] Whether to show border around the canvas 在canvas周围显示边界 * @param {Boolean} [userConfig.dialog.enable = false] Display dialog 显示人物对话框 * @param {Boolean} [userConfig.dialog.hitokoto = false] Enable hitokoto 使用一言API * @return {null} */ init(userConfig = {}){ configApplyer(userConfig); this.emit('config', this.config); if((!config.mobile.show)&&(device.mobile())){ return; } import(/* webpackMode: 'lazy' */ './cLive2DApp').then(f => { this.coreApp = f; this.live2DMgr = this.coreApp.theRealInit(this); }).catch(err => { console.error(err); }); } / * Capture current frame to png file {@link captureFrame} * @param {Function} callback The callback function which will receive the current frame * @return {null} */ captureFrame(callback){ return this.coreApp.captureFrame(callback); } / * download current frame {@link L2Dwidget.captureFrame} * @return {null} */ downloadFrame(){ this.captureFrame( function(e){ let link = document.createElement('a'); document.body.appendChild(link); link.setAttribute('type', 'hidden'); link.href = e; link.download = 'live2d.png'; link.click(); } ); } }; let _ = new L2Dwidget(); export { _ as L2Dwidget, }
4、更换模型
在 https://github.com/xiazeyu/live2d-widget-models.git 这个地址可以看到可以用的model,
use npm install {packagename} The package name is the folder name in packages/ We have: live2d-widget-model-chitose live2d-widget-model-epsilon2_1 live2d-widget-model-gf live2d-widget-model-haru/01 (use npm install --save live2d-widget-model-haru) live2d-widget-model-haru/02 (use npm install --save live2d-widget-model-haru) live2d-widget-model-haruto live2d-widget-model-hibiki live2d-widget-model-hijiki live2d-widget-model-izumi live2d-widget-model-koharu live2d-widget-model-miku live2d-widget-model-ni-j live2d-widget-model-nico live2d-widget-model-nietzsche live2d-widget-model-nipsilon live2d-widget-model-nito live2d-widget-model-shizuku live2d-widget-model-tororo live2d-widget-model-tsumiki live2d-widget-model-unitychan live2d-widget-model-wanko live2d-widget-model-z16
安装模型,
# cnpm install live2d-widget-model-shizuku cnpm install live2d-widget-model-koharu
在 node_modules 目录下可以看到 live2d-widget-model-koharu文件夹,在使用的时候,指定model的json位置即可,
<script type="text/javascript"> //L2Dwidget.init(); L2Dwidget.init({ model: { jsonPath: 'node_modules/live2d-widget-model-koharu/assets/koharu.model.json', scale: 1, }, display: { superSample: 2, width: 200, height: 400, position: 'right', hOffset: 0, vOffset: -20, }, mobile: { show: true, scale: 0.8, motion: true, }, name: { canvas: 'live2dcanvas', div: 'live2d-widget', }, react: { opacity: 1, }, dev: { border: false }, dialog: { enable: false, script: null } }); </script>
5、人物自动说话
在README-SCRIPT.md文件中有介绍,人物可以每 10 秒钟显示一条一言,用的是一言接口,只需要配置 dialog 属性即可,
L2Dwidget.init({ dialog: { // 开启对话框 enable: true, script: { // 每空闲 10 秒钟,显示一条一言 'every idle 10s': '$hitokoto$', // 当触摸到星星图案 'hover .star': '星星在天上而你在我心里 (*/ω\*)', // 当触摸到角色身体 'tap body': '哎呀!别碰我!', // 当触摸到角色头部 'tap face': '人家已经不是小孩子了!' } } });
6、手动调用对话框
L2Dwidget.min.js 中只提供了自动说话的信息框,没有手动调用的接口,因此需要修改源代码新增接口,在 src/index.js 中添加如下代码,
import { alertText } from './dialog'; / * 弹出对话框 */ alert(text){ alertText(text); }
修改后,
//代码省略 import device from 'current-device'; import { config, configApplyer }from './config/configMgr'; import { EventEmitter } from './utils/EventEmitter'; import { alertText } from './dialog'; //代码省略 / * download current frame {@link L2Dwidget.captureFrame} * @return {null} */ downloadFrame(){ this.captureFrame( function(e){ let link = document.createElement('a'); document.body.appendChild(link); link.setAttribute('type', 'hidden'); link.href = e; link.download = 'live2d.png'; link.click(); } ); } / * 弹出对话框 */ alert(text){ alertText(text); } //代码省略
此时只需要执行yarn webpack重新编译就可以,使用示例如下,
// js L2Dwidget.alert("~");
注意,必须配置 dialog: {enable: true} 开启对话功能,
7、更多模型
https://mx.paul.ren/about
8、补充:Cubism 4 SDK for Web
Cubism 4 SDK for Web 是由 Live2D 开发的一款用于在 Web 环境下实现 Live2D 角色模型的软件开发工具包(SDK)。它是基于 WebGL 技术的,可以将静态的插图转化为具有动态效果的角色模型。除了使用 L2Dwidget.min.js 实现看板娘,也可以使用 SDK 实现。
三、Live2d Desktop
Cubism 4 SDK for Native 是由 Live2D 开发的一款用于在本地应用程序中实现 Live2D 角色模型的软件开发工具包(SDK)。它适用于各种平台,如 Windows、macOS、iOS 和 Android 等。
Cubism 4 SDK for Native 提供了一系列功能和工具,使得开发者可以更加灵活地创建、渲染和控制 Live2D 模型。它支持多种图形 API,如 OpenGL、DirectX 和 Metal,并且提供了丰富的 API 接口,方便开发者进行定制化开发。
使用 Cubism 4 SDK for Native,开发者可以通过加载模型文件、纹理文件和动作数据文件,将 Live2D 模型嵌入到本地应用程序中。SDK 提供了丰富的参数设置和动作控制接口,可以实现模型的移动、旋转、表情变化等交互效果。同时,SDK 还支持用户自定义的着色器和特效,以及模型的物理运动模拟。
1、SDK 下载
# 需要下载 sdk for native https://www.live2d.com/zh-CHS/download/cubism-sdk/
SDK 解压后的目录是这样子,主要分为三大模块,
1、Core => Live2DCubismCore 的动态链接库
2、Framework => 基本的框架,用于模型的读取和配置
3、Samples => 示例与脚本
2、基于 OpenGL 运行项目
OpenGL(Open Graphics Library)是一个跨平台的图形编程接口,用于渲染二维和三维图形。它由一系列函数和状态机组成,可以在各种操作系统和硬件平台上使用。
OpenGL 提供了一套标准化的接口,使得开发者可以利用硬件加速来创建高性能的图形应用程序。它支持各种图形效果,如光照、阴影、纹理映射等,并且可以处理复杂的几何变换和投影操作。
OpenGL 是一个底层的图形库,它提供了对图形硬件的直接访问,因此具有很高的灵活性和可定制性。开发者可以使用 OpenGL 来创建各种类型的图形应用程序,包括游戏、计算机辅助设计(CAD)、数据可视化等。
OpenGL 的工作原理是通过定义一系列的状态和操作来描述图形对象,并将其发送到图形硬件进行处理和渲染。开发者可以使用 OpenGL 的函数来设置状态、加载纹理、执行变换等操作,从而实现所需的图形效果。
这里以 Win10 为例使用脚本生成 OpenGL 项目,脚本路径为,
\CubismSdkForNative-4-r.7\Samples\OpenGL\Demo\proj.win.cmake\scripts
在此之前我们需要下载对应版本的 glew 和 glfw,因为 OpenGL 需要用到这两个库,
# 发布版本 https://github.com/nigels-com/glew/releases/download/glew-2.2.0/glew-2.2.0.zip # 发布版本 https://github.com/glfw/glfw/releases/download/3.3.8/glfw-3.3.8.zip
下载好放到 thirdParty 路径下,
\CubismSdkForNative-4-r.7\Samples\OpenGL\thirdParty
当然,如果网络畅通的话可以直接使用 scripts 中的脚本一键安装,脚本源代码如下,
@echo off set GLEW_VERSION=2.2.0 set GLFW_VERSION=3.3.8 set SCRIPT_PATH=%~dp0 cd %SCRIPT_PATH%/.. :::::::::::::::: :: Setup GLEW :: :::::::::::::::: :: Download and extract the archive. echo - Setup GLEW %GLEW_VERSION% echo Downloading... curl -fsSL -o glew.zip ^ "https://github.com/nigels-com/glew/releases/download/glew-%GLEW_VERSION%/glew-%GLEW_VERSION%.zip" if %errorlevel% neq 0 pause & exit /b %errorlevel% echo Extracting... powershell "$progressPreference = 'silentlyContinue'; expand-archive -force glew.zip ." if %errorlevel% neq 0 pause & exit /b %errorlevel% ren glew-%GLEW_VERSION% glew del glew.zip :::::::::::::::: :: Setup GLFW :: :::::::::::::::: echo. :: Download and extract the archive. echo - Setup GLFW %GLFW_VERSION% echo Downloading... curl -fsSL -o glfw.zip ^ https://github.com/glfw/glfw/releases/download/%GLFW_VERSION%/glfw-%GLFW_VERSION%.zip if %errorlevel% neq 0 pause & exit /b %errorlevel% echo Extracting... powershell "$progressPreference = 'silentlyContinue'; expand-archive -force glfw.zip ." if %errorlevel% neq 0 pause & exit /b %errorlevel% ren glfw-%GLFW_VERSION% glfw del glfw.zip echo. pause
安装好依赖库好,我们执行开头说的脚本,proj_msvc2022.bat,
可以看到项目已经生成, Demo.sln 打开项目,
# 项目路径 \CubismSdkForNative-4-r.7\Samples\OpenGL\Demo\proj.win.cmake\build\proj_msvc2022_x64_mt
直接运行即可,
注:如果报错:can't create glfw Window,要么是虚拟机没开OpenGL,要么是第三库没有安装好,
3、基于 D3D11 运行项目
D3D11(Direct3D 11)是微软公司开发的一种图形编程接口,用于在 Windows 平台上实现高性能的三维图形渲染。它是 DirectX 11 的一部分,是 Direct3D 的最新版本。
D3D11 提供了一套功能强大且灵活的接口,使得开发者可以利用硬件加速来创建复杂的三维图形应用程序。它支持各种图形效果,如光照、阴影、纹理映射等,并且可以处理复杂的几何变换和投影操作。
D3D11 是一个底层的图形库,它直接与图形硬件交互,因此具有很高的性能和可定制性。开发者可以使用 D3D11 来创建各种类型的图形应用程序,包括游戏、计算机辅助设计(CAD)、虚拟现实(VR)等。
D3D11 的工作原理是通过定义一系列的状态和操作来描述图形对象,并将其发送到图形硬件进行处理和渲染。开发者可以使用 D3D11 的接口来设置状态、加载纹理、执行变换等操作,从而实现所需的图形效果。
步骤类同 2,首先到 D3D11 目录下找到 Demo 对应平台的脚本,脚本生成项目代码,
然后配置项目的依赖库,在 D3D11 目录下找到 thirdParty 找到安装脚本设置第三方库,这里会下载 DirectX11 库,
最后在 build 目录下找到生成的项目解决方案 Demo.sln,
直接运行项目,
4、补充:虚拟机开启 OpenGL 支持
今天的文章 二、Live2d 简介与使用分享到此就结束了,感谢您的阅读。
- 在 VirtualBox 中选择您的虚拟机,并 "设置"。
- 在虚拟机设置窗口中,选择 "显示" 选项卡。
- 在 "显示" 选项卡中,确保 "启用 3D 加速" 复选框被选中。
- 在 "显卡" 部分,选择 "VBoxVGA" "VBoxSVGA"或 "VMSVGA" 作为显卡控制器。这几个选项都支持 OpenGL 加速。
- "确定" 保存更改并关闭设置窗口。
- 启动虚拟机,并在 Windows 10 中安装 VirtualBox Guest Additions。在虚拟机的菜单栏中,选择 "设备" -> "安装增强功能"。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/bian-cheng-ji-chu/102496.html