vtk: Как заставить работать класс vtkProjectedTexture? - PullRequest
0 голосов
/ 20 ноября 2018

Я разместил похожий вопрос с моим кодом на форуме пользователей vtk.Я не мог получить ответы и, следовательно, размещать здесь.

Я хочу проецировать изображение в качестве текстуры на небольшой регион на большой 3D-модели.У меня есть 3D-модель в качестве актера.Я написал следующую функцию для проверки класса проектируемой текстуры.Я следовал примеру в ссылке https://lorensen.github.io/VTKExamples/site/Cxx/Texture/ProjectedTexture/

Я могу установить желаемый вид камеры в качестве первого шага.Однако тогда я не могу правильно наложить текстуру.Кажется, что текстура растянута и не центрирована в точке фокуса.Кроме того, текстура применяется ко всей модели вместо области фокусировки камеры.Я даже нарисовал усеченный конус, чтобы продемонстрировать правильность параметров камеры, таких как положение, фокус и вектор вверх.Пожалуйста, найдите скриншот с приложенной сценой.Почему это растяжение произошло?Каковы другие параметры, которые должны быть установлены?Я не мог найти много примеров или документации по этому классу.

//viz is my visuzalizer class. It has access to renderwindow, renderer, 
interactor 
//This function sets the camera pose and then applies projected texture to 
the polydata of input actor 
void test_projected_texture(vtkSmartPointer<vtkActor> actor, viz* v, pose& pv_cam) 
{ 
        //I am able to set the camera view using pv_cam variable and the view looks as I expected 
        vtkSmartPointer<vtkCamera> camera = v->renderWindow->GetRenderers()->GetFirstRenderer()->GetActiveCamera(); 
        v->setCameraPose(pv_cam.pp); 
        v->renderWindow->Render(); 

       //using actor 
        vtkPolyData*  polyData = vtkPolyData::SafeDownCast(actor->GetMapper()->GetInput()); 
        vtkSmartPointer<vtkProjectedTexture>  projectedTexture = vtkSmartPointer<vtkProjectedTexture>::New(); 


        double aspect[3]; 
        aspect[1] = 1; 
        aspect[2] = 1; 
        aspect[0] = (1.0/ (vtkMath::RadiansFromDegrees(std::tan(camera->GetViewAngle())))) / 2.0; 

        projectedTexture->SetAspectRatio(aspect); 
        projectedTexture->SetPosition(camera->GetPosition()); 
        projectedTexture->SetFocalPoint(camera->GetFocalPoint()); 
        projectedTexture->SetUp(camera->GetViewUp()[0], camera->GetViewUp()[1], camera->GetViewUp()[2]); 

        projectedTexture->SetInputData( polyData); //this can be the same as the one to project on 
        projectedTexture->Update(); 

        //Map Texture on Surface 

        polyData->GetPointData()->SetTCoords(projectedTexture->GetOutput()->GetPointData()->GetTCoords()); 

        // Read texture file 
        vtkSmartPointer<vtkImageReader2Factory> readerFactory = vtkSmartPointer<vtkImageReader2Factory>::New(); 
        vtkImageReader2 *imageReader = readerFactory->CreateImageReader2("images/0003.jpg"); 
        imageReader->SetFileName("images/0003.jpg"); 
        imageReader->Update(); 

        vtkSmartPointer<vtkTexture> texture = vtkSmartPointer<vtkTexture>::New(); 
        texture->SetInputData(imageReader->GetOutput()); 
        texture->RepeatOff(); 
        actor->SetTexture(texture); 
}

Image and 3D model on which the image is overlayed

В приведенном выше примере 3D-модель уже имеет некоторую информацию о цвете, но я пытаюсь наложить файл текстуры поверхмодель.

...