VTK transform空间变换顺序
欧拉位姿 x y z rx ry rz 变为齐次矩阵
pose = [2.27117 , -34.3437 , 479.336 , 94.1909 , 10.6705 , 169.347]
x,y,z,rx,ry,rz = pose
其齐次矩阵结果是:
H =
[[ -0.96577106 -0.16797325 0.1976645 2.27117 ]
[ 0.18166395 0.10595762 0.97763551 -34.3437 ]
[ -0.18516067 0.98008059 -0.07181612 479.336 ]
[ 0. 0. 0. 1. ]]
PreMultiply 表示 M= M * A ,自左乘,表示以当前系变换——绕动系变换
transform = vtk.vtkTransform()
transform.PreMultiply()
transform.Scale(1, 1, 1)
# 以下四行代码乘积方式 : transform = E * T * RZ * RY * RX —— E是单位矩阵,为transform初始值。
transform.Translate(x, y, z)
transform.RotateZ(rz)
transform.RotateY(ry)
transform.RotateX(rx)
transform.Update()
print(transform.GetMatrix())
或者:
PostMultiply 表示 M= A * M ,自右乘,表示以基础系变换——绕定系变换
结果是:transform = T * RZ * RY * RX * E—— E是单位矩阵,为transform初始值
transform = vtk.vtkTransform()
transform.PostMultiply()
transform.RotateX(rx) # transform = RX * transform
transform.RotateY(ry) # transform = RY * transform
transform.RotateZ(rz) # transform = RZ * transform
transform.Translate(x, y, z) # transform = T * transform
print(transform.GetMatrix())
结果一致,均是:
-0.965771 -0.167973 0.197664 2.27117
0.181664 0.105958 0.977636 -34.3437
-0.185161 0.980081 -0.0718161 479.336
0 0 0 1
总结 :
抓住本质:
PreMultiply 动系变换,自身M在左边:M= MA(A可以是旋转或平移);
PostMultiply 定系变换,自身M在右边:M= AM(A可以是旋转或平移)。
每次进行矩阵乘积的顺序和内容,依照自己需求来定,如动系 Z-Y-Z 变换(10,20,30)可以这样实现:
transform.PreMultiply()
transform.Scale(1, 1, 1)
transform.RotateZ(30)
transform.RotateY(20)
transform.RotateZ(10)