VTK003_vtk-交互&属性

VTK基础交互:

      VTK交互使用vtkRenderWindowInteractor,它将负责某个vtkRenderWindow窗口的监听,包括鼠标、键盘、时钟等消息,通过vtk中的Command/Observer设计模式进行处理。vtkRenderWindowInteractor会自动创建一个默认的vtkInteraactorStyle类对象(交互器样式)进行消息的处理,完成用户交互作用于实际的3D模型功能。通常,我们会自己创建一个交互器样式来处理消息,也可以重载已有的样式进行功能扩展。

class vtkMyCallback : public vtkCommand
{
public:
	static vtkMyCallback *New()
	{
		return new vtkMyCallback;
	}
	virtual void Execute(vtkObject *caller, unsigned long, void*) // 强制实现的方法
	{
		vtkRenderer *ren = reinterpret_cast<vtkRenderer*>(caller);
		cout << ren->GetActiveCamera()->GetPosition()[0] << " "
			<< ren->GetActiveCamera()->GetPosition()[1] << " "
			<< ren->GetActiveCamera()->GetPosition()[2] << "\n";
	}
};

// ------------------------------------------main中------------------------------------

	this->renderer = vtkRenderer::New();		// 渲染器
	this->renWin = vtkRenderWindow::New();		// 渲染窗口
	this->renWin->AddRenderer(this->renderer);	// 向渲染窗口添加渲染器

	//this->renWin->SetParentId(hwnd);			// 设置vtkRenderWindow的父窗口,可以使MFC/Win32窗口的HWND
	this->iren = vtkRenderWindowInteractor::New();		// 交互器
	this->iren->SetRenderWindow(this->renWin);			// 将vtkRenderWindow设置到交互器
	this->m_style = vtkInteractorStyleTrackballCamera::New();
	this->iren->SetInteractorStyle(m_style);
 	this->iren->Initialize();

	//Data  
	this->cone = vtkConeSource::New();		// 圆锥数据源
	this->cone->SetHeight(4.0);				// 圆锥高度
	this->cone->SetRadius(2.0);				// 圆锥半径
	this->cone->SetResolution(20);			// 圆锥精度(多边形模拟的圆)

	this->coneMapper = vtkPolyDataMapper::New();	// 几何绘图器(几何原始数据)
	this->coneMapper->SetInputConnection(this->cone->GetOutputPort());		// 获取到刚才的圆锥的几何原始数据
	this->coneActor1 = vtkActor::New();		// 演员对象
	this->coneActor1->SetMapper(this->coneMapper);	// 演员对象使用绘图器(里面装的圆锥数据, 所以是画圆锥)
	this->coneActor2 = vtkActor::New();		// 演员对象
	this->coneActor2->SetMapper(this->coneMapper);	// 演员对象使用绘图器(里面装的圆锥数据, 所以是画圆锥)
	coneActor1->GetProperty()->SetColor(0.2, 0.63, 0.79);	// vtk属性,颜色
	coneActor1->GetProperty()->SetDiffuse(0.7);				// 设置漫反射分量		两者共同可表示材质
	coneActor1->GetProperty()->SetSpecular(0.4);			// 设置镜面反射分量
	coneActor1->GetProperty()->SetSpecularPower(20);		// 设置镜面反射强度
	vtkProperty* coneProperty = vtkProperty::New();		// 属性对象
	coneProperty->SetColor(0.5, 0.0, 0.0);
	coneProperty->SetDiffuse(0.7);
	coneProperty->SetSpecular(0.4);
	coneProperty->SetSpecularPower(20);
	coneActor2->GetProperty()->SetColor(0.0, 0.5, 0.0);
	coneActor2->SetProperty(coneProperty);
	coneActor2->SetOrigin(0, 0, -5);	// 原点设置?旋转中心?
	coneActor2->SetPosition(3.0, 3.0, -3.0);	// 直接设置位置
	vtkTransform* trans = vtkTransform::New();
	trans->Translate(3.0, 3.0, -3.0);		// 在原来位置上再变化的
	trans->RotateY(30);
	//coneActor2->SetUserMatrix(trans->GetMatrix());
	coneActor2->SetUserTransform(trans);	// 两者效果一样
	trans->Delete();


	  
	this->renderer->AddActor(this->coneActor1);		// 渲染器添加这个演员
	this->renderer->AddActor(this->coneActor2);		// 渲染器添加这个演员
	this->renderer->SetBackground(0.1, 0.1, 0.1);	// 渲染器背景色
	this->renderer->SetViewport(0.0, 0.0, 1.0, 1.0);	// 分配窗口比例
	this->renWin->SetSize(800, 600);				// 渲染窗口大小

	vtkMyCallback* mol = vtkMyCallback::New();
	this->renderer->AddObserver(vtkCommand::StartEvent, mol);	// 为渲染器添加观察器(回调函数)
	mol->Delete();
	// 通过实时过去相机位置,不难看出,模型不动相机动,坐标系方向与OpenGL是一样的

	this->renWin->Render();			// 渲染窗口开始渲染
	this->iren->Start();		// 实际就是事件循环了,就不需要在外面添加事件循环了
