我试图在一个gltf文件中转换网格数据,然后相应地修改皮肤和动画数据。
假设我们希望使用一个4x4齐次矩阵来转换数据。为了简化,让我们说,变换只是交换y和z轴。
对网格数据的处理非常简单:
就像这样:
for mesh in &gltf.meshes
{
for primitive in &mesh.primitives
{
for position in gltf
.data_from_accessor::<Vec3>(primitive.attributes.position)
.unwrap()
{
*position = transform_vec3(&position, &transform, true);
}
for normal in gltf
.data_from_accessor::<Vec3>(primitive.attributes.normal)
.unwrap()
{
*normal = transform_vec3(&normal, &transform, false);
}
}
}
现在的问题是,在这样做之后,我们必须对皮肤数据和动画数据做什么才能正确地改变它,以便现在y和z轴被交换。
我们知道,在我们进行转换之前,动画实际上计算为:
其中λi,Ai,Mi是权值、动画矩阵和逆约束矩阵。
现在,在修改网格数据的顶点之后:
因此,我们需要修改矩阵,以便在应用所有其他转换之后只应用一次转换T,因此:
上述公式表明,正确的方法是将转换应用于所有动画数据,并将其反向应用于ibms。
类似于:
这在我尝试过的所有真实生活数据中都失败了,我不明白为什么。例如,这是模型的结果:
如果我从模型中移除皮肤,就会得到以下结果:
这是预期的输出,网格数据翻转了z和y。
那么,必须做些什么来转换动画数据以匹配到网格的转换呢?
发布于 2022-11-12 06:56:18
在变换法向量时,我们必须小心地检查变换本身是否等于它自己的逆转置。或者在矩阵上做一个逆转置。这种情况通常是这样的,但是检查它会使需求变得明确而不是隐含。(例如,变换中的标度会导致不正确的法向量)
当将矩阵从一个坐标系转换到另一个坐标系时,我们有一个矩阵M,它将向量从坐标系A转换到坐标系B,然后从A到B的变换是B=MAM−1。
https://computergraphics.stackexchange.com/questions/13102
复制