VTK+QT+VS学习笔记---vtkrenderer

1.从文件夹中选择三维模型并加载,设置摄像机的焦点位置,朝向,深度以及状态

void QtWidgetsApplication::loadstlmodel(QString str)
{
	// 加载STL模型
	vtkSmartPointer<vtkSTLReader> reader =vtkSmartPointer<vtkSTLReader>::New();
	//模型文件
	reader->SetFileName(str.toUtf8().constData());
	//刷新
	reader->Update();

	
	// 创建渲染器、窗口和相互动作
	vtkSmartPointer<vtkRenderer> renderer =vtkSmartPointer<vtkRenderer>::New();
	
	vtkSmartPointer<vtkRenderWindow> renderWindow =vtkSmartPointer<vtkRenderWindow>::New();
	//设置背景
	renderer->SetBackground(0.2, 0.2, 0.2);
	
	renderWindow->AddRenderer(renderer);
	
	//设置窗口大小
	renderWindow->SetSize(960, 800);
	vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor =vtkSmartPointer<vtkRenderWindowInteractor>::New();
	//获取模型中心点
	vtkSmartPointer<vtkPolyData> polyData = reader->GetOutput();
	vtkSmartPointer<vtkCenterOfMass> centerOfMassFilter = vtkSmartPointer<vtkCenterOfMass>::New();
	centerOfMassFilter->SetInputData(polyData);
	centerOfMassFilter->SetUseScalarsAsWeights(false);
	centerOfMassFilter->Update();
	double center[3];
	centerOfMassFilter->GetCenter(center);
	double centerX = center[0];
	double centerY = center[1];
	double centerZ = center[2];

	//设置相机视距
	renderer->GetActiveCamera()->SetClippingRange(1, 10000);
	//朝向
	renderer->GetActiveCamera()->SetViewUp(1, 0, 0);
	//焦点坐标
	renderer->GetActiveCamera()->SetFocalPoint(centerX, centerY, centerZ);
	
	setvtkRenderer(renderer);
	setvtkRenderWindowInteractor(renderWindowInteractor);
	//摄像机状态
	vtkSmartPointer<VTKInteractorStyle> style =
		vtkSmartPointer<VTKInteractorStyle>::New();
	renderWindowInteractor->SetInteractorStyle(style);
	
	//设置渲染窗口
	renderWindowInteractor->SetRenderWindow(renderWindow);
	// 创建一个映射器并将其应用于一个actor
	vtkSmartPointer<vtkPolyDataMapper> mapper =vtkSmartPointer<vtkPolyDataMapper>::New();
	mapper->SetInputConnection(reader->GetOutputPort());
	vtkSmartPointer<vtkActor> actor =vtkSmartPointer<vtkActor>::New();
	actor->SetMapper(mapper);
	actor->GetProperty()->SetColor(1, 0, 0); // 设置颜色为红色
	renderer->AddActor(actor);
	renderer->SetBackground(0.2, 0.3, 0.4); // 设置背景颜色
	
	// 渲染
	renderWindow->Render();
	renderWindowInteractor->Start();
	//vtkCamera
}

2.调用的类以及含义

2.1 vtkRenderer类

在VTK中,渲染(Rendering)是将数据和可视化效果显示在屏幕上的过程。渲染是VTK可视化应用程序的最后一步,它将数据由抽象的数学表示转换为具体的图像或图形表示,呈现给用户观看。渲染过程包括以下主要步骤:

创建渲染器(Renderer): 首先,需要创建一个或多个渲染器。渲染器是VTK中的一个重要组件,它类似于一个绘图板或画布,用于放置演员(Actor)和渲染视图。可以通过vtkRenderer类创建渲染器对象。

添加演员(Actor)到渲染器: 将之前创建的演员添加到渲染器中。演员是可视化对象的表示,通过vtkActor类来创建。渲染器负责管理和显示演员。

