OSDN Git Service

fix import_mqo.py
[meshio/pymeshio.git] / examples / opengl / rokuro.py
1 #!/usr/bin/python\r
2 # coding: utf-8\r
3 \r
4 import math\r
5 from OpenGL.GL import *\r
6 from OpenGL.GLU import *\r
7 \r
8 from . import baseview\r
9 \r
10 class RokuroView(baseview.BaseView):\r
11     def __init__(self):\r
12         super(RokuroView, self).__init__()\r
13         self.w=1\r
14         self.h=1\r
15         self.head=0\r
16         self.pitch=0\r
17         self.SHIFT_FACTOR=0.001\r
18         self.distance=100\r
19         self.shiftX=0\r
20         self.shiftY=0\r
21         self.aspect=1\r
22         self.n=1\r
23         self.f=10000\r
24 \r
25     def __str__(self):\r
26         return '<RokuroView shiftX: %f, shiftY: %f, distance: %f>' % (\r
27                 self.shiftX, self.shiftY, self.distance)\r
28  \r
29     def onResize(self, w=None, h=None):\r
30         super(RokuroView, self).onResize(w, h)\r
31         self.aspect=float(self.w)/float(self.h)\r
32 \r
33     def dolly(self, d):\r
34         if d>0:\r
35             self.distance*=1.1\r
36         elif d<0:\r
37             self.distance*=0.9\r
38 \r
39     def shift(self, dx, dy):\r
40         self.shiftX+=dx * self.distance * self.SHIFT_FACTOR\r
41         self.shiftY+=dy * self.distance * self.SHIFT_FACTOR\r
42 \r
43     def rotate(self, head, pitch):\r
44         self.head+=head\r
45         self.pitch+=pitch\r
46 \r
47     def updateProjection(self):\r
48         gluPerspective(30, self.aspect, self.n, self.f)\r
49 \r
50     def updateView(self):\r
51         glTranslate(self.shiftX, self.shiftY, -self.distance)\r
52         glRotate(self.head, 0, 1, 0)\r
53         glRotate(self.pitch, 1, 0, 0)\r
54 \r
55     def onMotion(self, x, y):\r
56         redraw=False\r
57         if self.isLeftDown:\r
58             self.dolly(y-self.y)\r
59             redraw=True\r
60         if self.isMiddelDown:\r
61             self.shift(x-self.x, self.y-y)\r
62             redraw=True\r
63         if self.isRightDown:\r
64             self.rotate(x-self.x, y-self.y)\r
65             redraw=True\r
66         self.x=x\r
67         self.y=y\r
68         return redraw\r
69 \r
70     def onWheel(self, d):\r
71         if d!=0:\r
72             self.dolly(d)\r
73             return True\r
74 \r
75     def look_bb(self, min_v, max_v):\r
76         w=max_v[0]-min_v[0]\r
77         h=max_v[1]-min_v[1]\r
78         long_side=max(w, h)\r
79         def deglee_to_radian(deglee):\r
80             return math.pi*deglee/180.0\r
81         d=long_side/math.tan(deglee_to_radian(30)) * 1.5\r
82         self.distance=min_v[2]+d\r
83         cx=min_v[0]+max_v[0]\r
84         cy=min_v[1]+max_v[1]\r
85         self.shiftX=-cx/2.0\r
86         self.shiftY=-cy/2.0\r
87         print(self)\r
88 \r