gpt4 book ai didi

python - 更改不透明对象渲染顺序(Z 顺序)VTK

转载 作者:太空宇宙 更新时间:2023-11-03 18:30:01 35 4
gpt4 key购买 nike

我正在寻找一种方法来控制多个对象(Xrays/Image3D)共享同一 Z 平面时不透明对象的渲染顺序。我一直在考虑在自定义 OpaquePass 中重新排序 PropArray,但我很好奇其他人是否有更清晰的程序。不幸的是,尽管 Image2D 有 SetDisplayLocationToForeground/BackGround() 方法,但使用 Image2D 并不是一种选择。

与使用自定义 OpaquePass 注入(inject)我们自己的渲染代码相比,他们是否有更干净的方法来解决此问题?该软件的用户将能够通过bringToFront/Back控件更改x射线的渲染顺序。

我已经能够在 WebGL 和 Three.js 中成功测试此行为,从而公开对渲染顺序的控制。例如:enter image description here

注意:我使用的是 Python (2.7.5) 以及 Python Vtk:5.10.1

最佳答案

经过一个月的开发和故障排除,我已经解决了它!

以下是我解决 VTK 中渲染深度问题的方法。

注意:这只会解决相同 z 深度的对象的渲染深度。尽管具有渲染深度,前面或后面的对象仍会正常绘制。

逻辑

我们将在 vtkRenderer 的 viewProps 对象中编辑绘制顺序。所有渲染深度为 null 的 vtkObject 将首先绘制,然后按渲染深度的降序顺序绘制。

示例:
未排序的渲染深度
viewProps = [ NULL, 3, NULL, 1, 2, 4, NULL]

排序渲染深度
viewProps = [ NULL, NULL, NULL, 4, 3, 2, 1]

实现

使用 Get/Set 方法向 vtkObject 添加一个名为“renderDepth”的属性。关于vtkObject创建集renderDepth = NULL;

在 vtkRenderer 中创建一个方法(我将调用我的 RenderDepthSort)。

递归调用 viewProp 对象树,然后使用简单的冒泡排序来交换具有渲染深度的任何项目。 vtkRenderer::RenderDepthSort(vtkPropCollection * propArray){
propArray->InitTraversal();
for(int i=0; i < propArray->GetNumberOfItems(); i++){
vtkProp * prop = propArray->GetNextProp();
if(prop->IsA("vtkAssembly")){
vtkAssembly * ptr = static_cast<vtkAssembly *>(prop);
if(ptr->GetParts()->GetNumberOfItems() > 0)
this->RenderDepthSort(ptr->GetParts());
}
}
bool isUnsorted = true;
while(isUnsorted){
isUnsorted = false;
propArray->InitTraversal();
for(int i=0; i < propArray->GetNumberOfItems()-1; i++){
vtkProp * propA = propArray->GetNextProp();
vtkProp * propB = static_cast<vtkProp *>(propArray->GetItemAsObject(i+1));

  if(propA->GetRenderDepth() == NULL || propB->GetRenderDepth() == NULL){
if(propA->GetRenderDepth() != NULL && propB->GetRenderDepth() == NULL){
propArray->ReplaceItem(i, propB);
propArray->ReplaceItem(i+1, propA);
isUnsorted = true;
}
}else if(propA->GetRenderDepth() < propB->GetRenderDepth()){
propArray->ReplaceItem(i, propB);
propArray->ReplaceItem(i+1, propA);
isUnsorted = true;
}
} //end for loop

} // end while
}//end renderDepthSort Method

如果您像我们一样抽象出了 vtk 实现,并且无法完全控制 vtkViewProps,则可以实现另一种方法来解决渲染深度并将其传播到树上。

void vtkRenderer::InitSolveRenderDepths(vtkPropCollection * propArray){
int depth = NULL;
int numDepths = 0;
propArray->InitTraversal();
for(int i=0; i < propArray->GetNumberOfItems(); i++){
vtkProp * prop = propArray->GetNextProp();
if(prop->IsA("vtkAssembly")){
this->SolveRenderDepths(prop);
int temp = prop->GetRenderDepth();
if(temp != NULL){
if(temp < depth || depth == NULL){
depth = temp;
}
numDepths++;
}
}
}
}

终于
再创建一个名为 UpdateDrawOrder() 的方法
void vtkRenderer::UpdateDrawOrder(){
vtkPropCollection * props = this->GetViewProps();
this->InitSolveRenderDepths(props);
this->RenderDepthSort(props);
}

设置它以在 vtkRenderer::Render() 或 vtkRenderer 对象上调用 UpdateDrawOrder。

Z结束!

关于python - 更改不透明对象渲染顺序(Z 顺序)VTK,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22519003/

35 4 0
文章推荐: c# - 处理大型数据集和内存限制
文章推荐: c# - 在 Visual Studio 中使用 WPF 时,如何使 List 变量出现在 DataBinding UI 中?
文章推荐: c# - 启动时关闭表单