一、需求
为满足用户动态观测三维模型,故增加三维物体自旋转的功能。
二、实现
通过重写vtkCommand并增加回调函数。
class vtkTimerCallback : public vtkCommand
{
public:
static vtkTimerCallback* New()
{
vtkTimerCallback* callback = new vtkTimerCallback;
return callback;
}
virtual void Execute(vtkObject* caller, unsigned long eventId, void* callData)
{
for (int i = 0; i < actorArray.size(); i++)
{
actorArray.at(i)->SetUserTransform(transform);
// 设置旋转中心
double angle = 0.005;
transform->Translate(center[0], center[1], center[2]);
// 执行旋转操作
transform->RotateWXYZ(angle, 0, 1, 0);
// 恢复到原始坐标系
transform->Translate(-center[0], -center[1], -center[2]);
}
widget->GetRenderWindow()->Render();
}
void CreateTransform()
{
transform = vtkSmartPointer<vtkTransform>::New();
}
std::vector<vtkSmartPointer<vtkActor>> actorArray;
QVTKOpenGLNativeWidget* widget;
double *center;
//停止DestroyTimer 启动CreateRepeatingTimer
private:
vtkSmartPointer<vtkTransform> transform;
};
三、调用
class My3DWidget : public QWidget
{
public:
My3DWidget(QWidget *parent = nullptr);
~My3DWidget(){};
private:
QVTKOpenGLNativeWidget * VTKWidget;
vtkSmartPointer<vtkRenderer> Renderer;
vtkSmartPointer<vtkTimerCallback> _Callback;
vtkSmartPointer<vtkRenderWindowInteractor> _Interactor;
vtkSmartPointer<vtkGenericOpenGLRenderWindow> renderWindow;
}
My3DWidget::My3DWidget(QWidget *parent)
: QWidget(parent)
,VTKWidget(NULL)
{
VTKWidget = new QVTKOpenGLNativeWidget();
Renderer = vtkSmartPointer<vtkRenderer>::New();
vtkSmartPointer<vtkActor> pointsActor = vtkSmartPointer<vtkActor> ::New();
double background[3]{85/255.0,85/255.0,85/255.0};
Renderer->SetBackground(background);
renderWindow = vtkSmartPointer<vtkGenericOpenGLRenderWindow>::New();
renderWindow->AddRenderer(Renderer);
renderWindow->SetGlobalWarningDisplay(0); //不显示vtkOutputWindow窗体
VTKWidget->SetRenderWindow(renderWindow);
_Callback = vtkSmartPointer<vtkTimerCallback>::New();
_Callback->CreateTransform();
_Callback->widget = VTKWidget;
_Interactor = renderWindow->GetInteractor();
_Interactor->AddObserver(vtkCommand::TimerEvent, _Callback);
_Interactor->CreateRepeatingTimer(100); //启动并设置旋转速度
_Interactor->DestroyTimer(); //停止旋转
}