Я разместил похожий вопрос с моим кодом на форуме пользователей 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);
}
В приведенном выше примере 3D-модель уже имеет некоторую информацию о цвете, но я пытаюсь наложить файл текстуры поверхмодель.