是否有可能通过鼠标在x-z平面(y = 0)上的渲染窗口中获得世界坐标?
答案 0 :(得分:0)
这应该可行,但可能需要一些计算。
我将从这个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 :(得分:0)
我可以用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()
但我不确定这是否是所需的输出