Flag Engine(动画系统)学习笔记(七)——蒙皮及生成矩阵调色板

本文介绍了3D游戏中的蒙皮技术,特别是线性混合蒙皮的本质。每个顶点可以绑定到一个或多个关节,通过关节索引和权重因子确定其位置。通常限制每个顶点最多4个关节,以节省计算资源。蒙皮矩阵调色板包含每个关节从bindpose到当前姿势的变换矩阵。提取这些信息并生成蒙皮矩阵是实现蒙皮效果的关键步骤。文章还探讨了如何烘焙现有姿势,处理顶点位置、法线和切线的变换,并提供了可视化验证的方法。
摘要由CSDN通过智能技术生成

2021SC@SDUSC

把三维网格顶点联系至骨骼的过称称为蒙皮。蒙皮用的网格是通过其顶点联系上骨骼的。每个顶点可绑定到一个或多个关节。若绑定至多个顶点,该顶点的位置为把它绑定到单一关节后的位置,再求其加权平均。

每个顶点需要信息:

  • 该顶点绑定的(一个或多个)关节的索引;
  • 对于绑定的每个关节,提供一个权重因子。

游戏引擎会限制每个顶点能绑定的关节数目,典型的限制为每顶点4个关节。
原因如下:首先,4个8位关节索引能方便地包裹为一个32位字,此外,每顶点使用2个、3个及4个关节所产生的质量很容易区分,但大多数人并不能分辨出每个顶点4个关节以上的质量差别。

典型的蒙皮顶点数据结构

struct SkinnedVertex
{
    float m_position[3];
    float m_normal[3];
    float m_u, m_v;         // 纹理坐标
    U8    m_jointIndex[4];  // 关节索引
    float m_jointWeight[3]; // 关节权重
};

线性混合蒙皮的本质

蒙皮的诀窍:顶点只有一个关节(即常说的骨骼,但是《游戏引擎架构》喜欢把它叫关节)影响时,顶点在关节空间中始终不变。

在被多个关节影响时,对于每个关节空间都会有这么一个不变的顶点位置。把这些顶点位置转化到模型空间,然后按权重对它们进行加权平均(线性混合),就可以得到模型空间下的顶点。于是,蒙皮效果就出现了。

这一步也可以让它直接转换到世界空间以节省一次矩阵乘法。但是如果场景中需要大量的实例,先转换到模型空间是更优的选择。

对每个关节而言,把顶点从bindpose变化到当前姿势的矩阵为蒙皮矩阵。每个顶点对应多个蒙皮矩阵,他们组成了蒙皮矩阵调色板。

提取信息

一个自定义Component,在Component里写上一个提取SkinnedMeshRenderer中所有必要信息的函数,序列化到Component上。

 [HideInInspector]
    [SerializeField]
    public Matrix4x4[] bindPoses;
    [HideInInspector]
    public Vector3[] vertices;
    [HideInInspector]
    public Vector4[] tangents;
    [HideInIns
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值