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;