In the summer of 2007 I had purchased Charles Petzold's book on WPF 3D and was working through the examples and playing around. Making 3D objects is neat, but at a certain point, people want to be able to click on stuff and have it do stuff.
A "Windows Live Search®" on WPF 3D lead me to Daniel Lehenbauer's Virtual Trackball sample. This is a classical approach to 3D and was very well executed, however, from a practical standpoint it didn't seem to be what I was looking for.
The problem with immersive 3D interfaces is you don't want to put your user through flight school before they can use your application. One of my first 3D experiences was playing the game Descent in LAN parties in college. When I first started playing, I routinely ended up getting stuck, upside down in some corner while the bad guys were shooting me. This is fine in an application like a game where you can reasonably expect the user to commit 40+ hours to mastering the interface, but not very practical for a business application.
Everyone admits that 3D interfaces are the future; there really is great potential to display and interact with denser and more rich information. On top of that, WPF 3D makes building 3D interfaces incredibly easy, bringing the html "Tag" metaphor to building (hardware accelerated) 3D is an incredibly powerful "sea change" in building interfaces.
So what's the problem?
I have not seen many applications and samples being written to take advantage of the WPF 3D libraries. The ones I have seen have been horrible. The books and blog posts I've read on the subject have all suggested restraint. Adam Nathan's WPF book suggests using 3D to make a little 3D button effect within a plain windows application, and I've read other examples and comments to the same effect. Basically what it comes down to is that you either use 3D as a little "flavor" to sprinkle over your application, or you make it the main course. The problem is, no one has a compelling vision about how to make a practical 3D user interface.
One often cited parallel is the introduction of Desktop Publishing. The story goes that when it first came out, everyone was sending letters where every word was a different font, just because they could. You still can do this today, but no one does because it does not add value to the experience. (quite the opposite in fact)
So my thought is that the way that you build a useful 3D application interface is that you add restrictions.
This was the idea behind the Cartesian Theater. Just like in a theater:
- The action is on stage.
In otherwords, the camera should always looking at the stage. You are not going to get lost pointing off into nothingness.
- You have to sit up straight.
We do not encounter objects in our real live that randomly flip upside down (with the exception of my mother-in-law's westie). We do not sometimes walk into our office to find it inverted and us walking on the ceiling. This is as disorienting in an application as it is in real life. Therefore, the camera in the 3D app must always be "right-side-up". In our case, the "up-direction" of the camera is always in the direction of the positive Z axis.
- You're not allowed backstage.
The Camera is confined to -Y/+Z hemisphere, and can only move 45 degrees positive and negative of Y on the X-Axis. Using the Theater metaphor, the user can only move from the "front row" view to the "catwalk view" (directly above the stage looking down) and can only "sit" from the far-left theater seat to the far-right.
- The theater is not in space.
Objects must rest on the stage which is the X/Y plane in this case. They do not "float" above the stage for no reason.
With the following in mind, I present the first version of my Cartesian Theater application running in a xbap. Click the screenshot below to try running this in a browser. You will have to have dotNet 3.0 installed, and it will probably only work in IE.
Please note the following neato features you might try: The vertical scrollbar controls "Row Angle" or how far down in the theater you are "sitting". The horizontal scrollbar controls "Seat Angle" or how far left or right of center you are sitting. Your mousewheel controls zoom, which is a little wonky right now. Press the A key on your keyboard to show/hide the visible Axis. Click and drag on the boxes around Click and drag on the stage floor (grey) to move the floor
Hope you enjoy. As I have time I will post more updates.
(Credit where credit is due: I am using the super-great Petzold.Media3D library to draw the shapes and Axis. Used with permission.)