vtk导出obj文件???vtkOBJExporter

水中鱼_自由 2016-12-15 04:41:16
如题,此类貌似只能导出由面绘制方法进行三维重建的obj文件,体绘制不行!体绘制不行!体绘制不行,会vtkOBJExporter(0000000017DDAEB0):no actors found for writing .obj files,

求论坛大神,如何将体绘制的数据保存为obj文件??
...全文
1184 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
日月与卿 2020-05-13
  • 打赏
  • 举报
回复
你好,这个问题是怎么解决的?
我是VTK初学者,最近也遇到楼主同样的问题。“重建完的体数据,可通过什么方法导出吗?导出格式是什么?”。

望回复,谢谢!
赵4老师 2016-12-16
  • 打赏
  • 举报
回复
使用各大搜索引擎搜相关关键字。
水中鱼_自由 2016-12-15
  • 打赏
  • 举报
回复
求助,有人解决了这个问题没有??????????????
赵4老师 2016-12-15
  • 打赏
  • 举报
回复
还是求助专业软件转换比较靠谱,我觉得。 比如AutoCAD、Maya、…… 预祝你成功!
水中鱼_自由 2016-12-15
  • 打赏
  • 举报
回复
引用 2 楼 zhao4zhong1 的回复:
有没有将体绘制对象转换为面绘制对象的功能用用?
参考3DS Max中文版联机帮助?

赵老师,vtk中暂时不支持这个功能,他们是两个不同的继承体系,二者没有办法进行转换。
我的思路是根据体绘制的不透明度传递函数,自己编写一个传递函数,对每个体素进行转换,然后用面绘制进行处理,结果处理出来的效果完全不对,代码如下:
void WriteTest()
{
ReadDicomSeries();
int dims[3];
image->GetDimensions(dims); //这个循环处理每个体素,传递函数来源如下注释,根据分段函数写出传递函数表达式
/*volumeScalarOpacity->AddPoint(-1024, 0.0);//设置不透明度传递函数
volumeScalarOpacity->AddPoint(1269, 0.17);
volumeScalarOpacity->AddPoint(2365, 0.46);
volumeScalarOpacity->AddPoint(3500, 0.0);*/
for (int k = 0; k < dims[2]; k++) //图像数量
{
for (int j = 0; j < dims[1]; j++) //图像高度
{
for (int i = 0; i < dims[0]; i++) //图像宽度
{
unsigned short * pixel = (unsigned short *)(image->GetScalarPointer(i, j, k)); //获取三维空间中的像素,即体素
if (*pixel <= 1269)
{
*pixel = 13488 * (*pixel) + 1024;
}
else if (*pixel <= 2365)
{
*pixel = 3779 * (*pixel) + 626;
}
else if (*pixel <= 3500)
{
*pixel = (-6676) * (*pixel) + 706;
}

}
}

}

vtkSmartPointer< vtkMarchingCubes > boneExtractor =
vtkSmartPointer< vtkMarchingCubes >::New();
//boneExtractor->SetInputConnection(reader->GetOutputPort());
boneExtractor->SetInputData((vtkImageData *)image);
boneExtractor->SetValue(0, 300); //设置提取的等值信息
boneExtractor->Update();

//剔除旧的或废除的数据单元,提高绘制速度(可略去这一步)
vtkSmartPointer< vtkStripper > boneStripper =
vtkSmartPointer< vtkStripper >::New(); //三角带连接
boneStripper->SetInputConnection(boneExtractor->GetOutputPort());
boneStripper->Update();

//建立映射
vtkSmartPointer< vtkPolyDataMapper > boneMapper =
vtkSmartPointer< vtkPolyDataMapper >::New();
boneMapper->SetInputData(boneStripper->GetOutput());

//建立角色
vtkSmartPointer< vtkActor > bone =
vtkSmartPointer< vtkActor >::New();
bone->SetMapper(boneMapper);

bone->GetProperty()->SetDiffuseColor(.1, .94, .52); // 设置皮肤颜色的属性
bone->GetProperty()->SetSpecular(.3); //设置反射率
bone->GetProperty()->SetSpecularPower(20); //设置反射光强度

//定义绘制器
vtkSmartPointer< vtkRenderer > aRenderer =
vtkSmartPointer< vtkRenderer >::New();
//定义绘制窗口
vtkSmartPointer< vtkRenderWindow > renWin =
vtkSmartPointer< vtkRenderWindow >::New();
renWin->AddRenderer(aRenderer);
//定义窗口交互器
vtkSmartPointer< vtkRenderWindowInteractor > iren =
vtkSmartPointer< vtkRenderWindowInteractor >::New();
iren->SetRenderWindow(renWin);

//创建一个camera
vtkSmartPointer< vtkCamera > aCamera =
vtkSmartPointer< vtkCamera >::New();
aCamera->SetViewUp(0, 0, -1);
aCamera->SetPosition(0, 1, 0);
aCamera->SetFocalPoint(0, 0, 0);

aRenderer->AddActor(bone);
aRenderer->SetActiveCamera(aCamera);
aRenderer->ResetCamera();
aCamera->Dolly(1.5);
aRenderer->SetBackground(0, 0, 0);
aRenderer->ResetCameraClippingRange();
iren->Initialize();
iren->Start();
}
这个问题该怎么破
赵4老师 2016-12-15
  • 打赏
  • 举报
