VTK面绘制
vtk吧
全部回复
仅看楼主
level 1
#include "vtkRenderer.h"
#include "vtkRenderWindow.h"
#include "vtkRenderWindowInteractor.h"
#include "vtkDICOMImageReader.h"
#include "vtkPolyDataMapper.h"
#include "vtkActor.h"
#include "vtkOutlineFilter.h"
#include "vtkCamera.h"
#include "vtkProperty.h"
#include "vtkPolyDataNormals.h"
#include "vtkContourFilter.h"
#include "vtkVolume16Reader.h"
#include "vtkImageCast.h"
#include "vtkImageReader.h"
#include "vtkBMPReader.h"
#include "vtkMarchingCubes.h"
#include "vtkStripper.h"
void main() //////////////////面绘////////////////
{
// Create the renderer, the render window, and the interactor. The renderer
vtkSmartPointer<vtkRenderer> aRenderer =
vtkSmartPointer<vtkRenderer>::New();
vtkSmartPointer<vtkRenderWindow> renWin =
vtkSmartPointer<vtkRenderWindow>::New();
renWin->AddRenderer(aRenderer);
vtkSmartPointer<vtkRenderWindowInteractor> iren =
vtkSmartPointer<vtkRenderWindowInteractor>::New();
iren->SetRenderWindow(renWin);
vtkSmartPointer<vtkImageReader> v16 =
vtkSmartPointer<vtkImageReader>::New();
v16->SetFileName("1.raw");
v16->SetFileDimensionality(3);//维数
v16->SetDataScalarType(VTK_UNSIGNED_CHAR) ;//输入数据像素类型
v16->SetDataExtent(0,511,0,511,0,511);//整体输出图像范围
//对读取数据类型匹配
vtkImageCast *readerImageCast = vtkImageCast::New();
readerImageCast->SetInputDataObject((vtkDataObject *)v16->GetOutput());
readerImageCast->SetOutputScalarTypeToUnsignedShort();
vtkMarchingCubes *skinExtractor = vtkMarchingCubes::New();//建立一个Marching Cubes 算法的对象取出等值面的三角面片
skinExtractor->SetInputDataObject((vtkDataObject *)readerImageCast->GetOutput());//获得所读取的CT 数据
skinExtractor->SetValue(0, 500);//提取出等值线值为500 的皮肤
vtkStripper *skinNormals = vtkStripper::New();//建立三角带对象
skinNormals->SetInputData(skinExtractor->GetOutput());//将生成的三角片连接成三角带
vtkPolyDataMapper *skinMapper = vtkPolyDataMapper::New();//建立一个数据映射对象
skinMapper->SetInputData(skinNormals->GetOutput());//将三角带映射为几何数据
/*
//vtkMarchingContourFilter
//SetValue和GenerateValues均为设置等值线值的函数首先调用GenerateValues(3, 100, 300)产生3条等值线,分别为100、200、300;然后调用SetValue(0, 125),则最终效果为共有3条等值线,分别为125、200、300;如果改为调用SetValue(3, 400),则最终效果为共有4条等值线,分别为100、200、300、400.SetValue一般用于覆盖某一条已经存在的等值线,或者增加一条等值线;GenerateValues一般重新设置等值线的条数。
vtkContourFilter *skinExtractor = vtkContourFilter::New(); //建立一个Contour Filter算法的对象提取多个等值面
skinExtractor->SetInputConnection(readerImageCast->GetOutputPort()); //获得所读取的CT 数据
skinExtractor->GenerateValues(3, 100, 300);//GenerateValues对应n条等值线的值
skinExtractor->SetValue(3, 500); //SetValue设置一条等值线值
vtkPolyDataNormals *skinNormals = vtkPolyDataNormals::New(); //曲面法向量
skinNormals->SetInputConnection(skinExtractor->GetOutputPort());
skinNormals->SetFeatureAngle(80.0); //);//设定一个阈值 确定的边缘
vtkPolyDataMapper *skinMapper = vtkPolyDataMapper::New(); //建立一个数据映射对象
skinMapper->SetInputConnection(skinNormals->GetOutputPort());
skinMapper->ScalarVisibilityOff(); //断开标志(是否上色)
*/
vtkActor *skin = vtkActor::New(); //建立一个代表皮肤的演员
skin->SetMapper(skinMapper); //获得皮肤几何数据的属性
skin->GetProperty()->SetDiffuseColor(1, .19, .15); //设置皮肤颜色的属性
skin->GetProperty()->SetSpecular(.3); //设置反射率
skin->GetProperty()->SetSpecularPower(20); //设置反射光强度
// An outline provides context around the data.
vtkOutlineFilter *outlineData = vtkOutlineFilter::New(); //轮廓线设置
outlineData->SetInputConnection(v16->GetOutputPort());
vtkPolyDataMapper *mapOutline = vtkPolyDataMapper::New();
mapOutline->SetInputConnection(outlineData->GetOutputPort());
vtkActor *outline = vtkActor::New();
outline->SetMapper(mapOutline);
outline->GetProperty()->SetColor(0, 0, 0);
vtkCamera *aCamera = vtkCamera::New(); //定义摄像机
aCamera->SetViewUp(0, 0, -1); //取得摄像机方向
aCamera->SetPosition(0, 1, 0); //光源位置
aCamera->SetFocalPoint(0, 0, 0); //取焦点坐标
aCamera->ComputeViewPlaneNormal();
aRenderer->AddActor(outline); //添加角色
aRenderer->AddActor(skin);
aRenderer->SetActiveCamera(aCamera);
aRenderer->ResetCamera();
aCamera->Dolly(1.5); //大于1向摄像机焦点移动 小于1则向远离焦点的方向移动
aRenderer->SetBackground(1, 1, 1);
renWin->SetSize(640, 480);
// Note that when camera movement occurs (as it does in the Dolly()
// method), the clipping planes often need adjusting. Clipping planes
// consist of two planes: near and far along the view direction. The
// near plane clips out objects in front of the plane; the far plane
// clips out objects behind the plane. This way only what is drawn
// between the planes is actually rendered.
aRenderer->ResetCameraClippingRange(); //裁剪
// Initialize the event loop and then start it.
iren->Initialize();
iren->Start();
// It is important to delete all objects created previously to prevent
v16->Delete();
skinExtractor->Delete();
skinNormals->Delete();
skinMapper->Delete();
skin->Delete();
outlineData->Delete();
mapOutline->Delete();
outline->Delete();
aCamera->Delete();
iren->Delete();
renWin->Delete();
aRenderer->Delete();
}
有没有大神,帮忙看下,这个代码是我用来对三维的raw数据进行展示的,我的1.raw是经过三维重建之后保存的数据,现在出错提示:
ERROR: In F:\VTK\VTK-7.0.0\IO\Image\vtkImageReader2.cxx, line 592
vtkImageReader (0000000000556A40): Initialize: Could not open file 1.raw
2017年05月04日 13点05分 1
1