一个3D ROI控件,支持修改大小、XYZ轴单独平移和XYZ轴同时平移、rx ry rz单独绕自身旋转。效果如下
20250619_3D_ROI
实现原理:通过添加圆圈、小球、坐标轴等小挂件实现旋转、平移等不同功能。
MoveF0~MoveF5是六个面单独平移函数,Translating是整体平移,Scaling和Rotating分别是放缩和旋转。
旋转无论哪个轴都是一样,都是计算rx ry rz向量,单独旋转rx时,ry rz置0就行,vpn就是旋转向量。
e[0]e[1]代表当前鼠标点坐标。
if (this->InteractionState == rvsVTKCubeSkeletonRepresentation::MoveF0)
this->MoveMinusXFace(prevPickPoint, pickPoint);
else if (this->InteractionState == rvsVTKCubeSkeletonRepresentation::MoveF1)
this->MovePlusXFace(prevPickPoint, pickPoint);
else if (this->InteractionState == rvsVTKCubeSkeletonRepresentation::MoveF4)
this->MoveMinusZFace(prevPickPoint, pickPoint);
else if (this->InteractionState == rvsVTKCubeSkeletonRepresentation::MoveF5)
this->MovePlusZFace(prevPickPoint, pickPoint);
else if (this->InteractionState == rvsVTKCubeSkeletonRepresentation::MoveF2)
this->MoveMinusYFace(prevPickPoint, pickPoint);
else if (this->InteractionState == rvsVTKCubeSkeletonRepresentation::MoveF3)
this->MovePlusYFace(prevPickPoint, pickPoint);
else if (this->InteractionState == rvsVTKCubeSkeletonRepresentation::Translating)
this->Translate(prevPickPoint, pickPoint);
else if (this->InteractionState == rvsVTKCubeSkeletonRepresentation::Scaling)
this->Scale(prevPickPoint, pickPoint, static_cast<int>(e[0]), static_cast<int>(e[1]));
else if (this->InteractionState == rvsVTKCubeSkeletonRepresentation::Rotating)
this->Rotate(static_cast<int>(e[0]), static_cast<int>(e[1]), prevPickPoint, pickPoint, vpn);