Vtk - мировые координаты в позиции мыши - PullRequest
2 голосов
/ 14 января 2020

Есть ли возможность получить мировые координаты по позиции мыши в окне рендеринга на плоскости xz (y = 0)?

Ответы [ 2 ]

0 голосов
/ 14 января 2020

Я могу воспроизвести его с помощью vtkplotter :

from vtkplotter import datadir, Plotter, Point
import vtk

def onLeftClick(mesh):
    vcr = vtk.vtkCoordinate()
    vcr.SetCoordinateSystemToDisplay()
    pt = vcr.GetComputedWorldValue(vp.renderer)
    vp.add(Point(mesh.picked3d, c='red'))
    vp.add(Point(pt, c='white'))
    vp.renderer.ResetCamera()
    print(mesh.picked3d, pt)

vp = Plotter(verbose=0)
vp.load(datadir+"bunny.obj")
vp.mouseLeftClickFunction = onLeftClick
vp.show()

, но я не уверен, что это желаемый результат

enter image description here

0 голосов
/ 14 января 2020

Это должно быть возможно, но, возможно, потребуются некоторые вычисления. Я бы начал с этого этого примера . Захватите событие мыши, такое как движение мыши или щелчок мыши, и используйте vtkCoordinate для преобразования этого в мировые координаты.

Из примера (не python, но должно быть достаточно, чтобы донести идею):

virtual void OnLeftButtonDown() 
    {
      std::cout << "Pressed left mouse button." << std::endl;
      int x = this->Interactor->GetEventPosition()[0];
      int y = this->Interactor->GetEventPosition()[1];
      std::cout << "(x,y) = (" << x << "," << y << ")" << std::endl;
      vtkSmartPointer<vtkCoordinate> coordinate = 
        vtkSmartPointer<vtkCoordinate>::New();
      coordinate->SetCoordinateSystemToDisplay();
      coordinate->SetValue(x,y,0);

      // This doesn't produce the right value if the sphere is zoomed in???
      double* world = coordinate->GetComputedWorldValue(this->Interactor->GetRenderWindow()->GetRenderers()->GetFirstRenderer());
      std::cout << "World coordinate: " << world[0] << ", " << world[1] << ", " << world[2] << std::endl;

      // Forward events
      vtkInteractorStyleTrackballCamera::OnLeftButtonDown();
    }

Теперь, когда вы получили мировые координаты при щелчке, вам, вероятно, нужно рассчитать пересечение линии положения камеры с положением мыши (в мире) и где она пересекает плоскость xz.

...