gpt4 book ai didi

c++ - Visualization Toolkit - 如何读取和渲染多个对象?

转载 作者:行者123 更新时间:2023-11-30 04:49:33 25 4
gpt4 key购买 nike

我正在尝试使用 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.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 的地方。渲染器是一个渲染 channel :当然,您可以为每个 Actor 设置一个渲染 channel ,但除非您确定需要它,否则您不需要。

这是您的代码,按照我在您那里所做的修改:

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++ - Visualization Toolkit - 如何读取和渲染多个对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55364293/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com