主流的 骨骼蒙皮动画 顶点变换方式的一个细节的思考
2017-08-15 15:31
411 查看
常见的骨骼蒙皮动画的顶点变换大致思路是:
将绑定姿势(比如说类人模型的T姿势)下的顶点位置 变换到 对应骨骼的局部空间(用该骨骼的绑定姿势空间下矩阵的逆) 再以该骨骼的所需时间点时对应的矩阵处理,重新变换到模型空间。
如果该顶点对应多个joint,将获得的多个新坐标加权平均。
以前一直觉得这个算法在对应多个joint时是错的。
以前我的理解是:
以对应两个joint为例,某顶点P的模型空间坐标为Pmodel ,该点在joint0局部空间坐标根据骨骼蒙皮动画约定总是 P0, 在joint1局部空间坐标根据骨骼蒙皮动画约定总是P1。 joint0到模型空间的总矩阵M0,joint1到模型空间的总矩阵M1。权重分别w0, w1。
假设绑定姿势对应t0时间点
Pmodelt0 = P0× M0t0 × w0
+ P1 ×M1t0 × w1 (1)
求Pmodelt1
常见算法的公式是
Pmodelt1 = Pmodelt0 × (M0t0)-1× M0t1 × w0 + Pmodelt0 × (M1t0)-1×
M1t1 × w1 (2)
如果把等式(1)带入上式,就会得到一个不伦不类的东西。实际上应该是将等式(1)中的两项分别做等式(2)中两项的处理。所以我一直觉得常见算法这里有问题。
今天又想了想,原来没毛病。
还延续我的假设,但是如果将P0 设为Pmodelt0 × (M0t0)-1,同理将P1设为Pmodelt0 × (M1t0)-1,这样等式(1)从数学上来说就退化成一个恒等式,如果不化简等式(1),直接带入等式(2),等式(2)就成立了。
从实际意义上来说,如果令在绑定姿势时的模型空间顶点坐标(加权平均后的) 和 顶点坐标在绑定姿势时在各个joint的局部坐标变换到模型空间坐标 相等。
(也就是实际上没必要加权平均了,这时候该点从各个joint算出来的坐标都相等)
也就是绑定姿势时模型空间顶点坐标 乘以 各个joint的逆矩阵,得到一个坐标,令这个坐标为顶点坐标在对应joint的局部坐标。
这时就可以简化顶点的计算方式,也就是常见算法。
这里可以随意假设局部坐标,只要满足假设的这套 局部坐标 可以满足等式1就行。
如果恰好假设以上那个假设,那就很方便计算。
将绑定姿势(比如说类人模型的T姿势)下的顶点位置 变换到 对应骨骼的局部空间(用该骨骼的绑定姿势空间下矩阵的逆) 再以该骨骼的所需时间点时对应的矩阵处理,重新变换到模型空间。
如果该顶点对应多个joint,将获得的多个新坐标加权平均。
以前一直觉得这个算法在对应多个joint时是错的。
以前我的理解是:
以对应两个joint为例,某顶点P的模型空间坐标为Pmodel ,该点在joint0局部空间坐标根据骨骼蒙皮动画约定总是 P0, 在joint1局部空间坐标根据骨骼蒙皮动画约定总是P1。 joint0到模型空间的总矩阵M0,joint1到模型空间的总矩阵M1。权重分别w0, w1。
假设绑定姿势对应t0时间点
Pmodelt0 = P0× M0t0 × w0
+ P1 ×M1t0 × w1 (1)
求Pmodelt1
常见算法的公式是
Pmodelt1 = Pmodelt0 × (M0t0)-1× M0t1 × w0 + Pmodelt0 × (M1t0)-1×
M1t1 × w1 (2)
如果把等式(1)带入上式,就会得到一个不伦不类的东西。实际上应该是将等式(1)中的两项分别做等式(2)中两项的处理。所以我一直觉得常见算法这里有问题。
今天又想了想,原来没毛病。
还延续我的假设,但是如果将P0 设为Pmodelt0 × (M0t0)-1,同理将P1设为Pmodelt0 × (M1t0)-1,这样等式(1)从数学上来说就退化成一个恒等式,如果不化简等式(1),直接带入等式(2),等式(2)就成立了。
从实际意义上来说,如果令在绑定姿势时的模型空间顶点坐标(加权平均后的) 和 顶点坐标在绑定姿势时在各个joint的局部坐标变换到模型空间坐标 相等。
(也就是实际上没必要加权平均了,这时候该点从各个joint算出来的坐标都相等)
也就是绑定姿势时模型空间顶点坐标 乘以 各个joint的逆矩阵,得到一个坐标,令这个坐标为顶点坐标在对应joint的局部坐标。
这时就可以简化顶点的计算方式,也就是常见算法。
这里可以随意假设局部坐标,只要满足假设的这套 局部坐标 可以满足等式1就行。
如果恰好假设以上那个假设,那就很方便计算。
相关文章推荐
- 骨骼动画中的顶点变换过程详解
- 骨骼蒙皮动画学习
- 思考一个问题:如何将map里面的值,映射到一个对象里的属性,不通过手动方式设置!!!
- 骨骼蒙皮动画(SkinnedMesh)的原理解析(一)
- 读"一个细节引发的思考“引发的思考
- Cocos2d-x 3.0开发(六)使用cocoStudio创建一个骨骼动画
- 0324的学习笔记----里面最重要的就是一个tom猫的动画,和涉及到的内存问题(创建imageview的两种方式,imagenamed就会形成缓存,占用很多内
- 骨骼蒙皮动画(Skinned Mesh)的原理解析
- 蒙皮骨骼动画的理解
- 细节:一个很SB的问题引发的思考
- 骨骼蒙皮动画算法(Linear Blending Skinning)
- 一个checkbox细节处理方式(checkbox与后面的文字对其)
- 骨骼蒙皮动画(Skinned Mesh)的原理解析(二)
- set方式注入属性的一个小细节
- 骨骼蒙皮动画(Skinned Mesh)的原理解析(二)
- 动画系统丨六、Humanoid和Generic的区别、导入方式(骨骼映射、Avatar创建)
- MD5模型的格式、导入与顶点蒙皮式骨骼动画I
- 骨骼蒙皮动画(SkinnedMesh)的原理解析(一)
- [3dmax教程] 人物+骨骼+蒙皮+动画教程
- (转)专业的程序员需要具备的思考能力:写一个程序需要注意多少细节问题