/[escript]/trunk/pyvisi/py_src/camera.py
ViewVC logotype

Contents of /trunk/pyvisi/py_src/camera.py

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1148 - (show annotations)
Wed May 16 22:45:33 2007 UTC (12 years, 6 months ago) by jongui
File MIME type: text/x-python
File size: 5775 byte(s)
Added the updated files for pyvisi and removed some incorrect reference images.
1 """
2 @author: John NGUI
3 """
4
5 import vtk
6 from position import GlobalPosition
7 from constant import Viewport
8
9 class Camera:
10 """
11 Class that defines a camera. A camera controls the display angle of
12 the rendered object and one is usually created for a
13 L{Scene <scene.Scene>}. However, if a L{Scene <scene.Scene>} has four
14 viewports, then a separate camera may be created for each viewport.
15 """
16
17 # The SOUTH_WEST default viewport is used when there is only one viewport.
18 # This saves the user from specifying the viewport when there is only one.
19 def __init__(self, scene, viewport = Viewport.SOUTH_WEST):
20 """
21 Initialise the camera.
22
23 @type scene: L{Scene <scene.Scene>} object
24 @param scene: Scene in which objects are to be rendered on
25 @type viewport: L{Viewport <constant.Viewport>} constant
26 @param viewport: Viewport in which objects are to be rendered on
27 """
28
29 self.__scene = scene
30 self.__viewport = viewport
31 self.__vtk_camera = vtk.vtkCamera()
32
33 # Keeps track whether camera has been modified.
34 self.__modified = True
35 # Keeps track whether the modification to the camera was due to the
36 # instantiation. If it is, then __setupCamera() method is called.
37 self.__initialization = True
38 self.__scene._addVisualizationModules(self)
39
40 def __setupCamera(self):
41 """
42 Setup the camera.
43 """
44
45 # Assign the camera to the appropriate renderer
46 self.__scene._setActiveCamera(self.__viewport, self.__vtk_camera)
47 self.__resetCamera()
48
49 def setFocalPoint(self, position):
50 """
51 Set the focal point of the camera.
52
53 @type position: L{GlobalPosition <position.GlobalPosition>} object
54 @param position: Camera focal point
55 """
56
57 self.__vtk_camera.SetFocalPoint(position._getGlobalPosition())
58 self.__modified = True
59
60 def setPosition(self, position):
61 """
62 Set the position of the camera.
63
64 @type position: L{GlobalPosition <position.GlobalPosition>} object
65 @param position: Camera position
66 """
67
68 self.__vtk_camera.SetPosition(position._getGlobalPosition())
69 self.__modified = True
70
71 def setClippingRange(self, near_clipping, far_clipping):
72 """
73 Set the near and far clipping plane of the camera.
74
75 @type near_clipping: Number
76 @param near_clipping: Distance to the near clipping plane
77 @type far_clipping: Number
78 @param far_clipping: Distance to the far clipping plane
79 """
80
81 self.__vtk_camera.SetClippingRange(near_clipping, far_clipping)
82
83 def setViewUp(self, position):
84 """
85 Set the view up direction of the camera.
86
87 @type position: L{GlobalPosition <position.GlobalPosition>} object
88 @param position: Camera view up direction
89 """
90
91 self.__vtk_camera.SetViewUp(position._getGlobalPosition())
92
93 def azimuth(self, angle):
94 """
95 Rotate the camera to the left and right.
96
97 @type angle: Number
98 @param angle: Degree to rotate the camera
99 """
100
101 self.__vtk_camera.Azimuth(angle)
102 self.__modified = True
103
104 def elevation(self, angle):
105 """
106 Rotate the camera to the top and bottom.
107
108 @type angle: Number
109 @param angle: Degree to rotate the camera (only between -90 and 90)
110 """
111
112 self.__vtk_camera.Elevation(angle)
113 # Recompute the view up vector. If not used the elevation angle is
114 # unable to exceed 87/-87 degrees. A warning resetting the
115 # view up will also be thrown and the rendered object may be incorrect.
116 # With the view up recomputed, the elevation angle can reach between
117 # 90/-90 degrees. Exceeding that, the rendered object may be incorrect.
118 self.__vtk_camera.OrthogonalizeViewUp()
119 self.__modified = True
120
121 def roll(self, angle):
122 """
123 Roll the camera to the left and right.
124
125 @type angle: Number
126 @param angle: Degree to roll the camera
127 """
128
129 self.__vtk_camera.Roll(-angle)
130 self.__modified = True
131
132 def backView(self):
133 """
134 Rotate the camera to view the back of the rendered object.
135 """
136
137 self.azimuth(180)
138
139 def topView(self):
140 """
141 Rotate the camera to view the top of the rendered object.
142 """
143
144 self.elevation(90)
145
146 def bottomView(self):
147 """
148 Rotate the camera to view the bottom of the rendered object.
149 """
150
151 self.elevation(-90)
152
153 def leftView(self):
154 """
155 Rotate the camera to view the left side of the rendered object.
156 """
157
158 self.azimuth(-90)
159
160 def rightView(self):
161 """
162 Rotate the camera to view the right side of the rendered object.
163 """
164
165 self.azimuth(90)
166
167 def isometricView(self):
168 """
169 Rotate the camera to view the isometric angle of the rendered object.
170 """
171
172 self.roll(-45)
173 self.elevation(-45)
174
175 def dolly(self, distance):
176 """
177 Move the camera towards (greater than 1) and away (less than 1) from
178 the rendered object.
179
180 @type distance: Number
181 @param distance: Amount to move towards or away the rendered object
182 """
183
184 self.__vtk_camera.Dolly(distance)
185 self.__modified = True
186
187 def __resetCameraClippingRange(self):
188 """
189 Reset the camera clipping range based on the bounds of the visible
190 actors. This ensures the rendered object is not cut-off.
191 Needs to be called whenever the camera's settings are modified.
192 """
193
194 self.__scene._getRenderer()[self.__viewport].ResetCameraClippingRange()
195
196 def __resetCamera(self):
197 """
198 Repositions the camera to view the center point of the actors.
199 """
200
201 self.__scene._getRenderer()[self.__viewport].ResetCamera()
202
203 def _isModified(self):
204 """
205 Return whether the Camera has been modified.
206
207 @rtype: Boolean
208 @return: True or False
209 """
210
211 if (self.__modified == True):
212 return True
213 else:
214 return False
215
216 def _render(self):
217 """
218 Render the camera.
219 """
220
221 if(self._isModified() == True):
222 # Will only be true once only when the camera is instantiated.
223 if(self.__initialization == True):
224 self.__setupCamera()
225 self.__initialization == False
226
227 self.__resetCameraClippingRange()
228 self.__isModified = False
229
230

  ViewVC Help
Powered by ViewVC 1.1.26