首先我们要想的是,我们已经有个窗口了,我们能够对窗口进行放大缩小,保留边框,全屏等一系列操作。那么我们现在想的是,我们要往我们的场景中添加各种各样的物品。然后通过这些物品我们才能够对程序进行各种各样的操作。
这篇文章我们来研究一个效果,我们往场景中添加一个物品,添加好了之后我们对这个物品进行放大,缩小,旋转等各种操作,通过鼠标滚轮。
实现效果
步骤拆分
- 定义材质
- 定义网格
- 混合材质和网格
- 将混合后的材质和网格加入到场景当中去
- 设置窗体渲染器
- 设置窗体对象再将窗体渲染器加入到窗体对象
- 设置窗体交互机制,将监听到的特定平台的鼠标、键盘、时钟事件交给vtkInteractorObserver或者其子类,如vtkInteractorStyle进行处理。vtkInteractorStyle等监听消息并且处理完成旋转、拉伸缩放等操作
- 设置vtkInteractorStyleTrackballCamera为交互场景的相机
- 启动交互场景【不然只能展示二维的图像信息】
代码实现
#include <vtkSmartPointer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderer.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkInteractorStyleTrackballCamera.h>
#include <vtkCylinderSource.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkProperty.h>
#include "vtkAutoInit.h"
VTK_MODULE_INIT(vtkRenderingOpenGL2);
VTK_MODULE_INIT(vtkInteractionStyle);
VTK_MODULE_INIT(vtkRenderingVolumeOpenGL2);
int main()
{
vtkSmartPointer<vtkCylinderSource> cylinder =
vtkSmartPointer<vtkCylinderSource>::New();
// 设置高度
cylinder->SetHeight(3.0);
// 设置半径
cylinder->SetRadius(1.0);
// 设置圆柱体有几个边
cylinder->SetResolution(3.0);
vtkSmartPointer<vtkPolyDataMapper> cylinderMapper =
vtkSmartPointer<vtkPolyDataMapper>::New();
cylinderMapper->SetInputConnection(cylinder->GetOutputPort());
vtkSmartPointer<vtkActor> cylinderActor =
vtkSmartPointer<vtkActor>::New();
cylinderActor->SetMapper(cylinderMapper);
cylinderActor->GetProperty()->SetColor(1.0, 0.0, 0.0);
vtkSmartPointer<vtkRenderer> renderer =
vtkSmartPointer<vtkRenderer>::New();
renderer->AddActor(cylinderActor);
renderer->SetBackground(1.0, 1.0, 1.0);
vtkSmartPointer<vtkRenderWindow> renWin =
vtkSmartPointer<vtkRenderWindow>::New();
renWin->AddRenderer(renderer);
renWin->SetSize(640, 480);
renWin->Render();
renWin->SetWindowName("RenderCylinder");
vtkSmartPointer<vtkRenderWindowInteractor> iren =
vtkSmartPointer<vtkRenderWindowInteractor>::New();
iren->SetRenderWindow(renWin);
vtkSmartPointer<vtkInteractorStyleTrackballCamera> style =
vtkSmartPointer<vtkInteractorStyleTrackballCamera>::New();
iren->SetInteractorStyle(style);
iren->Initialize();
iren->Start();
return EXIT_SUCCESS;
}