Thursday Jan 08, 2009

Making 3D work over VNC

Dave recently played around with VNC on his computer and an iPod touch. While it worked surprisingly well, the achilles heel of many remote access solutions kicks in when you try doing some 3D stuff, such as a game, Second Life or maybe a scientific application.

This reminds me of one of the best kept secrets at Sun: We fixed the 3D-over-VNC problem.

International Supercomputing Conference 2008, LRZ booth showing 3D remote visualizationJust check out the Sun Shared Visualization Software, it is free and based on open source packages and it works like a charm. For example, here is a picture of the ISC 2008 conference in Dresden where you see a molecular visualization program in 3D stereo at the LRZ booth in Dresden, which is actually running in Garching near Munich.

That's right, the server runs in Munich, the client is in Dresden, there's more than 400km air line in between (probably close to double that in terms of network line) and we saw close to 30 frames per seconds of intricate molecular modeling madness that we could manipulate interactively like if the server was around the corner. In this case, the "server" was a supercomputer that fills the halls of the LRZ compute center, so it wouldn't quite fit the showfloor, thus they used Sun Shared Visualization to deliver the images, not the whole supercomputer, to Dresden.

And this is an increasingly common theme in HPC: As data amounts get bigger and bigger (Terabytes are for sissies, it's Petabytes where the fun starts) and compute clusters get bigger and bigger (think rows of racks after racks), your actual simluation becomes harder to transport (a truck is still the cheapest, fastest and easiest way to transmit PB class data across the nation). The key is: You don't need to transport your data/your simulation/your research. You just need to show the result, and that is just pictures.

Even if it's 3D models at 30 frames per second (= interactive speed) with 1920x1080 pixels (= HDTV) each frame, that's only about 180MB per second uncompressed. And after some efficient compressing, it boils down to only a fraction of it.

This means that you can transmit HDTV at interactive speeds in realtime across a GBE line without any noticeable degradation of image quality, or if you're restricted to 100 MBits or less, you can still choose between interactive speeds (at some degradation of picture quality) or high quality images (at some sacrifice in speed) or a mixture (less quality while spinning, hold the mouse to get the nicer picture). And this is completely independent of the complexity of the model that's being computed at the back-end server.

The Sun Shared Visualization Software is based on VirtualGL and TurboVNC, which are two open source projects that Sun is involved in. It also provides integration with the Sun Grid Engine, so you can allocate multiple graphics cards and handle reservations like "I need 3 cards on Monday, 3-5 PM for my presentation" automatically.

So, if you use a 3D application running on Linux or Solaris and you want to have access to it from everywhere, check out the Sun Shared Visualization Software for free and let me know what you've done with it. Also, make sure to check out Linda's blog, she runs the developer team and would love to get some feedback on what people are using it for.

P.S.: There's some subtle irony in the LRZ case. If you check their homepage, their supercomputer has been built by SGI. But their remote visualization system has been built by Sun. Oh, and we now have some good supercomputer hardware, too.

Monday Apr 28, 2008

Presenting images and screenshots the cool, 3D, shiny way

My daughter Amanda in her 2D cheerfulnessIf you give a presentation about hardware products, it is easy to make your slides look good: Remove boring text, add nice photos of your hardware and all is well.

But what if you have to present on software, some web service or give a Solaris training with lots of command line stuff?

Sure, you can do screenshots and hope that the GUI looks nice. Or use other photos (like the one to the left) that may or may not relate to the software you present about.

But screenshots and photos (to a lesser degree) are so, well, 2D. They look boring. Wouldn't it be nice to present your screenshots the way Apple presents its iTunes software? Like add some 3D depth to your slide-deck or website, with a nice, shiny, reflective underground?

Well, you don't need to spend thousands of dollars with art departments and graphics artists (they'd be glad to do something different for a change) or work long hours with Photoshop or the Gimp (a most excellent piece of software, BTW),  trying to create that stylish 3D look. Here's a script that can do this easily for you!

You're probably wondering why my daughter Amanda shows up at the top of this article. Well, she was volunteered to be a test subject for my new script. The script uses ImageMagick and POV-Ray in a similar way to my earlier photocube script that we now use to generate the animated cube of the HELDENFunk show notes. It places any image you give it into a 3D space and adds a nice, shiny reflection to it. Let's see how Amanda looks like after she's been through the script:

