Vtk - 鼠标位置的世界坐标

3

在渲染窗口上,通过鼠标位置获取世界坐标在x-z平面上的可能性(y=0)?

2个回答

2
这应该是可能的,但可能需要一些计算。我会从 this example 开始。获取类似鼠标移动或鼠标点击的鼠标事件,并使用 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();
    }

现在,当你在点击时获取了世界坐标,你可能需要计算相机位置到鼠标位置(在世界中)的线与它与x-z平面相交的点。

1

我可以使用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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接