程序动画

1.5k words

简介

记录学习程序动画的记录

来源

learn.unity.com
Docs Animation Rigging
Procedural Animation Video Notes
Moveen tutorial
youtube

效果

类型

Multi-Parent Constraint


提供像父子对象的约束

Damped Transform


阻尼变换约束允许阻尼从源游戏对象到受约束游戏对象的位置和旋转变换值。“保持目标”选项强制受约束对象始终瞄准源对象

ChainIK Constraint


允许反转对游戏对象层次结构的控制,以便提供行为类似于链的操作。通过定义根和尖端游戏对象,链 IK 约束将能够找到并约束其间包含的所有游戏对象

TwistChain Constraint


允许控制游戏对象链层次结构两端的世界旋转。根部和尖端旋转沿着链插值到游戏对象之间,以创建平滑的动画层次结构

Two Bone IK


两个骨骼 IK 是一种约束,它将由 2 个骨骼组成的简单 FK 层次结构转换为可由目标游戏对象(类似手的控件)和提示游戏对象(类似肘的控件)控制和操作的反向运动学表达式

实现上

BoneRender

BoneRender组件负责在“场景视图”中显示可拾取骨骼。
此组件在运行时不执行任何操作。

IKFootSolver

位置的插值计算

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36

void Update()
{
transform.position = currentPosition;
transform.up = currentNormal;

Ray ray = new Ray(body.position + (body.right * footSpacing), Vector3.down);

if (Physics.Raycast(ray, out RaycastHit info, 10, terrainLayer.value))
{
if (Vector3.Distance(newPosition, info.point) > stepDistance && !otherFoot.IsMoving() && lerp >= 1)
{
lerp = 0;
int direction = body.InverseTransformPoint(info.point).z > body.InverseTransformPoint(newPosition).z ? 1 : -1;
newPosition = info.point + (body.forward * stepLength * direction) + footOffset;
newNormal = info.normal;
}
}

if (lerp < 1)
{
Vector3 tempPosition = Vector3.Lerp(oldPosition, newPosition, lerp);
tempPosition.y += Mathf.Sin(lerp * Mathf.PI) * stepHeight;

currentPosition = tempPosition;
currentNormal = Vector3.Lerp(oldNormal, newNormal, lerp);
lerp += Time.deltaTime * speed;
}
else
{
oldPosition = newPosition;
oldNormal = newNormal;
}
}