vtkImageResliceMapper中的VTK相机更新问题

时间:2016-02-18 15:32:39

标签: c++11 vtk

我正在尝试使用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;
}

1 个答案:

答案 0 :(得分:3)

最后我找到了解决方案! (而且我知道很多人都有这个问题,所以我在这里发布答案。)

为了在更改相机参数后正确显示图形,您必须致电:

imageRenderer->ResetCameraClippingRange();