VTK实现物体本身旋转

一、需求

       为满足用户动态观测三维模型,故增加三维物体自旋转的功能。

二、实现

        通过重写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();  //停止旋转
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值