我很难编写附加骨架动画。
如果我单独播放每个动画,一切正常,所以我知道每个动画的姿势都是正确的...我无法弄清楚的是如何将它们加成混合。
我得到了以下内容:
void MD5ANIM_additive_blending( MD5MD5ANIM *md5, MD5MD5ANIMJOINT *dst, MD5MD5ANIMJOINT *pose0, MD5MD5ANIMJOINT *pose1 )
{
unsigned int i = 0;
while( i != md5->n_joint )
{
vec3 location;
quat4 quaternion;
// The joints location difference
vec3_subtract( &location, &pose1[ i ].location, &pose0[ i ].location );
// Add the joint location difference to the first pose to create additive new pose.
vec3_add( &dst[ i ].location, &pose0[ i ].location, &location );
// The quaternion difference
quat4_subtract( &quaternion, &pose0[ i ].quaternion, &pose1[ i ].quaternion );
// Add the joint quaternion difference to the first pose to create additive new pose.
quat4_add( &dst[ i ].quaternion, &pose0[ i ].quaternion, &quaternion );
quat4_normalize( &dst[ i ].quaternion,
&dst[ i ].quaternion );
++i;
}
}
任何人都可以指出我哪里弄错了。根据我的理解,加性混合到骨架姿势就像这样简单:
additive_pose = pose0 +(pose0 - pose1)
我做错了什么?
答案 0 :(得分:1)
让我们说你有一个步行动画,另一个有一只手在空中。所以基本上走路+手=用手在空中行走
有两种可能性:
您的漫步动画不会影响手动画所用的骨骼。
您的漫步动画 会影响手动画所用的骨骼。
在这种情况下,您有两种选择。您的姿势结构可以有一个位域来判断特定的骨骼是否在其中。因此,您可以通过查看哪个姿势具有另一个没有提供的骨骼来构成两个姿势。
如果没有位域或其他信息说明姿势是否实际包含骨骼数据,那么您可以这样做。姿势中不在动画中的任何骨骼都应该是身份。因此,您可以通过四元数乘法将两个姿势的骨骼相乘。
<案例2由于两个动画之间存在重叠,因此有人必须获胜。基本上,您必须知道分层动画具有哪些骨骼,并且将来自较低姿势的数据替换为来自较高姿势的数据。
您发布的代码是乱码。一般来说,如果你有两个方向四元数并且认为添加/减去它们是一个好主意,那么你要么做一些复杂的优化(在这种情况下你知道你在做什么),或者你正在做一些非常好的事情错。