// 	int i;
// 	for (i = 0; i < 360; ++i)
// 	{
// 		// render the image
// 		renWin->Render();
// 		// rotate the active camera by one degree
// 		(this->renderer)->GetActiveCamera()->Azimuth(1);
// 	}

      上述代码,展示了vtk交互及属性设置,在HelloWorld这篇,我们只使用了vtkRenderWindowInteractor,没有创建自己的交互器样式,在实际操作中,可发现,只要鼠标点击就可以使模型移动(实际上是相机移动),然而,在这篇中,需要鼠标点击并移动才能看到模型移动(相机移动),这是因为,交互器的参数不一样。

vtkRenderWindowInteractor消息响应:

      在没有使用我们自己的交互器样式到窗口交互对象时,vtkRenderWindowInteractor会生成一个默认的交互器,此时,可以响应比较多的消息,使用不同的交互器样式,响应的消息也会不一样,例如,上面程序中,我们使用了vtkInteractorStyleTrackballCamera,此时么就不能响应键盘按键t和按键j,但在默认的样式中,t和j可以设置交互模式,t设置动作敏感型(数遍按下后拖动才移动等消息),j设置位置敏感型(按下鼠标及响应移动等消息)。此外,无论是默认的交互器还是vtkInteractorStyleTrackballCamera交互器,都可以响应鼠标左键旋转,中键移动和放大缩小,右键放大缩小的消息(实际上是相机的移动和旋转,这里为了方便理解)。

      默认交互样式下,响应的消息有如下几种:

      (1)、按键 t、j

            按键t同于设置动作敏感型,j设置位置敏感型,主要体现为鼠标操作移动相机的方式的更改。默认为位置敏感型。

      (2)、按键c、a

            相机和对象之间的切换,c为相机,a为对象,用于改变交互作用对象,作用于相机时,鼠标操作的相机移动旋转等,作用于对象时,鼠标操作3D对象移动旋转缩放等。

      (3)、鼠标左键

            在相机模式下,左键用于旋转相机,旋转点为相机的焦点,对象模式下,用于旋转模型对象,绕世界空间原点旋转。不同敏感型操作,对于这个也是有影响的,位置敏感型表现为与窗口中心距离越远,旋转越快,动作敏感型表现为移动多少,改变多少。

      (4)、鼠标中键

            可以在当前相机方向的垂直平面上移动相机(上下左右移动),滚轮滚动可以在前后方向上移动相机。对象模式下,可做用于模型。

      (5)、鼠标右键

            相机模式可改变相机前后位置,对象模式下改变对象大小。不同敏感模式效果也会不一样。

      (6)、按键3

            可用于激活或者取消立即渲染模式。

      (7)、其他按键

            按键e/q:可以关闭窗口,退出应用程序。

            按键f:移动actor到光标当前位置,设置当前光标所在的位置为焦点,而且会以该点为旋转中心。

             按键p:执行拾取操作,渲染窗口交互器内部有一个vtkPropPicker实例,可实现拾取功能。

            按键r:沿着当前方向重置相机,自动移动相机到合适的位置使所有对象可见。

            按键s:改变所有actor的显示形式为表面模型(与下面按钮w相对应)。

            按键u:调用用于自定义方法(回调),通常弹出窗口提供命令交互功能。

            按键w:改变所有actor显示为线框模式(比较有趣的显示)。

vtk属性:

      vtkActor对象继承与vtkProp,vtkProp除了可设置位置大小等信息外,其内部还包含了一个vtkMapper对象和一个vtkProperty对象,前者存放数据,后者存放属性信息。

      此外,vtkActor最终设置到vtkRender中,用于渲染,一个vtkRender中可以包含多个actor对象,可以一次渲染里面的全部actor,上面代码中就添加了两个不同的actor对象(方位颜色不同)。vtkRender最终也设置到vtkRenderWindow中,一个vtkRenderWindow也可以包含多个vtkRender,即一个渲染窗口可以包含多个渲染器,但是,需要给每个渲染器指定一个范围(SetViewport),上面代码中 this->renderer->SetViewport(0.0, 0.0, 1.0, 1.0);就是分配整个渲染窗口给这个渲染器。

      vtkActor可通过GetProperty来获取属性信息也可通过SetProperty来设置属性信息改变一个Actor的属性通常可以像上面代码演示的那样,直接获取属性对象再对其设置某些属性,还可以创建一个属性对象,最后将其设置到Actor中去

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值