【问题标题】:Calculating unskinned pos from skinned pos从蒙皮 pos 计算未蒙皮 pos
【发布时间】:2017-05-31 16:13:23
【问题描述】:

大家好,我正在尝试根据已剥皮的 pos 计算未剥皮的 pos。

蒙皮位置的计算方式如下:

FMatrix Matrices[3];
float Weights[3];
FVector Pos;
FVector NewPos;
for( int i = 0; i < 3; i++)
{
   NewPos += Matrices[i].TransformPosition(Pos) * Weights[i];
}

在知道矩阵、权重和 NewPos 的情况下,我如何计算 Pos?

我知道对于单个转换它是:

 Pos = Matrices[0].InverseTransformPosition(NewPos / Weights[0]);    

是否甚至可以重新计算 Pos,如果可以,应该怎么做?

【问题讨论】:

  • 你开始使用单词“vertices”,然后切换到使用“pos”。他们是一样的吗?您需要在问题中使用一致的术语。
  • 是的,它们是一样的。我更新了问题以避免混淆。

标签: c++ math matrix unreal-engine4


【解决方案1】:

您可以将此TransformPosition 调用视为矩阵乘以向量的乘法。权重也可以应用于矩阵。所以你有

M1*pos*w1 + M2*pos*w2 + M3*pos*w3 = (w1*M1 + w2*M2 + w3*M3)*pos

换句话说,您可以使用权重来缩放矩阵,然后添加矩阵。结果将是一个结合了整个操作的矩阵。然后你可以使用它的逆变换。

FMatrix Combined;
for( int i = 0; i < 3; i++) {
   Combined += Matrices[i] * Weights[i];
}
Combined *= 1 / Combined.M[3][3];
Pos = Combined.InverseTransformPosition(NewPos);

如果引擎正确处理齐次坐标,则不需要我除以右下角元素的标准化步骤,但显然情况并非如此。因此,如果矩阵可能表示非仿射投影变换(最后一行不是0 0 0 *),则不应使用FVector,而是使用FVector4。如果想使用FVector,则必须像上面那样缩放矩阵以生成最后一行0 0 0 1

【讨论】:

  • 我没有安装虚幻。你会得到什么NewPos 是否符合预期?
  • 我不小心删除了我之前的评论,但我更新了问题,提供了更多信息。
  • @user3523937:我想我发现了问题;相应地更新了我的答案
  • 对不起,'M[3][3]' 是什么?
  • @user3523937:矩阵Combined最后一行的最后一项。应该用那个名字。可能必须写成Combined.M[3][3],不过,我不确定。
猜你喜欢
  • 2015-06-16
  • 2011-03-15
  • 2011-04-10
  • 1970-01-01
  • 2020-03-21
  • 1970-01-01
  • 2012-11-14
  • 2013-10-01
  • 2012-12-03
相关资源
最近更新 更多