Bringing the illusion of life to VR with animated entities

Bringing the illusion of life to VR with animated entities

Howdy folks! Caitlyn here with the High Fidelity content team!

One of the most exciting things about working at High Fidelity is exploring the capability of this amazing new technology. As an emerging platform, written from scratch specifically for social VR, each day we find new possibilities for experiences unlike any other.   We on the Content Team are among the first to try out these new features in a real use case, which is not only practical for development, but a heck of a lot of fun.  Personally, one of the most rewarding and enjoyable aspects of VR and game design is creating the illusion of life with animated characters and objects.  Let’s take a look at some animated entities in High Fidelity and the related workflow, so you can bring life to your domain.  I'm personally a Maya kind of gal, but the concepts discussed below are pretty much the same if you use Blender, 3DS Max, etc etc etc.

Over the last week, I’ve been focusing on refining and adding some new content to our Playa domain, a vast, Burning Man inspired sandbox where multiple users can explore, play, converse and interact together.  I figured this would be a great place to add life using our animation system.  

I want to believe!  This flying saucer, known to harass cows in High Fidelity, is in fact an animated entity.

I want to believe!  This flying saucer, known to harass cows in High Fidelity, is in fact an animated entity.

If you look around the Playa's skies, you may occasionally catch a glimpse of an unidentified flying object.  This flying saucer is actually an animated entity created in Maya using keyframe animation.   The first challenge in this project was to figure out a way to overlay the saucer with the scale and space of world itself.  Since the Playa is built in High Fidelity out of many separate pieces, you can’t just import the world into Maya and animate around that.  So, for starters, I placed the UFO at the origin (0,0,0) in Maya and snapped it as the very first keyframe, which I used to align at the origin of the Playa scene.   The actual animation cycle doesn't actually involve the origin, though, and so the loop that you see is running from frame 2 and onward.  Being aligned at the origin, it’s easy to therefore figure out a path around the Playa by looking at it from above.  To do this, I took a map-like snapshot from above the domain and projected that as a reference texture on a temporary plane below the UFO in Maya.  From there I was able to figure out the way-points on which I would base the animation.

The curves which operate our flying saucer.  The linear spaces are spots where the saucer hovers in one spot.

The curves which operate our flying saucer.  The linear spaces are spots where the saucer hovers in one spot.

To create the animation itself, I used a combination of keyframes over the way points with linear interpolation.  Once the saucer was moving correctly from spot to spot, I made things fluid by making them spline curves in Maya's graph editor and slightly redistributing the keyframes of each channel, so there isn't a linear, Mr Roboto type movement where all keyframes land on the same frame at the same time.  This technique works very well in animation in general, by the way, if things are looking too robotic, and an easy way to bring life to pose-to-pose animation.  One important takeaway from this is you must bake your curves into individual keyframes when it’s time to export the FBX, using Curves > Bake Channels in the Graph Editor.  High Fidelity greatly prefers its keyframes baked. 

High Fidelity expects animation curves to be baked.  Here's the same curves after being baked in Maya's graph editor using Curves > Bake Channels.

High Fidelity expects animation curves to be baked.  Here's the same curves after being baked in Maya's graph editor using Curves > Bake Channels.

What would attract a UFO to the Playa?   No doubt, it would be cows, who aliens find strangely irresistible.  The exact details of this bovine/Martian relationship are classified, but we can say with certain confidence that these cows are animated entities. They follow a simple 130 keyframe loop. Unlike the UFO, they have an additional script to right them if they get tipped, knocked over or thrown by some delinquent avatars.  If you’ve got hand controllers and a slightly bent nature, have a go at throwing them around.  It’s OK, they’ll get right back up (and they're not real cows).

There's many a stray bovine found wandering the Playa.  Fun fact - in addition to being animated entities, they also have physics enabled and can be tipped, picked up, thrown around.  As if being abducted by the saucer weren't bad enough.

There's many a stray bovine found wandering the Playa.  Fun fact - in addition to being animated entities, they also have physics enabled and can be tipped, picked up, thrown around.  As if being abducted by the saucer weren't bad enough.

I thought it’d be fun to have a rusty little robotic park ranger around, to keep an eye on things and help people find their way around.  While he’s a few RAM chips short of a pocket calculator, our rusty little robo-ranger, Cicero, operates with teraflops of enthusiasm.  He can be found hanging around atop the Burger Drome sign in the center of the Playa.  He was terrific fun to animate, also in Maya, using the same techniques described above.  If you look at his entity properties, you’ll see his animation runs from frames 1 to 1330 at 65 fps-- originally at 30, but 65 gives him more zing. 

Cicero is our rusty and dusty park ranger droid, who keeps an eye on the Playa!

Cicero is our rusty and dusty park ranger droid, who keeps an eye on the Playa!

Cicero's entity properties reveals both the model and animation URL, as well as the frame settings.

Cicero's entity properties reveals both the model and animation URL, as well as the frame settings.

 You will also see there’s two text fields with URLs there, one for Model URL and another for Animation URL.  Even if your model file itself contains animations, you’ll still need to put the URL in the animation field to specify that the system should parse that animation data.  You can also put the URL to another FBX if it has animation data that matches the content in your Model URL.

Cicero's animation curves in Maya before being baked.

Cicero's animation curves in Maya before being baked.

While these examples are straightforward, looping animations, I hope they give you a small taste of the immense smorgasbord of possibilities with animated entities.  If coupled with some basic scripts to control animation, they can be made to bring an even greater illusion of life to your virtual reality domains. We look forward to seeing what you create! 

See in you the metaverse!

Caitlyn

 

Hello! I'm Caitlyn Meeks, Director of Content at High Fidelity Inc in San Francisco.  We're busy making the metaverse!