C++ 可视化工具包-如何读取和渲染多个对象?
我正在尝试使用vtk读取和呈现一个目录中的多个文件(当它们组合成一个对象时)。但到目前为止,我得到了以下错误:C++ 可视化工具包-如何读取和渲染多个对象?,c++,vtk,C++,Vtk,我正在尝试使用vtk读取和呈现一个目录中的多个文件(当它们组合成一个对象时)。但到目前为止,我得到了以下错误: ERROR: In D:\VTK\VTK-src\IO\XML\vtkXMLReader.cxx, line 283 vtkXMLPolyDataReader (00D1B560): Error opening file D:\3d models\Dist\. ERROR: In D:\VTK\VTK-src\Common\ExecutionModel\vtkExecutive.cx
ERROR: In D:\VTK\VTK-src\IO\XML\vtkXMLReader.cxx, line 283
vtkXMLPolyDataReader (00D1B560): Error opening file D:\3d models\Dist\.
ERROR: In D:\VTK\VTK-src\Common\ExecutionModel\vtkExecutive.cxx, line 782
vtkCompositeDataPipeline (00CC2078): Algorithm
vtkXMLPolyDataReader(00D1B560) returned failure for request: vtkInformation
(00D20688)
Debug: Off
Modified Time: 8721
Reference Count: 1
Registered Events: (none)
Request: REQUEST_DATA
FORWARD_DIRECTION: 0
ALGORITHM_AFTER_FORWARD: 1
FROM_OUTPUT_PORT: 0
到目前为止,我尝试的是只读取一个文件而不是多个文件,但我仍然存在上面提到的错误
以下是我正在编写的代码:
int main(int argc, char *argv[])
{
std::string directoryName = "D:\\3d models\\Dist\\" ;
vtkSmartPointer<vtkDirectory> directory = vtkSmartPointer<vtkDirectory>::New();
int opened = directory->Open(directoryName.c_str());
if(!opened)
{
std::cout << "No es posible abrir este directorio!" << std::endl;
return EXIT_FAILURE;
}
int numberOfFiles = directory->GetNumberOfFiles();
std::cout << "NUmero de archivos: " << numberOfFiles << std::endl;
for (int i = 0; i < numberOfFiles; i++)
{
std::string fileString = directoryName;
////fileString += "/";
fileString += directory->GetFile(i);
std::string ext = vtksys::SystemTools::GetFilenameLastExtension(fileString);
std::cout << fileString.c_str() << " extension: " << ext << std::endl;
std::string name = vtksys::SystemTools::GetFilenameWithoutLastExtension(fileString);
std::cout << "nombre: " << name << std::endl;
const char*cstr = fileString.c_str();
std::cout << cstr << endl;
vtkSmartPointer<vtkXMLPolyDataReader> reader =
vtkSmartPointer<vtkXMLPolyDataReader>::New();
reader->SetFileName(cstr);
reader->Update();
reader->GetOutput();
vtkSmartPointer<vtkTransform> transform =
vtkSmartPointer<vtkTransform>::New();
transform->Scale(.005, .005, .005);
vtkSmartPointer<vtkTransformFilter> transformFilter =
vtkSmartPointer<vtkTransformFilter>::New();
transformFilter->SetInputConnection(reader->GetOutputPort());
transformFilter->SetTransform(transform);
// Visualizar
vtkSmartPointer<vtkPolyDataMapper> mapper =
vtkSmartPointer<vtkPolyDataMapper>::New();
mapper->SetInputConnection(transformFilter->GetOutputPort());
vtkSmartPointer<vtkActor> actor =
vtkSmartPointer<vtkActor>::New();
actor->SetPosition(1.1, .5, .1);
actor->SetMapper(mapper);
vtkSmartPointer<vtkOpenVRRenderer> renderer =
vtkSmartPointer<vtkOpenVRRenderer>::New();
vtkSmartPointer<vtkOpenVRRenderWindow> renderWindow =
vtkSmartPointer<vtkOpenVRRenderWindow>::New();
renderWindow->AddRenderer(renderer);
vtkSmartPointer<vtkOpenVRRenderWindowInteractor> renderWindowInteractor =
vtkSmartPointer<vtkOpenVRRenderWindowInteractor>::New();
renderWindowInteractor->SetRenderWindow(renderWindow);
vtkNew<vtkOpenVRCamera> cam;
renderer->SetActiveCamera(cam);
renderer->AddActor(actor);
renderer->SetBackground(.2, .3, .4);
renderWindow->Render();
renderWindowInteractor->Start();
}
return EXIT_SUCCESS;
}
intmain(intargc,char*argv[])
{
std::string directoryName=“D:\\3d models\\Dist\\”;
vtkSmartPointer目录=vtkSmartPointer::New();
int opened=directory->Open(directoryName.c_str());
如果(!打开)
{
std::cout AddRenderer(渲染器);
vtkSmartPointer渲染器Windows WinterActor=
vtkSmartPointer::New();
RenderWindowWinterActor->SetRenderWindow(renderWindow);
vtcam;
渲染器->设置活动摄影机(cam);
渲染器->AddActor(actor);
渲染器->背景(.2、.3、.4);
renderWindow->Render();
renderWindowInteractor->Start();
}
返回退出成功;
}
我错过了什么?我尝试过使用不同类型的文件,但仍然无法使用此方法读取和渲染任何内容。在文件夹中列出文件时,第一个条目似乎是“.”(这是正常的),因此尝试打开的文件路径是“D:\3d models\Dist\”,对于vtkXMLPolyDataReader来说,它不是有效的文件 您应该只尝试打开使用vtkXMLPolyDataWriter编写的vtk文件。 例如,检查扩展名为“.vtp”(或用于保存包含vtkPolyData模型的文件的任何扩展名) 检查循环第一部分中的扩展:
for (int i = 0; i < numberOfFiles; i++)
{
std::string fileString = directoryName;
////fileString += "/";
fileString += directory->GetFile(i);
std::string ext = vtksys::SystemTools::GetFilenameLastExtension(fileString);
std::cout << fileString.c_str() << " extension: " << ext << std::endl;
// add this line here to skip "." and "..", also fix the extension if not .xml
if (ext.find(".vtp") == std::string::npos) continue;
(...)
for(int i=0;i获取文件(i);
std::string ext=vtksys::SystemTools::GetFilenameLastExtension(fileString);
std::发布一个正常工作的主功能做得很好。请不要忘记发布#include行,这对想要帮助你的人来说要容易得多。嘿,L.C,谢谢你的回复和澄清。我想用这个程序实现的是能够在VR中可视化一个由多个其他小结构组成的结构es(在本例中为人体器官)。在仔细查看我的代码并在线阅读一些信息后,我意识到我确实需要为我读取的每个对象单独创建映射器和渲染器,而不是使用for循环,在读取对象时只替换对象。我还在线阅读了我应该使用的XMLPolyDataReader对于.vpt文件。这是正确的方法吗?关于vtkXMLPolyDataReader,您可能是对的,如果它不工作,请尝试vtkPolyDataReader。我编辑了答案,添加了有关windows、渲染器和角色如何工作的简短概述。
int main(int argc, char *argv[])
{
std::string directoryName = "D:\\3d models\\Dist\\" ;
vtkSmartPointer<vtkOpenVRRenderer> renderer =
vtkSmartPointer<vtkOpenVRRenderer>::New();
vtkSmartPointer<vtkOpenVRRenderWindow> renderWindow =
vtkSmartPointer<vtkOpenVRRenderWindow>::New();
renderWindow->AddRenderer(renderer);
vtkSmartPointer<vtkOpenVRRenderWindowInteractor> renderWindowInteractor =
vtkSmartPointer<vtkOpenVRRenderWindowInteractor>::New();
renderWindowInteractor->SetRenderWindow(renderWindow);
vtkNew<vtkOpenVRCamera> cam;
renderer->SetActiveCamera(cam);
renderer->SetBackground(.2, .3, .4);
vtkSmartPointer<vtkDirectory> directory = vtkSmartPointer<vtkDirectory>::New();
int opened = directory->Open(directoryName.c_str());
if(!opened)
{
std::cout << "No es posible abrir este directorio!" << std::endl;
return EXIT_FAILURE;
}
int numberOfFiles = directory->GetNumberOfFiles();
std::cout << "NUmero de archivos: " << numberOfFiles << std::endl;
for (int i = 0; i < numberOfFiles; i++)
{
std::string fileString = directoryName;
////fileString += "/";
fileString += directory->GetFile(i);
std::string ext = vtksys::SystemTools::GetFilenameLastExtension(fileString);
std::cout << fileString.c_str() << " extension: " << ext << std::endl;
if (ext.find(".vtp") == std::string::npos) continue;
std::string name = vtksys::SystemTools::GetFilenameWithoutLastExtension(fileString);
std::cout << "nombre: " << name << std::endl;
const char*cstr = fileString.c_str();
std::cout << cstr << endl;
vtkSmartPointer<vtkXMLPolyDataReader> reader =
vtkSmartPointer<vtkXMLPolyDataReader>::New();
reader->SetFileName(cstr);
reader->Update();
reader->GetOutput();
vtkSmartPointer<vtkTransform> transform =
vtkSmartPointer<vtkTransform>::New();
transform->Scale(.005, .005, .005);
vtkSmartPointer<vtkTransformFilter> transformFilter =
vtkSmartPointer<vtkTransformFilter>::New();
transformFilter->SetInputConnection(reader->GetOutputPort());
transformFilter->SetTransform(transform);
// Visualizar
vtkSmartPointer<vtkPolyDataMapper> mapper =
vtkSmartPointer<vtkPolyDataMapper>::New();
mapper->SetInputConnection(transformFilter->GetOutputPort());
vtkSmartPointer<vtkActor> actor =
vtkSmartPointer<vtkActor>::New();
actor->SetPosition(1.1, .5, .1);
actor->SetMapper(mapper);
renderer->AddActor(actor);
}
renderWindow->Render();
renderWindowInteractor->Start();
return EXIT_SUCCESS;
}