最快的方法来中和变换matrix中的比例?

假设我们有4×4三维变换matrix,这是尺度,旋转和平移变换的结果。 如何以最快的方式将其规模设置为(1,1,1)? 还假定matrix由float [16]数组表示。

以最快的方式,我的意思是,最高性能准确的方式,这将是低CPU成本。

假设你的matrix乘法遵循惯例…

M * v = (T * R * S) * v

(其中M是你的合成matrix, T是一个平移matrix, R旋转, S尺度,而v是你想用matrix变换的一个向量)

…然后你可以规范matrix的前三列来得到T * R部分。

如果你使用相反的matrix乘法约定( v * M ),那么你应该规范前三 。 无论哪种方式,您只需要修改matrix左上方的3×3条目,忽略最后一行和列(包含翻译信息和同类单位)

如果你想每隔一个CPU周期产生一个结果,你可以使用SIMD指令来执行三个向量归一化,只有一个乘法和平方根,但是如果你正在处理大量的这些matrix,非常友好的数据布局。

有一个技巧可以用来从上面的3×3子matrix中进行数值删除(或者更确切地说就是减less),假设它不是单一的。 我们称这个3×3子matrix为M,可以取M的倒数的转置,并用M来平均它。这将是下一个循环的新M。

 while (...) { N = (transpose(inv(M)) + M)/2 if M is almost like N then stop M <-- N } 

您可以设置最大循环数,如果M足够接近N,则可以提前停止