VTK抽象选择器,用于不同不透明度值的多个参与者



我是VTK的新手。我想知道VTK抽象选择器对于不同不透明度值的多个参与者的行为。让我们考虑两个演员,其中一个在另一个内部。当我将外表面的不透明度设置为0.3时保持内部演员的不透明度1.0.由于外部演员是半透明的,我可以在两个演员的重叠区域看到内部演员。当我在该区域中执行拾取时,得到的坐标来自内表面本身,当我拾取重叠区域以外的某个点时,我得到的是外表面坐标。如何根据不透明度值执行拾取操作?所以我想一次选一个演员。任何人都请帮忙。。

vtkAbstractPicker顾名思义,只是一个定义拾取接口的抽象类,仅此而已。在选择实际的拾取器时,基本上可以在基于光线投射的拾取或使用图形硬件的"颜色拾取"之间进行选择(请参阅实现这些功能的实际vtk类的链接文档)。

现在,对于实际问题,如果我正确理解了你写的内容,你将面临一个相当简单的排序问题。不透明度可以被视为一种优先级——不透明度较高的演员应该被选中,即使他们在其他不透明度较低的演员体内,对吧?然后,您所需要做的就是获取鼠标光标下的所有参与者,然后选择不透明度最高的参与者,或者在不透明度相同的情况下选择最接近的参与者。

我认为实现这一点的最简单方法是使用vtkPropPicker(vtkProp是actor的父类,因此这是一个很好的挑选actor的选择器)。它是"硬件"拾取器之一,使用颜色拾取算法。基本算法是使用不同的颜色将每个可拾取对象渲染到隐藏缓冲区(纹理)中。这个颜色(毕竟是一个32位的数字,和其他任何颜色一样)是该对象的ID:当用户点击屏幕时,你从点击的坐标上的拾取纹理中读取像素的颜色,然后你只需查看ID下与该颜色相同的对象图,就可以获得该对象。显然,它不能使用任何透明度——单独的颜色是对象的ID,混合它们将使它们无法识别。

然而,vtkPropPicker提供了一种方法:

// Perform a pick from the user-provided list of vtkProps 
// and not from the list of vtkProps that the render maintains.
// If something is picked, a 1 is returned, otherwise 0 is returned.
// Use the GetViewProp() method to get the instance of vtkProp that was picked.
int PickProp (double selectionX, double selectionY,
vtkRenderer *renderer, vtkPropCollection *pickfrom);

这样做只需首先调用PickProp(mouseClickX, mouseClickY, renderer of your render window, pickfrom),仅提供pickfrom集合中优先级最高的参与者,即具有最高不透明度的参与者。在下面,这将使用颜色编码算法对所有提供的参与者进行渲染,并告诉您哪个参与者在指定坐标下面。如果它选择了某个东西(返回值为1,您对它调用GetViewProp,它会为您提供指向所选演员的指针),您保留它,如果它没有(返回值是0),您会再次调用它,这一次为演员提供较低的不透明度,依此类推,直到您选择某个东西或测试所有演员。

您也可以使用像vtkPicker这样的光线投射拾取器执行同样的操作——它在鼠标下方投射光线,并为您提供与场景中所有对象的所有交点。但vtkPicker的API经过优化,可以找到最接近的交集,获取所有交集,然后对其进行排序可能需要一些工作,最终,我相信使用vtkPropPicker的解决方案无论如何都会更快。

如果这个解决方案很好,您可能需要查看vtkHardwareSelector,它使用相同的算法,但与vtkPropPicker不同,它允许您多次访问底层拾取纹理,这样您就不需要为每个拾取查询重新渲染。根据渲染管道的设置方式,这可能是一个更有效的解决方案(=如果在不更新场景的情况下进行大量拾取)。

最新更新