首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将线性变换应用于gltf数据

如何将线性变换应用于gltf数据
EN

Computer Graphics用户
提问于 2022-11-12 01:17:19
回答 1查看 121关注 0票数 1

我试图在一个gltf文件中转换网格数据,然后相应地修改皮肤和动画数据。

假设我们希望使用一个4x4齐次矩阵来转换数据。为了简化,让我们说,变换只是交换y和z轴。

对网格数据的处理非常简单:

就像这样:

代码语言:javascript
运行
复制
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轴被交换。

我们知道,在我们进行转换之前,动画实际上计算为:

(\sum \lambda_i A_i \cdot M_i) \cdot v

其中\lambda_i, A_i, M_i是权值、动画矩阵和逆约束矩阵。

现在,在修改网格数据的顶点之后:

(\sum \lambda_i A_i \cdot M_i) \cdot T v

因此,我们需要修改矩阵,以便在应用所有其他转换之后只应用一次转换T,因此:

T(\sum \lambda_i A_i \cdot M_i)T^{-1} T v
(\sum \lambda_i TA_i \cdot M_iT^{-1}) T v

上述公式表明,正确的方法是将转换应用于所有动画数据,并将其反向应用于ibms。

类似于:

  • 每一个ibm矩阵ibm -> ibm * T^{-1}
  • 对于皮肤节点中的每个节点,-> T *节点
  • 对于皮肤中的每个动画输出,输出-> T *输出

这在我尝试过的所有真实生活数据中都失败了,我不明白为什么。例如,这是模型的结果:

如果我从模型中移除皮肤,就会得到以下结果:

这是预期的输出,网格数据翻转了z和y。

那么,必须做些什么来转换动画数据以匹配到网格的转换呢?

EN

回答 1

Computer Graphics用户

发布于 2022-11-12 14:56:18

在变换法向量时,我们必须小心地检查变换本身是否等于它自己的逆转置。或者在矩阵上做一个逆转置。这种情况通常是这样的,但是检查它会使需求变得明确而不是隐含。(例如,变换中的标度会导致不正确的法向量)

当将矩阵从一个坐标系转换到另一个坐标系时,我们有一个矩阵M,它将向量从坐标系A转换到坐标系B,然后从A到B的变换是B=MAM^{-1}

票数 1
EN
页面原文内容由Computer Graphics提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://computergraphics.stackexchange.com/questions/13102

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档