This was a very cool picture of the bone in yellow and the veins in orange and the muscle in red. It also provided a 1d transfer function to look at.
The first thing that I wanted to do was play with the visualization. It had options to rotate and translate the 3d volume.
The transfer function for just the hand looks like this image below.
I then wanted to see if I could get the bone to appear by itself so after playing with the transfer function a lot, I came up with a method to filter just the bone seen in white.
I played with the program enough to know what I enjoyed and what I want to do with my transfer function. Some of my favorite things I liked about the transfer function is that it had a checkerboard at the top which helps me understand the alpha channel and the true color blending in at a particular isovalue. I also liked the freedom of moving my cursor to select different types of data.
The difficult part about the widget/editor is that I had to learn everything myself. I could have read some other documentation online but I would rather have a tutorial right where I'm looking since the average user just wants to see what a program does before digging deep in if they want to spend a lot of time in it. I noticed the 3d window had some cool benefits of keyboard shortcuts but I couldn't find any keyboard shortcuts that worked inside of the transfer function window. I didn't like how I had to move my mouse all the way to the red checkbox to uncheck/check it. I would rather press 'r' for red to toggle in between and do the same for the other colors. That would be one of the improvements I would do. Overall, the biggest thing I would do is help the researcher with speed. I like keyboard shortcuts and I would change that to make the transfer function more apparent. I would choose the keys 'r' for red, 'b' for blue, 'g' for green, and 'a' for alpha. I would also have presets where the alpha would be preset with the keys 1-9 or something like that so the researcher could reset the alpha to a certain value or use popular transfer function schemas.
In the next step, I downloaded Dr. Christoph Garth's volume renderer he provided. I downloaded the data and got the following volume renderer.
I really liked the foot dataset so after looking at all of the datasets, I stuck to the foot. To make it an effective visualization, I found that depending on what I was interested in, ambience, specular, diffuse all played an important role. I wanted to represent a 3d model so I made sure it had all of those settings applied to the dataset and I got the following foot after manipulating the data.
The coolest thing I really liked was the density bar that allowed me to see the whole foot and skin if I wanted and in real-time modifying the density to make it show less and less until I got to the bone model which was in the image just above. I found this method very useful especially for beginners. They can see in real-time what each step function does and could modify it accordingly. I could take this to a 10-year-old and they would understand how to use the program simply. This is limited to beginners who don't need to research certain behaviors. If I was trying to find breaking research, I would actually use Image3D as the first preference rather than this since it has much more support.
Now to come up with my own scheme, I sketched out three ideas. Below, I will show my sketches and the ideas behind them.
In the first diagram, it is very similar to how Image3D works. I really liked its functionality so I went off of its layout and added features like shortcut keys to toggle in between the colors like 'r' for red, and other letters for the other colors based on the underlined color. Another thing I added is a label where the bottom is f(x) and the left side is labeled the intensity value of each color so the user knows and has a more clarified definition of what the scale is. I also really liked the alpha box checker-box so I want to layout that color in the box at first again depending on if the intensity value if nothing or completely filled.
In the second image, I took out the checkboxes and allowed the users to change the color within each of the grids. This would make a fast layout for the data and similar to the first draft, I would add the color of all the combinations at the top.
For the third image, I wanted to play with polar coordinates so I did the same checkbox routine but rather than having a rectangle, it is a circle and you would drag your mouse around the circle to choose intensity values where f(x) runs around the circumference of the circle and 0 is in the center of the circle while 255 color intensity value is on the outside of the circle.
I didn't like the polar coordinates idea because f(0) and f(255) are most-likely discrete and wouldn't make it seem continuous. I kind of liked the several rectangle boxes though it wasn't nice because I'm using redundancy in the different colors. If I did use that method, I would have also put the graphs side-by-side to see if that would have been nicer but I am a fan of just one rectangular box.
I chose to go with the first idea choosing Image3D's method but with a few enhancements like keyboard shortcuts since no one wants to really move their mouse outside to check on certain boxes.
To implement the method, I first drew all of the coordinates and then used mapping to map the indexes into the right area using alpha as a black color. This was to get a good test case and this was my result.
As you can kind of see, the values mapped in appropriately but they used a scattering variable when I dragged the mouse which only drew the point of focus on each frame cycle at the speed of my system. To take care of this, I implemented a previous point tracker and used an equation to calculate the slope of the difference between the points then interpolated all of the in-between points so that dragging the mouse acted appropriately. Another thing I did was make sure the points drawn inside of the window widget were bound inside of the widget even if my mouse went outside of the widget. It wouldn't focus on my custom widget unless I was already in the widget when clicking and as I drag outside of the widget, it handles these issues. Another thing I fixed in my graph was that the left axis needed to show not only alpha but all the other red, green, blue values also.
As you can see from this image, it looks much better since it takes care of all the in-between values. There still lacks a jump from 0 to the first value in the line and between all of the values. To take care of this, rather than drawing points, I drew connecting lines.
This gave me good enough results to be happy. Now I need to create a radio widget to choose between red, green, blue and alpha. Not only did I do that, I changed the border to not be completely black so you could see the alpha at the bottom and the colors at the top. Some functionalities that I added when doing this was making it so you couldn't deselect one of the radio buttons. I did the same with the "Step" and "Custom Transfer Function" so it would require one of them at least. Another change I did was to make the view start inside of "Custom Transfer Function" mode since I didn't care about development in "Step" function mode.
Now as I wanted to do in the beginning, I want to add shortcut keys that would allow you to press the keyboard to select a color. I made an underline that underlined the letter that you could press to go in between red, green, blue and alpha. Since the keys were so far away, I also made some more shortcut keys that would iterate between them using the 'k' button to iterate left and 'l' button to iterate to the right. This was very cool because I could be in the middle of a line and want to change colors while drawing. Here is the result of me drawing a straight line across iterating through the colors with the keyboard at the same time.
Now I want to add the number of data values at each particular point so the viewer knows how many points on the 3d visualization. Again, I had to dig into other code that was inside of the black box that the class page recommended. I found a way to use the data to my advantage and had it plot in this widget where the data values were none zero or the max value. Another thing I did was changed the focus window so that it was bound for a click focus 20 pixels on the outside of the box so if someone clicked and held on the outside of the box and dragged it, it would take care of the boundaries at the borders.
Now that the data contained the number of values at a certain f(x) value, I modified the label on the left to say intensity since that would make more sense. The data values are rescaled to fit in the 0-255 box.
The last thing that I want to add is a bar at the top that would show the value at at a certain f(x) value. This took forever since I had to write everything and there seemed to be many complications that made me have to use other routines to draw. In the end, everything looked very good and I was impressed with my results. Below I will show the checkerbox alpha that I drew.
After which, after adding color to the box which was where the complications came in, I got a working version of the following.
The first dataset I decided to study was the fuel dataset. The most interesting thing I found about the dataset was that there was different values throughout the dataset where the center had a different value than the outside of the dataset. It diligently moved throughout the fuel dataset meaning that the dataset of fuel probably contained the density or a temperature since they were not uniform throughout. Below is the transfer function I came up with for the dataset.
The RGB values were hard to play with so if I had more time I would have used HSV instead of RGB. It was cool looking at the dataset and coming up with a good transfer function. Some of the greatest strengths of my design is showing the color at the top bar. Another strength is the easy functionality of moving the cursor around the dataset to discover data. The cons are the RGB values I have mentioned earlier. The challenges of finding a good volume rendering is finding where the good values of interest are. You have to spend a lot of time with the data to find interesting areas. This is a faster process of any other design pattern I've done in the past which makes it super fun to play with. Now to study another dataset.
In the Bucky dataset, I was able to come up with the following transfer function visualization.
While studying this visualization, I found some other flaws in my design that I would make better if I had more time. I didn't like how clicking on red just modified the red. It is confusing to find out what color I really wanted. With more time, I would use a color bucket where you could select a color and use that in the graph dependent on the intensity I wanted. I felt like I had to really understand how RGB works to be able to. I decided that for my case, I wanted to improve my tools so that the buttons could be selected simultaneously. In the mean-time, I improved the checkboxes to have the 'i' key activate all of the checkboxes and 'o' key will deactivate all checkboxes. I did have to take away the 'k' and 'l' functionality since I'm not using a radio technique anymore and it didn't make sense.
Below is the upgraded implementation I created to make color picking easier to understand for the user similar to Image3D.
As you can see by the image above, the values follow one another since all are selected, after I deselect the green value and get the following changes in the second photo.
I really like this implementation better. Let's now go and do some data exploration on the same datasets again and see if we can discover anything new.
As you can see from the images above, it is easier to move values around though I didn't find it significantly easier. I did enjoy using the tool more though and felt it was a better implementation than the first. Now let's look at the other dataset again and see if that makes it easier.
In this dataset, I did find it significantly easier to explore the data and put colors into different areas. It was still confusing since selecting red only modified red and didn't show more of the red on the image necessarily.
Overall, this has been my favorite assignment because it feels powerful to edit 3d images using 2d tools. I like the ease of access and how things work uniformly.
You can download my code from sci.utah.edu/~mavinm/cs6630/TransferFunctions.zip, note that you need authentication to download it. Please contact me if you have any issues.







































































