| 139 | In the next sections the resulting Python script is shown step by step. |
| 140 | === Preliminary Steps |
| 141 | First of all one has to import paraview.simple and open a view of the correct size (e.g. 1920x1080=fullHD or 3840x2160=4K). |
| 142 | {{{ |
| 143 | #!python |
| 144 | #### import the simple module from the paraview |
| 145 | from paraview.simple import * |
| 146 | |
| 147 | Connect() #connect to build in paraview |
| 148 | #also possible to connect to pvserver, e.g. pv.Connect('localhost') |
| 149 | |
| 150 | paraview.simple._DisableFirstRenderCameraReset() |
| 151 | |
| 152 | # get active view |
| 153 | renderView = CreateRenderView('RenderView') |
| 154 | renderView.UseOffscreenRendering = 1 |
| 155 | renderView.ViewSize = [1920*2, 1080*2] |
| 156 | }}} |
| 157 | |
| 158 | === Loading the Data |
| 159 | The data is loaded and then visualized with the [http://www.ospray.org/ OSPRay] volume renderer: |
| 160 | {{{ |
| 161 | #!python |
| 162 | vervet = XDMFReader(FileNames=['/homeb/zam/zilken/JURECA/projekte/hdf5_inm_converter/Vervet_Sehrinde_rightHem_direction/data/vervet_hyperslab.xdmf']) |
| 163 | vervet.PointArrayStatus = ['PLI'] |
| 164 | vervet.GridStatus = ['Brain'] |
| 165 | print "loading vervet data" |
| 166 | vervetDisplay = Show(vervet, renderView) |
| 167 | vervetDisplay.VolumeRenderingMode = 'OSPRay Based' |
| 168 | vervetDisplay.SetRepresentationType('Volume') |
| 169 | vervetDisplay.ColorArrayName = ['POINTS', ''] |
| 170 | vervetDisplay.OSPRayScaleArray = 'PLI' |
| 171 | vervetDisplay.OSPRayScaleFunction = 'PiecewiseFunction' |
| 172 | vervetDisplay.SelectOrientationVectors = 'None' |
| 173 | vervetDisplay.ScaleFactor = 0.09998712839442306 |
| 174 | vervetDisplay.SelectScaleArray = 'PLI' |
| 175 | }}} |
| 176 | |
| 177 | === Camera Animation: Path-based |
| 178 | To orbit around the data (rotate the data), the camera can be animated in orbit mode. The CameraTrack and the AnimationScene are used in conjunction with two keyframes to render 100 images: |
| 179 | {{{ |
| 180 | #!python |
| 181 | cameraAnimationCue1 = GetCameraTrack(view=renderView) |
| 182 | animationScene = GetAnimationScene() |
| 183 | |
| 184 | # create first keyframe |
| 185 | # Note: this one keyframe stores all orbit camera position in PositionPathPoints |
| 186 | keyFrame5157 = CameraKeyFrame() |
| 187 | keyFrame5157.Position = [0.0, 0.0, 1.488] |
| 188 | keyFrame5157.ViewUp = [-1.0, 0.0, 0.0] |
| 189 | keyFrame5157.ParallelScale = 0.6825949417738006 |
| 190 | keyFrame5157.PositionPathPoints = [0.0, 0.0, 1.488, 0.0, 1.1563931906479727, 0.9364287418821582, 0.0, 1.455483629891903, -0.30937259593682587, 0.0, 0.6755378636124458, -1.3258177079922915, 0.0, -0.6052241248967907, -1.3593556409721905, 0.0, -1.437297629518134, -0.3851227391125512, 0.0, -1.2038172876299222, 0.8746244554111999] |
| 191 | keyFrame5157.FocalPathPoints = [0.0, 0.0, 0.0] |
| 192 | keyFrame5157.ClosedPositionPath = 1 |
| 193 | |
| 194 | # create last keyframe |
| 195 | keyFrame5158 = CameraKeyFrame() |
| 196 | keyFrame5158.KeyTime = 1.0 |
| 197 | keyFrame5158.Position = [0.0, 0.0, 1.488] |
| 198 | keyFrame5158.ViewUp = [-1.0, 0.0, 0.0] |
| 199 | keyFrame5158.ParallelScale = 0.6825949417738006 |
| 200 | |
| 201 | # initialize the animation track |
| 202 | cameraAnimationCue1.Mode = 'Path-based' |
| 203 | cameraAnimationCue1.KeyFrames = [keyFrame5157, keyFrame5158] |
| 204 | |
| 205 | numFrames = 100 |
| 206 | imageNum = 0 |
| 207 | animationScene.NumberOfFrames = numFrames |
| 208 | animationScene.GoToFirst() |
| 209 | for i in range(numFrames): |
| 210 | print ("orbit state: rendering image %04d" % (imageNum)) |
| 211 | WriteImage("image_%04d.png" % (imageNum)) |
| 212 | imageNum = imageNum + 1 |
| 213 | animationScene.GoToNext() |
| 214 | }}} |
| 215 | |
| 216 | === Camera Animation: Interpolate Camera |
| 217 | For whatever reason !ParaView offers a second option for camera animation, called "interpolate camera". |
| 218 | In this mode, the Position-, !FocalPoint- and !ViewUp-vectors of a given number of keyframes are interpolated. |
| 219 | This way a camera flight consisting of 2, 3 or more keyframes can be animated. Here is an example for 3 keyframes. |
| 220 | {{{ |
| 221 | #!python |
| 222 | # create key frame 1 |
| 223 | keyFrame1 = CameraKeyFrame() |
| 224 | keyFrame1.KeyTime = 0.0 |
| 225 | keyFrame1.Position = [0.0, 0.0, 1.488] |
| 226 | keyFrame1.FocalPoint = [0.0, 0.0, 0.0] |
| 227 | keyFrame1.ViewUp = [-1.0, 0.0, 0.0] |
| 228 | keyFrame1.ParallelScale = 0.8516115354228021 |
| 229 | # create key frame 2 |
| 230 | keyFrame2 = CameraKeyFrame() |
| 231 | keyFrame2.KeyTime = 0.14 |
| 232 | keyFrame2.Position = [-0.28, -0.495, 1.375] |
| 233 | keyFrame2.FocalPoint = [-0.00016, -0.0003, -4.22e-5] |
| 234 | keyFrame2.ViewUp = [-0.981, 0.0255, -0.193] |
| 235 | keyFrame2.ParallelScale = 0.8516115354228021 |
| 236 | # create key frame 2 |
| 237 | keyFrame3.KeyTime = 1.0 |
| 238 | keyFrame3.Position = [-0.0237, -0.092, 0.1564] |
| 239 | keyFrame3.FocalPoint = [-0.000116651539708215, -0.000439441275715884, -9.75944360306001e-05] |
| 240 | keyFrame3.ViewUp = [-0.98677511491576, -0.0207684556984332, -0.160759272923493] |
| 241 | keyFrame3.ParallelScale = 0.8516115354228021 |
| 242 | |
| 243 | cameraAnimationCue1.KeyFrames = [keyFrame1, keyFrame2, keyFrame3] |
| 244 | cameraAnimationCue1.Mode = 'Interpolate Camera' |
| 245 | numFrames = 200 |
| 246 | animationScene.NumberOfFrames = numFrames |
| 247 | |
| 248 | animationScene.GoToFirst() |
| 249 | imageNum = 0 |
| 250 | |
| 251 | for i in range(numFrames): |
| 252 | print ("rendering image %04d" % (imageNum)) |
| 253 | WriteImage("picture_%04d.png" % (imageNum)) |
| 254 | imageNum = imageNum + 1 |
| 255 | animationScene.GoToNext() |
| 256 | }}} |