从皮肤pos计算无皮肤pos

时间:2017-01-16 18:33:02

标签: c++ math matrix unreal-engine4

嘿伙计们,我试图计算皮肤斑点的无皮肤斑点。

皮肤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];
}

当Matrices,Weights和NewPos知道时,如何计算Pos?

我知道,对于单一转换,它是:

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

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

1 个答案:

答案 0 :(得分:0)

您可以将此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);

如果引擎正确处理齐次坐标,那么除以右下角元素的归一化步骤不是必要的,但显然情况并非如此。因此,如果矩阵可能表示非仿射投影变换(最后一行不是FVector),则不应使用0 0 0 *但使用FVector4代替。如果想要使用FVector,我必须按比例缩放矩阵以制作最后一行0 0 0 1