二、Live2d 简介与使用

本文介绍了Live2D技术,用于将2D图像转化为动态角色,并详细阐述了如何在Web上使用L2Dwidget.min.js库集成Live2D模型,包括编译、运行、源代码解析、模型更换、人物交互等功能。此外,还探讨了Live2D在Desktop端的应用,涉及OpenGL和D3D11项目构建。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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("123456789~");

注意,必须配置 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 支持

  1. 在 VirtualBox 中选择您的虚拟机,并点击 "设置"。
  2. 在虚拟机设置窗口中,选择 "显示" 选项卡。
  3. 在 "显示" 选项卡中,确保 "启用 3D 加速" 复选框被选中。
  4. 在 "显卡" 部分,选择 "VBoxVGA" "VBoxSVGA"或 "VMSVGA" 作为显卡控制器。这几个选项都支持 OpenGL 加速。
  5. 点击 "确定" 保存更改并关闭设置窗口。
  6. 启动虚拟机,并在 Windows 10 中安装 VirtualBox Guest Additions。在虚拟机的菜单栏中,选择 "设备" -> "安装增强功能"。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

金汐脉动 | PulseTide

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值