嘿,伙计们,我在计算皮肤上的pos中的未剥皮的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,如果是的话,应该如何做?
发布于 2017-01-17 01:49:29
您可以将这个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 ),则不应该使用FVector4,而是使用FVector4。如果想要使用FVector,就必须像我上面所做的那样,缩放矩阵以生成最后一行0 0 0 1。
https://stackoverflow.com/questions/41682901
复制相似问题