-bash-3.00$ ./ -s 200 Amanda_small.jpg
Fetching and pre-processing file:///home/constant/software/featurepic/Amanda_small.jpg
Rendering image.
Writing image: featurepic.jpg

Amanda, in her new 3D shininess

The size (-s) parameter defines the length of either width or height of the result image, whichever is larger. In this case, we choose an image size of a maximum of 200x200 pixels, so the image can fit this blog. You can see the result to the right. Nice, eh?

As you can see, her picture has now been placed into a 3D scene, slightly rotated to the left, onto a shiny, white surface. More interesting than the usual flat picture on a blog, isn't it?

The script uses POV-Ray to place and rotate the photo in 3D and to generate the reflection. ImageMagick is used for pre- and post-processing the image. The reflection is not real, it is actually the same picture, flipped across the y axis and with a gradient transparency applied to it. That way, the reflection can be controlled much better. I tried the real thing and it didn't want to look artistic enough :).

The amount of rotation, the reflection intensity and the length of the reflective tail can be adjusted with command-line switches, so can the height of the camera. Here's an example that uses all of these parameters:

-bash-3.00$ ./ -h
Usage: ./ [-a angle] [-c cameraheight] [-p] [-r reflection] [-s size] [-t taillength] image
-p creates a PNG image with transparency, otherwise a JPEG image is created.
Defaults: -a 15 -c 0.3 -r 0.3 -s 512 -t 0.3
-bash-3.00$ ./ -a 30 -c 0.1 -r 0.8 -s 200 -t 0.5 Amanda_small.jpg
Fetching and pre-processing file:///home/constant/software/featurepic/Amanda_small.jpg
Rendering image.
Writing image: featurepic.jpg

Amanda with more shinynessThe angle is in degrees and can be negative. One good thing about rotating the image into 3D is that you gain horizontal real estate to fit that slightly longer bullet point in. It helps you trade-off image width for height without losing too much detail. An angle value of up to 30 is still ok, I wouldn't recommend more than that.

The camera height (-c) value is relative to the picture: 0 is ground level, 1 is at the top edge. The camera will always look at the center of the image. Camera height values below 0.5 are good because a camera below the subject makes it look slightly more impressing. Values above 0.5 make you look down at the picture, making it a bit smaller and less significant.

The reflection intensity (-r) goes from 0 (no reflection) to 1 (perfect mirror) while the length of the reflection (the fade-off "tail", -t) goes from 0 (no tail) to 1 (same size as image). Smaller values for reflection and the tail length make the reflection more subtle and less distracting. I think the default values are very good for most cases.

Check out the -p option for a nicer way to integrate the resulting image into other graphical elements of your presentation. It creates a PNG image with a transparency channel. This means you can place it above other graphical elements (such as a different background color) and the reflection will still look right. See the next example to the right, where Amanda prefers a pink background. Keep in mind that the rendering step still assumes a white background, so drastic changes in background may or may not result in slight artifacts at the edges.

Amanda loves pink backgrounds!

You can also use this script with some pictures of hardware to make them look more interesting, if the hardware shot is dead front and if it doesn't have any border at the bottom. Use an angle value of 0, this will place your hardware onto that virtual glossy carbon plastic that makes it look nicer. See below for an embellished Sun Fire T5440 Server, the new flagship in our line of Chip-Multi-Threading (CMT) servers.

This script should work on any unixoid OS, especially Solaris, that understands sh and where a reasonably recent (6.x.x) version of ImageMagick and POV-Ray are available.

You can get ImageMagick and POV-Ray from their websites. On Solaris, you can easily install them through Blastwave. The version of ImageMagick that is shipped with Solaris in /usr/sfw is not recent enough for the way I'm using it, so the Blastwave version is recommended at the moment.

The Sun Fire T5440 Server, plus some added shinyness.The script is free, open source, distributed under the CDDL and you don't have to attribute its use when using the resulting images in your own presentations, websites, or other derivative work.

It's free as in "free beer". Speaking of which, if you like this script, leave a comment or send me email at constantin at sun dot com telling me what you did with it, what other features you'd like to see in the script and where I can meet you for some beer :).



Tune in and find out useful stuff about Sun Solaris, CPU and System Technology, Web 2.0 - and have a little fun, too!


« April 2014