社区
工具平台和程序库
帖子详情
vtk导出obj文件???vtkOBJExporter
水中鱼_自由
2016-12-15 04:41:16
如题,此类貌似只能导出由面绘制方法进行三维重建的obj文件,体绘制不行!体绘制不行!体绘制不行,会vtkOBJExporter(0000000017DDAEB0):no actors found for writing .obj files,
求论坛大神,如何将体绘制的数据保存为obj文件??
...全文
1184
7
打赏
收藏
vtk导出obj文件???vtkOBJExporter
如题,此类貌似只能导出由面绘制方法进行三维重建的obj文件,体绘制不行!体绘制不行!体绘制不行,会vtkOBJExporter(0000000017DDAEB0):no actors found for writing .obj files, 求论坛大神,如何将体绘制的数据保存为obj文件??
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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();//此处报错 }
使用
VTK
实现PolyData转ImageData,再将ImageData转三角网格输出为
OBJ
文件
。
使用meshlab打开
obj
文件
。
VTK
实现三维模型的
导出
保存,STL、
OBJ
和PLY等格式
基于之前的博客中实现的三维模型,将其
导出
保存为3D格式的
文件
,生成的
文件
可以使用通用的3D浏览器进行查看。附录的代码实现中各变量的命名使用可以查照之前的博客。 1.STL 保存 STL
文件
格式,最早由美国的一家公司提出,是计算机实现三维数据打印的 一种通用格式
文件
。由于该格式
文件
存储方式简单,具有规范的接口格式,是现 阶段快速成型系统中被应用最多的一种标准
文件
格式,可以说市面上对其的应用 是十分广泛的,尤其是在医学影像和文物保护领域。STL
文件
是通过很多小三角 形面片进行堆积来实现三维模型表面的构造的一
VTK
生成球并将其
导出
为
obj
三维格式,可在Meshlab中提取三维点云
VTK
生成指定圆心以及指定半径的三维球,并将其
导出
为
obj
三维模型格式 #include <
vtk
Sph
er
eSource.h> #include <
vtk
PolyData.h> #include <
vtk
SmartPoint
er
.h> #include <
vtk
PolyDataMapp
er
.h> #include <
vtk
Actor...
VTK
笔记-
OBJ
格式-
vtk
OBJ
Read
er
与
vtk
OBJ
Writ
er
OBJ
文件
格式
obj
文件
是3D模型
文件
格式。由Alias|Wavefront公司为3D建模和动画软件"Advanced Visualiz
er
"开发的一种标准,适合用于3D软件模型之间的互导,也可以通过Maya读写。
OBJ
文件
是一种文本
文件
,可以直接用写字板打开进行查看和编辑修改。
文件
特点
OBJ
3.0
文件
格式支持直线(Line)、多边形(Polygon)、表面(Surface)和自由形态曲线(Free-form Curve)。直线和多边形通过它们的点来描述,曲线和表面则根据它们的控制点和依附于曲线类型的
ParaView和
VTK
中场景的导入与
导出
ParaView作为一款优秀的后处理软件,可以说将
VTK
的功能已经发挥的淋漓尽致了,不过最近发现在场景导入
导出
方面二者还是有些差异。 场景的导入(Import)和
导出
(
Export
)是指将渲染场景中的对象,包括光照、相机、Actor、属性、变换矩阵等信息写入
文件
中,或者从外部
文件
中将这些对象导入渲染场景中,一般所导入的
文件
含有多个数据集。
VTK
中一般以关键字Import
er
和
Export
...
工具平台和程序库
24,854
社区成员
27,343
社区内容
发帖
与我相关
我的任务
工具平台和程序库
C/C++ 工具平台和程序库
复制链接
扫一扫
分享
社区描述
C/C++ 工具平台和程序库
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章