可视化工具包-如何读取和渲染多个对象?

时间:2019-03-26 18:47:15

标签: c++ vtk

我正在尝试使用vtk读取和呈现目录中的多个文件(当它们组合在一起形成一个对象时)。但是到目前为止,我收到以下错误:

set(value)

到目前为止,我一直尝试只读取1个文件而不是多个文件,但是我仍然遇到上面提到的错误。

这是我正在处理的编码:

@get:Bindable // We make getter method bindable for data-binding
val email = MutableLiveData<String>()
    get() { // Try to provide getter method like this
        return field as LiveData<String>
    }
    set(data) { // Try to provide setter method like this
        if(field.value != data.value) // To avoid infinite loop
            field.value = data.value
    }

我想念什么?我尝试使用其他类型的文件,但仍无法使用此方法读取和呈现任何内容。

1 个答案:

答案 0 :(得分:1)

当您列出文件夹中的文件时,它看起来像第一个条目是“。”。 (这是正常的),因此您尝试打开的文件的路径为“ D:\ 3d模型\ 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的地方。渲染器是一个渲染过程:当然,每个演员可以拥有一个渲染过程,但是除非您确定需要,否则就不需要。

这是您的代码,正如我在您的位置所做的那样修改:

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;
}