2017-01-16 27 views
0

嘿家伙我试图从skinned pos计算unskinned pos。从skinned pos计算unskinned 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 = Matrices[0].InverseTransformPosition(NewPos/Weights[0]);  

它甚至有可能重新计算名次,如果它是如何应该是做什么?

+0

您开始使用单词“顶点”,然后切换到使用“pos”。他们是一样的吗?你需要在你的问题中使用一致的术语。 – Sabuncu

+0

是的,它们是一样的。我更新了这个问题以避免混淆。 – user3523937

回答

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); 

正常化的步骤,其中我除以右下角元素,如果发动机被正确处理齐次坐标,但显然这不是这种情况不应该neccessary。因此,如果矩阵可能表示非仿射投影转换(最后一行不是0 0 0 *),而是使用FVector4代替,则不应使用FVector。如果想要使用FVector,则必须按照上面的方式缩放矩阵,使最后一行为0 0 0 1

+0

我没有安装虚幻。你会得到什么? 'NewPos'是否如预期的那样? – MvG

+0

我不小心删除了我之前的评论,但我更新了更多信息。 – user3523937

+0

@ user3523937:我想我发现了这个问题;相应地更新了我的答案 – MvG