关于 vtkTransform 中 PreMultiply 与 PostMultiply 的正确理解

矩阵乘法的变换顺序是从右往左读的(这一个常识很重要,你得明白这一点,有基本概念)


1. PreMultiply(前乘)

  • 定义:所有后续操作都将在当前变换中已表示的操作之前发生。

  • 数学表示:如果当前变换矩阵是 (M),新变换矩阵是 (T),则结果为:

    Mnew= M * T

  • 读法:你可以理解为“先应用新变换 (T),再应用当前变换 (M)”。


2. PostMultiply(后乘)

  • 定义:所有后续操作都将在当前变换中已表示的操作之后发生。

  • 数学表示:如果当前变换矩阵是 (M),新变换矩阵是 (T),则结果为:

    Mnew = T * M

  • 读法:你可以理解为“先应用当前变换 (M),再应用新变换 (T)”。


3. 示例

假设当前变换矩阵 (M) 是一个平移变换,新变换矩阵 (T) 是一个旋转变换。

  • PreMultiply

    Mnew = M * T

    先旋转,再平移。

  • PostMultiply

    Mnew = T * M

    先平移,再旋转。


example1:

	double translation[] = { 1.0, 3.2, 5.4 };

	// 创建平移变换  
	vtkSmartPointer<vtkTransform> translateTransform = vtkSmartPointer<vtkTransform>::New();
	translateTransform->Translate(translation[0], translation[1], translation[2]);

	double pos[] = {10.0, 30.2, 50.4};
	// 创建旋转变换  
	vtkSmartPointer<vtkTransform> rotateTransform = vtkSmartPointer<vtkTransform>::New();
	rotateTransform->Translate(-pos[0], -pos[1], -pos[2]);
	rotateTransform->RotateX(this->xAxisSpinBox->value()); // 绕X轴旋转
	rotateTransform->RotateY(this->yAxisSpinBox->value()); // 绕Y轴旋转  
	rotateTransform->RotateZ(this->zAxisSpinBox->value()); // 绕Z轴旋转  
	rotateTransform->Translate(pos[0], pos[1], pos[2]);

	// 组合变换:首先平移,然后旋转  
	vtkSmartPointer<vtkTransform> combinedTransform = vtkSmartPointer<vtkTransform>::New();
	combinedTransform->PostMultiply();
	combinedTransform->Concatenate(translateTransform);
	combinedTransform->Concatenate(rotateTransform);

解释combinedTransform :
combinedTransform 默认是PreMultiply,此处设置为PostMultiply,可理解为rotateTransform * translateTransform ,后续添加的变换放在线性乘法的左侧。PostMultiply时,作用顺序从右往左读,所以此例子中的变换:先进行平移,再进行旋转

再看另一种写法:

	// 组合变换:首先平移,然后旋转  
	vtkSmartPointer<vtkTransform> combinedTransform = vtkSmartPointer<vtkTransform>::New();
	combinedTransform->Concatenate(translateTransform);
	combinedTransform->PostMultiply();
	combinedTransform->Concatenate(rotateTransform);

这里还是先平移后旋转,为什么?
默认的时PreMultiply,设置了PostMultiply后,rotateTransform还是被放到了translateTransform的左侧,所以还是先平移,后旋转

解释rotateTransform :
首先,在VTK中,vtkTransform的PostMultiply和PreMultiply方法只会影响该vtkTransform对象本身的变换顺序,而不会影响其他vtkTransform对象的内部变换顺序。
rotateTransform 默认是PreMultiply,不被combinedTransform 影响,所以变换乘法为从左往右平铺的,作用顺序也是从左往右,先把vtkActor移动到世界坐标原点,然后分别进行x y z轴的旋转,再回到原来的位置

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值