创建渲染窗口(RenderWindow): 创建一个渲染窗口对象,通过vtkRenderWindow类来创建。渲染窗口是一个抽象的视口,用于呈现渲染器的内容。

创建交互器(Interactor): 创建一个交互器对象,通过vtkRenderWindowInteractor类来创建。交互器负责接收用户的交互事件,如鼠标点击、键盘输入等。

将渲染器添加到渲染窗口中: 将之前创建的渲染器添加到渲染窗口中,通过vtkRenderWindow的AddRenderer()方法实现。

将交互器与渲染窗口关联: 将交互器与渲染窗口关联,通过SetRenderWindow()方法将渲染窗口设置给交互器。

启动交互器循环: 最后,启动交互器的循环,通过Start()方法开始渲染并等待用户的交互操作。用户可以通过鼠标和键盘与渲染结果进行交互。

在VTK中,渲染器和演员是可视化的核心组件,渲染器负责管理和显示演员的内容。多个渲染器可以用于创建复杂的可视化场景,例如多视图显示和交互式应用。交互器则负责将用户的交互操作传递给渲染器和演员,实现交互式的可视化体验。通过合理配置渲染器和交互器,可以实现各种类型的VTK可视化应用程序。
参考文献
成员函数:

static vtkRenderer* New();//创建一个渲染器
//在渲染器中添加/删除不同类型的模块
 void AddActor(vtkProp* p);
 void AddVolume(vtkProp* p);
 void RemoveActor(vtkProp* p);
 void RemoveVolume(vtkProp* p);
 /**
   * 在灯光列表中增加一个灯光
   */
  void AddLight(vtkLight*);

  /**
   * 在灯光列表中删除一个灯光
   */
  void RemoveLight(vtkLight*);

  /**
   * 移除灯光列表中所有的灯光
   */
  void RemoveAllLights();

  /**
   * 返回光线的聚集点
   */
  vtkLightCollection* GetLights();

  /**
   * 设置光线聚集点
   * We cannot name it SetLights because of TestSetGet
   * \pre lights_exist: lights!=0
   * \post lights_set: lights==this->GetLights()
   */
  void SetLightCollection(vtkLightCollection* lights);

  /**
   * 给渲染器增加一个灯光
   */
  void CreateLight();

  /**
   * 为用户创建一个适合这种类型渲染器的新光源。
   * For example, a vtkMesaRenderer should create a vtkMesaLight
   * in this function.   The default is to just call vtkLight::New.
   */
  virtual vtkLight* MakeLight();

/**
   * Ask the lights in the scene that are not in world space
   * (for instance, Headlights or CameraLights that are attached to the
   * camera) to update their geometry to match the active camera.
   */
  virtual vtkTypeBool UpdateLightsGeometryToFollowCamera();

  /**
   * Return the collection of volumes.
   */
  vtkVolumeCollection* GetVolumes();

  /**
   * 返回渲染器中的角色
   */
  vtkActorCollection* GetActors();

  /**
   * 在这个渲染器中给用户指定摄像机
   */
  void SetActiveCamera(vtkCamera*);

  /**
   * 获取当前摄像机. If there is not camera assigned to the
   * renderer already, a new one is created automatically.
   * This does *not* reset the camera.
   */
  vtkCamera* GetActiveCamera();

  /**
   * 创建一个新的摄像机
   * For example, a vtkMesaRenderer should create a vtkMesaCamera
   * in this function.   The default is to just call vtkCamera::New.
   */
  virtual vtkCamera* MakeCamera();
  /**
   * 向筛选器列表增加一个筛选器
   */
  void AddCuller(vtkCuller*);

  /**
   * 从筛选器列表删除一个筛选器
   */
  void RemoveCuller(vtkCuller*);

  /**
   * 返回筛选器集合
   */
  vtkCullerCollection* GetCullers();
/**
   * 将世界坐标转换成试图坐标
   */
  void WorldToView() override;
  • 6
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值