嘿伙计们,我试图计算皮肤斑点的无皮肤斑点。
皮肤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,如果它应该怎么做呢?
答案 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
。