The assignment is due at midnight on December 15th. The purpose of this assignment is to make sure you understand (and experiment with) the basic concepts involved in the visualization of Diffusion Tensor volumes as well as large graphs. As you work on the assignment, we greatly encourage you to read the available documentation on both python and VTK. Some of the problems will require you to use VTK modules you might not have previously seen. These are indicated in the problems.
Submitting your vistrails
The assignment is broken into two distinct parts: DTI vis and graph vis. Two different vistrails should be used for these tasks, assignment4a.vt and assignment 4b.vt, respectively. You may start from an empty vistrail or from examples that are given. You will need to use the CADE handin functionality to turn in your assignment. The class account is "cs5630". Both vistrails will need to be submitted.
Assignment 4a: DTI Visualization
The first part of the assignment is to perform some basic visualizations of diffusion tensor data. Because this is the final assignment, it will be a little more difficult because there are no examples given. It also combines many of the techniques covered in other assignments such as color mapping, isosurfacing, glyph visualization, and streamlines.
This is a diffusion tensor dataset gktbh.vtk, and a corresponding anisotropy volume gktbhFA.vtk. These volumes cover the right half of a Gordon Kindlmann's brain. They encode information about the structure of the brain matter. The anisotropy volume has high values in regions which are likely white matter in the brain, and these are the regions of interest.
Problem 1a: Perform isosurface rendering of the anisotropy volume using multiple transparent, colored, isosurfaces. In the version tree notes for the node, describe (roughly) what the isosurfaces show are the regions that are highly anisotropic and those that are highly isotropic.
Problem 1b: Perform glyph visualization of the DT dataset. Choose whatever glyph geometry you want (cube, sphere, cylinder, etc.) but make sure it is appropriate for the symmetry imposed by the sign ambiguity of eigenvectors. The glyphs should be color mapped by their anisotropy. In order to produce a clear visualization, you need to control the number of glyphs produced to show only regions of high anisotropy to reduce clutter. Here are a few possible ways of doing this:
- Producing glyphs only in a region constrained to some simple geometry, such as on a plane which you use to probe the volume
- Producing glyphs only within range of values defined by a threshold
- Producing glyphs on the vertices of an invisible isosurface.
In the notes for the node, describe why you chose the glyph representation that you did and how you limited the clutter.
Problem 1c: (Grads Only) Based on your knowedge of where the highly directional features are, visualize them using several well-placed hyperstreamlines. In the notes for the node, describe how you chose the seed points
Problem 1d: Create a composite visualization that combines all three techniques (or two techniques for U-Grads) described above.
- Multiple isosurfaces can be easily defined using the GenerateValues method.
- Combining two disjoint datasets (tensors and scalars) into one dataset requires a vtkMergeFilter.
- See documentation on vtkTensorGlyphs for more info on tensor glyphs.
- Combining a glyph represenatation with a colormap requires a vtkProbeFilter.
- A scalar volume can be turned into a colormap using vtkImageMapToColors
Assignment 4b: Graph Visualization
The goal of this assignement is to compare several different InfoVis graph layout strategies. InfoVis capabilities in VTK are very new (ie., unstable) and some of the features do not work to well, or crash (I recommend saving often). Thus, this assignment will be somewhat limited in what we can do. The graph we will be visualizing is the vtk class hierarchy, generated on-the-fly using a PythonSource and Python's introspection capabilities. An example vistrail that creates an interactive treemap can be found here: assignment4b.vt.
Problem 2a: Replace the tree map with a graph layout (see vtkGraphLayout). Be sure to keep the labels on the resulting trees.
Problem 2b: Experiment with different graph layout strategies and tag the one you like best. In the notes, comment on why you chose the layout you did. Note: I could not get the vtkTreeLayoutStrategy to work correctly (it always wants to be radial), you may have more or less luck.
- See the vtk documentation, tests, and examples for the graph layout classes to get the pipelines right.