今天看啥  ›  专栏  ›  万俟霜风

[Android]摸鱼计划:Live2D 执行动态和用户交互 API | 七日打卡

万俟霜风  · 掘金  · android  · 2021-01-16 23:17
阅读 18

[Android]摸鱼计划:Live2D 执行动态和用户交互 API | 七日打卡

一、Live2D API 再探索

上次看过了从文件加载 Live2D 模型的过程,Cubism SDK 里做了很多操作,用起来还是很方便的。 Live2D 和图片不一样,并不是显示到屏幕上就结束了,Demo 项目中实现了两处和用户交互的操作,分别是:

  1. Live2D 模型的视线方向跟随手指拖动变化
  2. 点击模型随机触发动作

随手指拖动的事件一定是在 onTouchEvent 的 ACTION_MOVE 中触发,Demo 监听了 Activity 的 onTouchEvent,我们也可以在 View 中做同样的操作。事件通过 JNI 发到 native 层,经过 LAppDelegate::OnTouchMoved、LAppView::OnTouchesMoved、LAppLive2DManager::OnDrag,最终执行到 SDK 中的 CubismUserModel::SetDragging 实现效果。

Demo 没有对 click 事件进行监听,而是在 ACTION_UP 的时候直接进行一个点击的判定。点击模型不同的位置可以实现不同的点击效果(测试 Demo 的时候我还真没发现),点击区域是 Live2D 模型本身设定的,Demo 中仅做了两种区域的点击处理:点击头部区域时修改随机表情,点击身体区域时开始随机动作。

// 进行区分的代码
if (_models[i]->HitTest(HitAreaNameHead, x, y))
{
    _models[i]->SetRandomExpression();
}
else if (_models[i]->HitTest(HitAreaNameBody, x, y))
{
    _models[i]->StartRandomMotion(MotionGroupTapBody, PriorityNormal, FinishedMotion);
}
复制代码

SetRandomExpression 的最终实现是 CubismMotionManager::StartMotionPriority,SDK 中大概是没有随机显示表情的方法,表情随机选择还是在业务中写的,先从所有的 expressions 里选一个作为参数传进去。

StartRandomMotion 的实现稍微复杂一点,最终实现还是 CubismMotionManager::StartMotionPriority,但动作比表情复杂很多,除了一个 id 之外还需要按 id 读取对应的文件(还可能有音频)。来看一个复杂的加了五毛特效的动作:

二、Live2DView 封装计划

Demo 中的操作还是很有限的,所以代码读起来不是很吃力,不自己写一写是不会明白难点在哪的。为了学以致用,接下来的计划是封装一个 Live2DView。Live2DView 的功能很简单,不考虑细节的话,只需要提供一个 setModelPath 的函数传入文件路径然后显示出来,并实现基本的用户操作即可。

Live2D 的显示大部分可以参考 Demo 的实现,项目已经创建好了,CMakeLists.txt 需要修改一下路径配置就能接入项目。要注意这个 Framework 的 CMakeList.txt 也有一个 include,漏掉这个配置浪费了我一个多小时,哎。


今天写了一点 Live2DView 的代码,最大的困难应该在 OpenGL 上,上次接触还是做毕设的时候,转眼间已经打工三年,青春和头发都渐渐离我而去。

周六上班真不容易,明天终于能休息了…【注意力涣散】




原文地址:访问原文地址
快照地址: 访问文章快照