VTK를 처음 사용합니다. VTK 추상 피커가 다른 불투명도 값의 여러 액터에 대해 어떻게 동작하는지 알고 싶습니다. 두 명의 배우를 생각해 봅시다. 하나는 , 다른 하나는 내부에 있습니다. 외부 표면의 불투명도를 0.3으로 설정하고 의 불투명도를 내면 1.0으로 설정하면 바깥 쪽이 반투명하므로 두 액터의 중복 영역에서 내부 액터를 볼 수 있습니다. 그 영역에서 피킹을 수행 할 때 결과 좌표는 내부 표면 자체에서 발생하며 겹치는 영역 이외의 다른 점을 선택하면 외부 표면 좌표를 얻게됩니다. 불투명도 값을 기준으로 피킹 작업을 수행하려면 어떻게해야합니까? 내가 한 번에 한 배우를 골라 내길 바란다. 아무도 도와주세요 ..불투명도 값이 다른 여러 액터의 VTK 추상 선택 자
답변
vtkAbstractPicker은 이름에서 알 수 있듯이 따기를위한 인터페이스를 정의하는 추상 클래스와 같지만 그 이상은 아닙니다. 실제 피커를 선택할 때 기본적으로 레이 캐스팅을 기반으로하는 피킹 또는 그래픽 하드웨어를 사용하는 "색상 피킹"중에서 선택할 수 있습니다 (이를 구현하는 실제 vtk 클래스의 링크 된 설명서 참조).
실제 문제에 대해, 내가 올바르게 작성한 것을 이해하면 다소 단순한 정렬 문제에 직면하게됩니다. 불투명도는 일종의 우선 순위로 볼 수 있습니다. 불투명도가 높은 액터는 불투명도가 낮은 다른 멤버 내부에 있더라도 선택해야합니다. 그런 다음 마우스 커서 아래에있는 모든 액터를 가져온 다음 가장 높은 불투명도를 가진 액터를 선택하거나 동일한 불투명도를 갖는 경우 가장 가까운 액터를 선택하면됩니다.
이 방법을 구현하는 가장 쉬운 방법은 (vtkProp
은 액터의 부모 클래스이므로 액터 따기를위한 좋은 선택기입니다)라고 생각합니다. 색상 선택 알고리즘을 사용하는 "하드웨어"선택기 중 하나입니다. 기본 알고리즘은 각각의 선택 가능한 객체가 다른 색상을 사용하여 숨겨진 버퍼 (텍스처)로 렌더링된다는 것입니다. 이 색상 (결국 다른 색상과 같은 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);
은 당신이 함께 할 수있는 일은 즉 가장 높은 불투명도를 가진 배우 pickfrom
컬렉션에만 우선 순위가 가장 높은 배우를 제공 단순히 첫 번째 호출 PickProp(mouseClickX, mouseClickY, renderer of your render window, pickfrom)
입니다. 아래에서, 이것은 색상 코딩 알고리즘을 사용하여 제공된 모든 액터의 렌더링을 수행하고 지정된 좌표 아래에 어떤 액터가 있는지 알려줍니다. 그것이 뭔가를 골라 내면 (반환 값은 1이고 GetViewProp을 호출하면 선택한 액터에 대한 포인터를줍니다), 그렇지 않으면 (반환 값은 0입니다), 다시 호출합니다. 이번에는 배우를 선택하거나 모든 배우를 테스트 할 때까지 불투명도가 낮은 배우.
vtkPicker
같은 레이 캐스팅 선택 도구를 사용하여 동일한 작업을 수행 할 수도 있습니다. 마우스 아래에 광선을 투영하고 장면의 모든 것과 모든 교차점을 제공합니다. 그러나 vtkPicker의 API는 가장 가까운 교차점을 찾는 데 최적화되어 있습니다. 모든 API를 가져 와서 정렬하면 결국 vtkPropPicker
을 사용하는 솔루션은 더욱 빨라질 것입니다.
이 솔루션을 사용하면 동일한 알고리즘을 사용하는 vtkHardwareSelector을 볼 수 있지만 vtkPropPicker
과 달리 기본 피킹 텍스처에 여러 번 액세스 할 모든 피킹 쿼리에 대해렌더링 파이프 라인을 설정하는 방법에 따라보다 효율적인 솔루션이 될 수 있습니다 (= 장면을 업데이트하지 않고 많은 선택을하면).