使用 2 个渲染器的 VTK 相机剪辑
VTK Camera Clipping with 2 Renderers
当前设置:
- 我有 2 个渲染器、gridRenderer 和 geoRenderer,在 2 个中
渲染层 window:
gridRenderer->SetLayer(0);
geoRenderer->SetLayer(1);
RenderWindow()->SetNumberOfLayers(2);
RenderWindow()->AddRenderer(geoRenderer);
RenderWindow()->AddRenderer(geoRenderer);
- 然后我通过将他们的两个活动相机设置为同一个来连接他们的交互器:
gridRenderer->SetActiveCamera(geoRenderer->GetActiveCamera());
这成功地让我在背景中有一个 网格 ,在前景中有一个 几何体 。
问题:
- 相机的裁剪平面仅聚焦于 geoRenderer,导致更大的 gridRenderer 的 actor 被裁剪掉。
类似问题:
我的问题和这个问题的区别在于我正在更新 gridRender 和 geoRenderer 的角色,有时会完全删除渲染器中的所有角色 (空渲染器可能会弄乱剪裁平面,不渲染任何东西,如果相机选择它作为活动渲染器)。
我的假设是 VTK 混淆了使用哪个渲染器来设置共享相机的剪裁平面。我尝试在两个渲染器上使用 vtkRenderer::ResetCameraClippingRange()
,但无法正确形成剪裁平面
有什么方法可以告诉 VTK 在重置剪辑时要查看哪个渲染器 planes/camera?
更新:
- 我已经开始使用总和手动设置剪裁范围
ComputeVisiblePropBounds
次调用,以及禁用
vtkInteractorStyle::AutoAdjustCameraClippingRange
这样的:
double geoCB[6];
double gridCB[6];
geoRenderer->ComputeVisiblePropBounds(geoCB);
gridRenderer->ComputeVisiblePropBounds(gridCB);
double finalCB[6];
for (int i = 0; i < 6; i++) {
if (i % 2 == 0) {
// Even Index is Min
if (geoCB[i] < gridCB[i]) {
finalCB[i] = geoCB[i];
} else {
finalCB[i] = gridCB[i];
}
} else {
// Odd Index is Max
if (geoCB[i] > gridCB[i]) {
finalCB[i] = geoCB[i];
} else {
finalCB[i] = gridCB[i];
}
}
}
geoRenderer->ResetCameraClippingRange(finalCB);
不幸的是,这仍然无法正常工作...
也许您可以通过以下方式将裁剪范围明确设置为较大的值:
vtkCamera.SetClippingRange(x0,x1)
重要更新:
- 以上代码正确,每次调用即可
在
RenderWindow->Render()
. 之前
- 在创建我自己的
vtkRenderWindow
实现后,我只需要覆盖 Render()
,将上面的代码放入其中,然后通过调用默认值 Render()
完成 ovveride
- 如果您只是将最小裁剪平面设置为一个非常小的值,并将最大裁剪平面设置为一个非常大的值,它可能会起作用,但会破坏深度过滤器,从而完全搞乱整个渲染。
当前设置:
- 我有 2 个渲染器、gridRenderer 和 geoRenderer,在 2 个中 渲染层 window:
gridRenderer->SetLayer(0);
geoRenderer->SetLayer(1);
RenderWindow()->SetNumberOfLayers(2);
RenderWindow()->AddRenderer(geoRenderer);
RenderWindow()->AddRenderer(geoRenderer);
- 然后我通过将他们的两个活动相机设置为同一个来连接他们的交互器:
gridRenderer->SetActiveCamera(geoRenderer->GetActiveCamera());
这成功地让我在背景中有一个 网格 ,在前景中有一个 几何体 。
问题:
- 相机的裁剪平面仅聚焦于 geoRenderer,导致更大的 gridRenderer 的 actor 被裁剪掉。
类似问题:
我的问题和这个问题的区别在于我正在更新 gridRender 和 geoRenderer 的角色,有时会完全删除渲染器中的所有角色 (空渲染器可能会弄乱剪裁平面,不渲染任何东西,如果相机选择它作为活动渲染器)。
我的假设是 VTK 混淆了使用哪个渲染器来设置共享相机的剪裁平面。我尝试在两个渲染器上使用
vtkRenderer::ResetCameraClippingRange()
,但无法正确形成剪裁平面有什么方法可以告诉 VTK 在重置剪辑时要查看哪个渲染器 planes/camera?
更新:
- 我已经开始使用总和手动设置剪裁范围
ComputeVisiblePropBounds
次调用,以及禁用vtkInteractorStyle::AutoAdjustCameraClippingRange
这样的:
double geoCB[6];
double gridCB[6];
geoRenderer->ComputeVisiblePropBounds(geoCB);
gridRenderer->ComputeVisiblePropBounds(gridCB);
double finalCB[6];
for (int i = 0; i < 6; i++) {
if (i % 2 == 0) {
// Even Index is Min
if (geoCB[i] < gridCB[i]) {
finalCB[i] = geoCB[i];
} else {
finalCB[i] = gridCB[i];
}
} else {
// Odd Index is Max
if (geoCB[i] > gridCB[i]) {
finalCB[i] = geoCB[i];
} else {
finalCB[i] = gridCB[i];
}
}
}
geoRenderer->ResetCameraClippingRange(finalCB);
不幸的是,这仍然无法正常工作...
也许您可以通过以下方式将裁剪范围明确设置为较大的值:
vtkCamera.SetClippingRange(x0,x1)
重要更新:
- 以上代码正确,每次调用即可
在
RenderWindow->Render()
. 之前
- 在创建我自己的
vtkRenderWindow
实现后,我只需要覆盖Render()
,将上面的代码放入其中,然后通过调用默认值Render()
完成 ovveride - 如果您只是将最小裁剪平面设置为一个非常小的值,并将最大裁剪平面设置为一个非常大的值,它可能会起作用,但会破坏深度过滤器,从而完全搞乱整个渲染。