1234567891011121314151617181920212223242526272829303132333435363738 |
- """Compute 3D world coordinates from 2D screen pixel coordinates
- (hover mouse to place the points)"""
- from vedo import settings, Point, Text2D, TessellatedBox, ParametricShape, Plotter
- from vedo.utils import mag
- settings.default_font = "Ubuntu"
- settings.use_depth_peeling = True
- def func(evt): # this is the callback function
- i = evt.at # the renderer nr. which is being hit
- pt2d = evt.picked2d # 2D screen coordinate
- # passing a list of meshes will force the points to be placed on any of them
- pt3d = plt.at(i).compute_world_coordinate(pt2d, objs=[objs[i]])
- if mag(pt3d) < 0.01:
- return
- newpt = Point(pt3d).color(i)
- txt.text(f'2D coords: {pt2d}\n3D coords: {pt3d}\nNpt = {len(plt.objects)}')
- txt.color(i) # update text and color on the fly
- plt.at(i).add(newpt).render() # add new point and render i
- # create an empty text (to be updated in the callback)
- txt = Text2D("", s=1.4, font='Brachium', c='white', bg='green8')
- # create two polygonal meshes
- mesh1 = TessellatedBox()
- mesh2 = ParametricShape('ConicSpiral')
- mesh2.c('indigo1').lc('grey9').lw(1)
- objs = [mesh1, mesh2]
- plt = Plotter(N=2, bg='blackboard', axes=1, sharecam=False)
- plt.add_callback('mouse move', func)
- plt.at(0).show(mesh1, __doc__, viewup='z')
- plt.at(1).show(mesh2, txt, zoom=1.4)
- plt.interactive().close()
|