先挂参考链接 https://blog.csdn.net/zgjorson/article/details/9132559
博主大体上是参照上面博客的,另外加了一些自己实现了功能,博客里面贴的有代码。
和参考博客有点儿不一样,上面博客使用的vtk5.2,博主使用的是vtk7(比起原博客注释了两行代码),另外博主添加了相机视角设置,OpenGL绘图也有区别。
直接贴代码好了,我们先从vtkProp继承一个类,然后自己在这个类中实现自己的OpenGL绘图
头文件(里面好多Include是可以不要的,如果你没有用的话,删掉是么问题的)
#pragma once #include <vtkProp.h> #include <vtkCamera.h> #include <vtkType.h> #include <vtkVersionMacros.h> #include <vtkVersion.h> #include <vtkViewport.h> #include <vtkIndent.h> #include <vtkObjectFactory.h> #include <vtkResliceCursor.h> #include <vtkResliceCursorWidget.h> #include <vtkPlane.h> #include <vtkPlaneSource.h> #include <vtkPlaneWidget.h> #include <vtkImagePlaneWidget.h> #include <vtkResliceCursorThickLineRepresentation.h> #include <vtkResliceCursor.h> #include <vtkCommand.h> #include <vtkViewport.h> #include <vtkViewDependentErrorMetric.h> #include <vtkSmartPointer.h> #include <vtkRenderer.h> #include <vtkRendererSource.h> #include <vtkRenderingOpenGLModule.h> #include <vtkRenderWindow.h> #include <vtkWin32OpenGLRenderWindow.h> #include <vtkWin32RenderWindowInteractor.h> #include <vtkPolyVertex.h> #include <vtkUnstructuredGrid.h> #include <vtkDataSetMapper.h> #include <vtkActor.h> #include <vtkProperty.h> #include <vtkLookupTable.h> #include <vtkFloatArray.h> #include <vtkPointData.h> class vtkMydProp : public vtkProp { public: vtkMydProp(); ~vtkMydProp(); //vtkTypeRevisionMacro(vtkMydProp, vtkProp); void PrintSelf(ostream& os, vtkIndent indent); static vtkMydProp* New(); int RenderVolumetricGeometry(vtkViewport *); //vtkCloud * pCloud; vtkCamera * RtCamera; private: vtkMydProp(const vtkMydProp&); // Not implemented. void operator=(const vtkMydProp&); // Not implemented. };
类实现cpp文件
#include "stdafx.h" #include "vtkMydProp.h" vtkStandardNewMacro(vtkMydProp); vtkMydProp::vtkMydProp() { RtCamera = vtkCamera::New(); //RtCamera->SetViewUp(0, 0, -1); // 视角位置 RtCamera->SetPosition(0, 0, -10); // 观察位置 //RtCamera->SetFocalPoint(0, 0, -10); // 设置焦点 //RtCamera->ComputeViewPlaneNormal(); // 自动 } vtkMydProp::~vtkMydProp() { } void vtkMydProp::PrintSelf(ostream& os, vtkIndent indent){ } int vtkMydProp::RenderVolumetricGeometry(vtkViewport *){ glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); glBegin(GL_QUADS); { // Top Side glVertex3f(1.0f, 1.0f, 1.0f); glVertex3f(1.0f, 1.0f, -1.0f); glVertex3f(-1.0f, 1.0f, -1.0f); glVertex3f(-1.0f, 1.0f, 1.0f); // Bottom Side glVertex3f(-1.0f, -1.0f, -1.0f); glVertex3f(1.0f, -1.0f, -1.0f); glVertex3f(1.0f, -1.0f, 1.0f); glVertex3f(-1.0f, -1.0f, 1.0f); // Front Side glVertex3f(1.0f, 1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f); glVertex3f(-1.0f, -1.0f, 1.0f); glVertex3f(1.0f, -1.0f, 1.0f); // Back Side glVertex3f(-1.0f, -1.0f, -1.0f); glVertex3f(-1.0f, 1.0f, -1.0f); glVertex3f(1.0f, 1.0f, -1.0f); glVertex3f(1.0f, -1.0f, -1.0f); // Left Side glVertex3f(-1.0f, -1.0f, -1.0f); glVertex3f(-1.0f, -1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f); // Right Side glVertex3f(1.0f, 1.0f, 1.0f); glVertex3f(1.0f, -1.0f, 1.0f); glVertex3f(1.0f, -1.0f, -1.0f); glVertex3f(1.0f, 1.0f, -1.0f); } glEnd(); return 1; }
添加好上面的类后,我们就可以在vtk绘图窗口调用了
vtkMydProp *mydprop; mydprop = vtkMydProp::New(); m_Renderer->RemoveViewProp(mydprop); m_Renderer->AddViewProp(mydprop); m_Renderer->SetBackground(0, 0, 0); m_Renderer->SetActiveCamera(mydprop->RtCamera); m_RenderWindow->Render(); return;
这样就可以了