Advertisement
Guest User

Untitled

a guest
Dec 11th, 2019
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.86 KB | None | 0 0
  1. """
  2. Demonstration of how to interact with visuals, here with simple
  3. arcball-style control.
  4. """
  5.  
  6. import sys
  7. import numpy as np
  8.  
  9. from vispy import app
  10. from vispy.visuals import BoxVisual, transforms
  11. from vispy.util.quaternion import Quaternion
  12.  
  13.  
  14. class Canvas(app.Canvas):
  15. def __init__(self):
  16. app.Canvas.__init__(self, 'Cube', keys='interactive',
  17. size=(800, 800))
  18.  
  19. self.cube = BoxVisual(1.0, 1.0, 1.0, color='red',
  20. edge_color='black')
  21. self.cube.transform = transforms.MatrixTransform()
  22. self.cube.transform.scale((100, 100, 0.001))
  23. self.cube.transform.translate((200, 200))
  24.  
  25. self.cube_1 = BoxVisual(1.0, 1.0, 1.0, color='red',
  26. edge_color='black')
  27. self.cube_1.transform = transforms.MatrixTransform()
  28. self.cube_1.transform.scale((100, 100, 0.001))
  29. self.cube_1.transform.translate((300, 200))
  30.  
  31. self.quaternion = Quaternion()
  32. #self.show()
  33.  
  34. def on_resize(self, event):
  35. vp = (0, 0, self.physical_size[0], self.physical_size[1])
  36. self.context.set_viewport(*vp)
  37. self.cube.transforms.configure(canvas=self, viewport=vp)
  38. self.cube_1.transforms.configure(canvas=self, viewport=vp)
  39.  
  40. def on_draw(self, event):
  41. self.context.clear('white')
  42. self.cube.draw()
  43. self.cube_1.draw()
  44.  
  45. def on_mouse_move(self, event):
  46. if event.button == 1 and event.last_event is not None:
  47. x0, y0 = event.last_event.pos
  48. x1, y1 = event.pos
  49. w, h = self.size
  50. self.quaternion = (self.quaternion *
  51. Quaternion(*_arcball(x0, y0, w, h)) *
  52. Quaternion(*_arcball(x1, y1, w, h)))
  53. self.cube.transform.matrix = self.quaternion.get_matrix()
  54. self.cube.transform.scale((100, 100, 0.001))
  55. self.cube.transform.translate((200, 200))
  56.  
  57. self.cube_1.transform.matrix = self.quaternion.get_matrix()
  58. self.cube_1.transform.scale((100, 100, 0.001))
  59. self.cube_1.transform.translate((300, 200))
  60.  
  61. self.update()
  62.  
  63.  
  64. def _arcball(x, y, w, h):
  65. """Convert x,y coordinates to w,x,y,z Quaternion parameters
  66. Adapted from:
  67. linalg library
  68. Copyright (c) 2010-2015, Renaud Blanch <rndblnch at gmail dot com>
  69. Licence at your convenience:
  70. GPLv3 or higher <http://www.gnu.org/licenses/gpl.html>
  71. BSD new <http://opensource.org/licenses/BSD-3-Clause>
  72. """
  73. r = (w + h) / 2.
  74. x, y = -(2. * x - w) / r, -(2. * y - h) / r
  75. h = np.sqrt(x*x + y*y)
  76. return (0., x/h, y/h, 0.) if h > 1. else (0., x, y, np.sqrt(1. - h*h))
  77.  
  78. if __name__ == '__main__':
  79. win = Canvas()
  80. win.show()
  81. if sys.flags.interactive != 1:
  82. win.app.run()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement