可视化工具包 - 如何读取和渲染多个对象?
Visualization Toolkit - How to read and render multiple objects?
我正在尝试使用 vtk 读取和渲染目录中的多个文件(当它们组合成一个对象时)。但到目前为止,我收到以下错误:
ERROR: In D:VTKVTK-srcIOXMLvtkXMLReader.cxx, line 283
vtkXMLPolyDataReader (00D1B560): Error opening file D:3d modelsDist.
ERROR: In D:VTKVTK-srcCommonExecutionModelvtkExecutive.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
到目前为止,我尝试的是只读取 1 个文件而不是多个文件,但我仍然是我上面提到的错误。
这是我正在处理的编码:
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;
}
我错过了什么?我已经尝试过不同类型的文件,但我仍然无法使用此方法读取和渲染任何内容。
当您列出文件夹中的文件时,看起来第一个条目是"."(这是正常的),所以你尝试打开的文件的路径是"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;
(...)
我也怀疑你正在尝试使用vtkXMLPolyDataReader,而你应该使用vtkPolyDataReader(这实际上取决于用于生成文件的编写器)。 vtkXMLPolyDataReader 是 .vtp 文件的标准阅读器。
最后,您将在循环中创建渲染器、渲染窗口和摄像机:这意味着每个对象一个窗口。这很不常见,这是你想要的吗?
长话短说:至少需要一个渲染器和一个窗口来显示一个或多个模型。每个模型由一个Actor表示:窗口是渲染器绘制(一个或多个)Actor的地方。渲染器是一种渲染通道:当然,您可以为每个Actor设置一个渲染通道,但除非您确定需要它,否则您不需要。
这是您的代码,就像我在您那里所做的那样修改:
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;
}
相关文章:
- 如何在C++中从文件中读取/写入多个对象
- 使用对象文件读取三角形数据网格
- 如何从文件中读取两个字符串和数字数组,并将它们存储在对象向量中
- 我可以读取静态对象中的文件.txt吗?C++
- 从对象C++中的文件读取内容时出现分段错误
- 如何从文件中读取指向对象的指针?
- 如何在 C++ 中使用提升属性树从 JSON 文件中读取对象数组
- 从一个文件中读取多个序列化对象
- 读取互斥对象范围之外的volatile变量,而不是std::atomic
- 用rapidjson读取子对象向量
- 从文本文件中读取对象
- 使用 OpengGLES2(角度)从帧缓冲区对象读取
- C++两次从文件保存对象读取多重继承
- 通过 ifstream 对象读取C++中的文件
- 将C 对象读取到随机访问文件中
- 使用 C++ 将对象读取和写入二进制文件
- C++在尝试编写对象读取器时,在尝试从一个向量获取数据时出错
- 为什么这个ifstream无法将平面对象读取到内存中
- 如何在C++中从istream对象读取时检测空行
- C++使用fstream对象读取和写入文本文件时出现问题