本文翻译自:https://docs.live2d.com/cubism-sdk-tutorials/lookat/
译者注:注意!这并不是一篇严谨的翻译,本人并不是翻译行业从业者,也根本不会日文。官网的中文翻译会连带代码一起翻译,而且还不如机翻日文,官网的英语翻译版本有的语法很奇怪,看起来也是机翻。本文主要来自日文机翻,然后再结合实际开发经验调整到通顺,修改不该翻译的东西并润色。
[最后更新日期: 2019/01/30] 译者注:这是这个日文原文的更新日期
在本节,我们将说明如何使模型的视线跟随鼠标指针移动。
摘要
Cubism SDK 使用一个名为 Lookat 的组件来实现视线追踪。
SDK 中名为 LookAt 的示例场景使用了此组件,因此也请参考该场景。
这个示例展示了模型的视线追踪一个在上方移动的物体。
/Assets/Live2D/Cubism/Samples/Lookat
要实现 Lookat,需要以下三步:
- 附加管理
Lookat的组件 - 指定要用于追踪的参数
- 指定视线追踪的目标
附加管理 Lookat 的组件
将名为 CubismLookController 的组件(用于管理视线追踪)附加到模型所在的节点上。
img
imgCubismLookController 具有四个设置项。
Blend Mode : 它是在视线跟随参数时如何反映波动值的设置。可以设置以下三个。
- Mutiply : 与当前值相成。
- Additive : 与当前值相加。
- Override : 覆盖当前值。
- Center : 在这里设置坐标中心的
GameObject。
中心指的是模型依附的 GameObject 的 Bounds 的中心
可以将 [Model]/Drawables/ 下的 GameObject 设置为 Center。
如果未对此项目设置任何内容,则 CubismLookController 将使用附加的 GameObject 的中心。
- Damping : 追踪目标所需的时间。值越小,追踪速度越快。
- Target : 设定跟随视线的目标。稍后将描述细节。
这次,将 Blend Mode 设置为 [Override]。
指定要用于追踪的参数
在 [模型]/Parameters/ 下,放置用于管理模型参数的 GameObject。
此外,在此目录下各项用于设置的 GameObject 的名称是参数的 ID。
他们都可以通过 CubismModel.Parameters() 获得。
将一个名为 CubismLookParameter 的组件附加到您要用于追踪的参数 ID 所在组件上。
如果将 CubismLookParameter 附加到该参数的 GameObject,则上面提到的 CubismLookController 将引用它并将它用于追踪。
译者注:追踪说白了就是随着某个物体的移动,模型的某些参数将会改变。比如鼠标移动,眼球就会移动(注视鼠标),其实就是眼球的 x y 坐标随着鼠标的移动而变化。这样就需要把眼球 x 参数对应的 GameObject 和 y 参数对应的 GameObject 附加上 CubismLookParameter。这样 CubismLookController 就会自动修改他们来实现注视/追踪效果。
img
imgCubismLookParameter 具有两个设置项。
- Axis : 指定将设置参数视为转换的轴数。例如,如果指定了X,则会根据 Target 的 X 轴的值进行计算和设置。
- Factor : 设置计算值的放大倍数。由于计算结果的值在-1到+1的范围内,根据参数的不同,增加或减少范围或反转+和-可能更自然。
设定目标以追踪视线
最后,准备要被追踪的目标。
要对 CubismLookController 组件的 [Target] 设置一个实现了 [ICubismLookTarget] 接口的脚本。
根据设置目标的不同,可以设置特定条件,例如将目标设置为注视鼠标或某个 GameObject 的位置,或者仅在拖动时跟随。
创建一个名为 CubismLookTarget 的 C# 脚本,并写入如下的代码。
在这里,我们试图注视鼠标(按住左键)。
using Live2D.Cubism.Framework.LookAt;
using UnityEngine;
public class CubismLookTarget : MonoBehaviour, ICubismLookTarget
{
public Vector3 GetPosition()
{
if(!Input.GetMouseButton(0))
{
return Vector3.zero;
}
var targetPosition = Input.mousePosition;
targetPosition = (Camera.main.ScreenToViewportPoint(targetPosition) * 2) - Vector3.one;
return targetPosition;
}
public bool IsActive()
{
return true;
}
}创建一个空的 GameObject 并在其上面附加 CubismLookTarget。
img选择模型并将上面创建的那个空白 GameObject 从“检查器” 视图拖放到 CubismLookController 的 [Target] 上。
img这样就完成了设置。
运行场景并用鼠标左键拖动 "游戏(Game)" 视图以测试模型的鼠标注视。