728x90
VTK에서 Picker는 렌더링 공간에서 사용자 반응에 필요한 정보를 제공하는 역할을 한다.
이를테면 3차원 공간에서의 마우스의 위치 정보 또는 Actor를 pick 할 때 사용할 수 있다.
Picker 는 Geometry 방법의 Picker 와 Hardware 방법의 Picker 로 나뉜다.
Geometry pickers : vtkPicker, vtkCellPicker, vtkPointPicker
Hardware Pickers : vtkWorldPointPicker, vtkPropPicker
vtkAbstractPicker | Picker의 최상단 추상화클래스 |
vtkWorldPointPicker | Screen에서 투영되는 3차원 공간의 위치 값을 찾는다. actor, mapper는 pick 하지 못한다. |
vtkPropPicker | Hardware 방식으로 빠르게 picker을 수행하여 actor나 prop을 찾을 수 있다. |
vtkPicker | vtkProp3D 객체를 빠르게 Actor를 얻을 수 있다. |
vtkPointPicker | Cell 데이터에 접근하여 pick 한 point 의 id나 위치 정보를 얻을 수 있다. (vtkPicker보다느림) |
vtkCellPicker | Cell 데이터에 접근하여 pick 한 cell id 값과 위치 정보를 얻을 수 있다. (vtkPointPicker보다느림) |
vtkWorldPointPicker
public void TestWorldPointPicker()
{
mouseStyle.MouseMoveEvt += MouseStyle_MouseMoveEvt;
interactor.SetInteractorStyle(mouseStyle);
vtkWorldPointPicker worldPointPicker = vtkWorldPointPicker.New();
interactor.SetPicker(worldPointPicker);
vtkSphereSource sphereSource = vtkSphereSource.New();
sphereSource.Update();
vtkPolyDataMapper mapper = vtkPolyDataMapper.New();
mapper.SetInputConnection(sphereSource.GetOutputPort());
vtkActor actor = vtkActor.New();
actor.SetMapper(mapper);
actor.GetProperty().SetColor(colors.GetColor3d("MistyRose").ToIntPtr());
renderer.AddActor(actor);
}
private void MouseStyle_MouseMoveEvt(vtkObject sender, vtkObjectEventArgs e)
{
var style = (vtkInteractorStyle)sender;
var winInteractor = style.GetInteractor();
if (winInteractor != null)
{
var eventPos = winInteractor.GetEventPosition();
winInteractor.GetPicker().Pick(eventPos[0], eventPos[1], 0, renderer);
var picked = winInteractor.GetPicker().GetPickPosition();
Debug.WriteLine($"Moved value: {picked.ToStringJoin(",", "F2")}");
}
style.OnMouseMove();
}
vtkPropPicker
vtkPropPicker picker = vtkPropPicker.New();
picker.Pick(eventPos[0], eventPos[1], 0, renderer);
var pickPos = picker.GetPickPosition();
Debug.WriteLine($"Picked value: {pickPos.ToStringJoin(",", "F2")}");
if (picker.GetActor() != null)
{
vtkSphereSource sphereSource = vtkSphereSource.New();
sphereSource.SetCenter(pickPos[0], pickPos[1], pickPos[2]);
sphereSource.SetRadius(0.1);
vtkPolyDataMapper mapper = vtkPolyDataMapper.New();
mapper.SetInputConnection(sphereSource.GetOutputPort());
vtkActor actor = vtkActor.New();
actor.SetMapper(mapper);
actor.GetProperty().SetColor(colors.GetColor3d("MistyRose").ToIntPtr());
actor.SetObjectName("sphere");
sphereList.Add(actor);
renderer.AddActor(actor);
}
vtkPointPicker
var eventPos = winInteractor.GetEventPosition();
vtkPointPicker pointPicker = vtkPointPicker.New();
pointPicker.Pick(eventPos[0], eventPos[1], 0, renderer);
var pointid = pointPicker.GetPointId();
if (pointid >= 0)
{
var pointPos = pointPicker.GetDataSet().GetPoint(pointid);
Debug.WriteLine($"PointPicked Id:{pointid}, value: {pointPos.ToStringJoin(",", "F2")}");
}
728x90
728x90