我正在尝试使用vtkImageResliceMapper显示图像。
问题是我想定位相机,使图像填满视口的整个高度。我找到了一些可以完成这项工作的摄像机参数,但是当我启动应用程序时,直到我在窗口内用鼠标拖动/滚动才会显示图像。我想vtkInteractorStyleTrackballCamera事件正在做一些事情来更新其中一个组件的状态,但我无法弄清楚它是什么。一旦我与鼠标进行交互,图像就会出现,一切都按预期工作。
如果我用简单的imageRenderer-> ResetCamera()替换相机设置,图像将会显示,但不会填满屏幕。
(我已经搜索了几个小时并阅读了此邮件列表中的帖子,甚至在源代码中搜索过但没有任何成功。)
任何帮助将不胜感激,这是代码:
int main(int, char *[])
{
auto imageReader = vtkSmartPointer<vtkPNGReader>::New();
imageReader->SetFileName("image.png");
auto imageResliceMapper = vtkSmartPointer<vtkImageResliceMapper>::New();
imageResliceMapper->SetInputConnection(imageReader->GetOutputPort());
auto imageSlice = vtkSmartPointer<vtkImageSlice>::New();
imageSlice->SetMapper(imageResliceMapper);
auto imageRenderer = vtkSmartPointer<vtkRenderer>::New();
imageRenderer->SetBackground(0, 0, 0); // Background color black
imageRenderer->SetViewport(0.0, 0.0, 1.0, 1.0);
imageRenderer->AddViewProp(imageSlice);
// Set the camera so that the image fills the viewport.
imageRenderer->GetActiveCamera()->SetPosition(729.5, 539.5, 1977.83);
imageRenderer->GetActiveCamera()->SetViewUp(0, 1, 0);
imageRenderer->GetActiveCamera()->SetFocalPoint(729.5, 539.5, 1976.83);
auto renderWindow = vtkSmartPointer<vtkRenderWindow>::New();
renderWindow->SetPosition(500, 200);
renderWindow->SetSize(1024, 768);
renderWindow->AddRenderer(imageRenderer);
auto renderWindowInteractor = vtkSmartPointer<vtkRenderWindowInteractor>::New();
renderWindowInteractor->SetRenderWindow(renderWindow);
auto style = vtkSmartPointer<vtkInteractorStyleTrackballCamera>::New();
style->setCamera(imageRenderer->GetActiveCamera());
renderWindowInteractor->SetInteractorStyle(style);
renderWindowInteractor->Render();
renderWindowInteractor->Initialize();
renderWindow->Render();
renderWindowInteractor->Start();
return EXIT_SUCCESS;
}
答案 0 :(得分:3)
最后我找到了解决方案! (而且我知道很多人都有这个问题,所以我在这里发布答案。)
为了在更改相机参数后正确显示图形,您必须致电:
imageRenderer->ResetCameraClippingRange();