回复
有没有将体绘制对象转换为面绘制对象的功能用用? 参考3DS Max中文版联机帮助?
水中鱼_自由 2016-12-15
  • 打赏
  • 举报
回复
代码如下 void WriteOBJ() { ReadDicomSeries();//将dicom序列图像的数据读到vtkimagedata中 vtkSmartPointer<vtkRenderWindow> renWin3D = vtkSmartPointer<vtkRenderWindow>::New(); vtkSmartPointer<vtkColorTransferFunction>volumeColor = vtkSmartPointer<vtkColorTransferFunction>::New();//设置actor颜色的类,颜色传递函数 vtkSmartPointer<vtkPiecewiseFunction> volumeScalarOpacity = vtkSmartPointer<vtkPiecewiseFunction>::New();//设置不透明度传递函数 vtkSmartPointer<vtkPiecewiseFunction> gradientTransferFunction = vtkSmartPointer<vtkPiecewiseFunction>::New();//设置梯度传递函数 vtkSmartPointer<vtkRenderer> ren3D = vtkSmartPointer<vtkRenderer>::New(); vtkSmartPointer<vtkRenderWindowInteractor> iren3D = vtkSmartPointer<vtkRenderWindowInteractor>::New(); volumeColor->AddRGBPoint(0, 0, 0, 0);//此处颜色设置为灰度值,设置颜色传递函数 volumeColor->AddRGBPoint(2150.0, 1.0, 0.0, 0.0); volumeColor->AddRGBPoint(2800.0, 0.5, 0.77, 0.6); volumeColor->AddRGBPoint(4095.0, 0.5, 0.9, 0.9); volumeScalarOpacity->AddPoint(-1024, 0.0);//设置不透明度传递函数 volumeScalarOpacity->AddPoint(1269, 0.17); volumeScalarOpacity->AddPoint(2365, 0.46); volumeScalarOpacity->AddPoint(3500, 0.0); volumeScalarOpacity->AddSegment(-1024, 0, 1269, 0.17); volumeScalarOpacity->AddSegment(1269, 0.17, 2365, 0.46); volumeScalarOpacity->AddSegment(2365, 0.46, 3500, 0); gradientTransferFunction->AddPoint(0, 2.0); //设置梯度传递函数 gradientTransferFunction->AddPoint(500, 2.0); gradientTransferFunction->AddSegment(600, 0.73, 900, 0.9); gradientTransferFunction->AddPoint(1300, 0.1); vtkSmartPointer<vtkVolumeProperty> volumeProperty = vtkSmartPointer<vtkVolumeProperty>::New();//定义并设置相关体属性 volumeProperty->SetColor(volumeColor); //设置颜色传递函数 volumeProperty->SetScalarOpacity(volumeScalarOpacity); //设置不透明度传递函数 volumeProperty->SetGradientOpacity(gradientTransferFunction); // 设置梯度传递函数 vtkSmartPointer<vtkVolumeRayCastCompositeFunction> compositeRaycastFunction = vtkSmartPointer<vtkVolumeRayCastCompositeFunction>::New();//定义光线投射方法为合成体绘制方法 vtkSmartPointer<vtkVolumeRayCastMapper> volumeMapper = vtkSmartPointer<vtkVolumeRayCastMapper>::New();//载入体绘制方法 volumeMapper->SetVolumeRayCastFunction(compositeRaycastFunction); volumeMapper->SetInputData((vtkImageData *)image);//读取,输入数据 volumeMapper->SetBlendModeToComposite(); vtkSmartPointer<vtkVolume> volume = vtkSmartPointer<vtkVolume>::New();//体数据实例,类似于actor volume->SetMapper(volumeMapper); volume->SetProperty(volumeProperty);//设置体属性 vtkSmartPointer<vtkRenderer> aRender = vtkSmartPointer<vtkRenderer>::New(); //设置绘制类 vtkSmartPointer<vtkRenderWindow> renWin = vtkSmartPointer<vtkRenderWindow>::New();//设置绘制窗口 renWin->AddRenderer(aRender); //装载绘制类 vtkSmartPointer<vtkRenderWindowInteractor> iRen = vtkSmartPointer<vtkRenderWindowInteractor>::New();//设置绘制窗口的交互 iRen->SetRenderWindow(renWin); //装载绘制窗口 aRender->AddVolume(volume); //将Volume装载到绘制类中 aRender->SetBackground(0.2, 0.3, 0.4); renWin->SetSize(500, 500); //设置背景颜色和绘制窗口大小 renWin->Render(); //窗口进行绘制 iRen->Initialize(); iRen->Start(); //初始化并进行交互绘制 vtkSmartPointer<vtkOBJExporter> porter = vtkSmartPointer<vtkOBJExporter>::New();//导出为obj文件, porter->SetFilePrefix("E:\\1"); porter->SetRenderWindow(renWin); porter->Write();//此处报错 }

24,854

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