网站开发体会网络广告案例
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 offset GLEW_VERSION=2.2.0
set GLFW_VERSION=3.3.8set SCRIPT_PATH=%~dp0cd %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.zipecho.
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 支持
- 在 VirtualBox 中选择您的虚拟机,并点击 "设置"。
- 在虚拟机设置窗口中,选择 "显示" 选项卡。
- 在 "显示" 选项卡中,确保 "启用 3D 加速" 复选框被选中。
- 在 "显卡" 部分,选择 "VBoxVGA" "VBoxSVGA"或 "VMSVGA" 作为显卡控制器。这几个选项都支持 OpenGL 加速。
- 点击 "确定" 保存更改并关闭设置窗口。
- 启动虚拟机,并在 Windows 10 中安装 VirtualBox Guest Additions。在虚拟机的菜单栏中,选择 "设备" -> "安装增强功能"。