Saturday, June 29, 2013

Cockroaches in The Last of Us

Spoiler Free I promise
(Unless you count the roaches as a spoiler)


These little guys might go unnoticed in the game but I am particularly proud of them. This was a tag team effort between Eben Cook and I. With a shout out to Nick Lance and Kurt Margenau a couple of awesome designers I work with. Sometimes our effects team might conceptualize an idea but we don't always have the means to create what we want as it requires support from programmers and it's hard to justify pulling a programmer on to something that most likely is not worth their time. I had been exploring our scripting engine in more depth since the end of Uncharted 3 where I had begun using it quite extensively. It's a very flexible scripting engine similar to Unreal Script and LUA based on LISP. I like it. Let me just put that out there. I love things like this because it allows me to think in ways I may not have before. I always like when there is this complex problem to solve and when I come up with a solution I like to admire it's intricacy. Our dedicated effects programmer Marshall Robin, shortly after Uncharted 3, had given us the ability to declare variables in the root data of our particle systems. These variables could be used in our expression when authoring our effects and we could set the values of these variables at runtime. What all this means is we could change the way our particles behaved on the fly. Muahaha. So with all of this in mind Eben and I thought "You know we could totally make some cockroaches that scurry away in some fashion." So Eben setup the cockroaches. They are aligned with their velocity and while they are not being affected by anything they are just randomly moving about based on some expressions Eben setup in the effect. This is where the root data variables (Rootvars as we refer to them) come into play. We basically have this boolean value in the expression that while set to 0 will have them acting normally just moving about and then when it gets flipped to 1 it triggers a condition in the expression to make them scurry in a direction along the z axis of the particle spawner. We simply add some spawners using our level propagation tool and face their z axes in the direction we want them to scurry in.

The next stage is where I had some fun. So I have all the pieces of the puzzle in front of me. I have a set of functions our designers use for other gameplay purposes but I know they will be what I need to get these roaches working. Additionally I didn't want the script I made to be something we could only use once. I wanted it to be something that any other effects artist could just throw into a level and it would do all the work. To do this I needed to be able to let the artist specify the name of the spawners in the level to perform operations on and I had to allow for any number of spawners. I did set a limit of 100 spawners in the script but if we ever had that many in a level it would be insane. I think the most we ever got up to was 8 or 10. The script spawner allows for a user to specify data directly on the spawner in our propagation tool. So the artist just enters the names of all the spawners for the roaches on the script spawner. For the artist that's it. That's all they have to do. The script itself contains two sections. The first creates a symbol array that we refer to as a group. So the script checks the data on the spawner I mentioned and if that data is specified it adds that roach spawner symbol name to the group. The function that does most of the work here is basically a while loop with a counter. The next section is where the real work is being done. Now that I have a group of symbols I use some functions to create some conditions for the script to check on those symbols every frame. I check the distance between the player and the roach spawner. I check to see if the roach spawner is within a specified radius from the center of the screen. and I check to see if the flashlight state is on. If all three conditions are satisfied it sets the boolean switch (Rootvar) on the roach spawner that has met all of the conditions to 1 and the roaches go scurrying away. The first time I saw it working I pooped a little.

So that's how all that works. It might sound expensive but it was all actually relatively cheap to run because it wasn't all that complex on the runtime side. Of course the more spawners we iterate over the more expensive it would become but it never got to that point and we were always mindful of that. The reason why I loved this whole setup so much was because of what it represents. It represents how flexible our tools have become to allow us to fully realize an effect without having to request any tool support. All the pieces to solve the puzzle and many others like it are at our disposal. While the end result is just some roaches, the concepts we learned and put into practice here have larger applications across other areas when creating effects and completing effects related tasks. This level of creative problem solving takes shape when the tools expose more access to the inner workings of the effects to the artist. I will say that we are super freaking lucky to have the support we do because if it weren't for Marshall exposing the root data to us we couldn't do this and a lot of other things. Also big thanks to Kurt and Nick for showing me cleaner and smarter ways to write the code for the scripts.

Wednesday, June 26, 2013

Visual Effects in The Last of Us: Hometown

Spoiler alert!!!!!
The visual effects in The Last of Us consisted of a wide variety of things ranging from subtle ambient wind effects and insects to in your face molotov explosions. Each artist typically will own a handful of levels and will be responsible for creating the effects needed for that level. Additionally we have to create gamewide effects such as weapon effects and melee effects based on animations that happen all over the game. So just like I did with Uncharted 3 when we finished I'm making some videos and posts detailing what we worked on in the levels we were responsible for but I will also be going more in depth in later posts on some gamewide things that I thought were interesting struggles and the solutions we came up with to make it all work. I really want to shed some light on how we go about creating the effects we do and talk up my teammates because they are amazing. So in short I'm going to be creating a series of videos I'm just gonna call "The Visual Effects of The Last of Us".

Originally when I was told how this level would play out I thought "That's cool I can handle this.". Wrong. But I'm super lucky to have the people I do to work with. Keith Guerrette really stepped up and helped to get this level done. The effects in this level were much more chaotic compared to other areas of the game. This is where the "Uncharted" in me went wild with explosions and sparking wires. I know a downed power line wouldn't spark like that but just go with it.

Joel's House
The first thing I worked on was the burning house on the side of the road and the barn. I used this area to prototype the fires I would use in other areas of the level. I used a lot of those concepts I worked out there for the burning buildings in the town. From there I created the explosions seen upstairs in Joel's room and the fire effects in the video with the reporter on screen. It's funny because I spent a good amount of time on that even though I knew it was going to end up on a small screen in the game. It's also worth pointing out that one of our rendering programmers Ke Xu worked out a way to increase the resolution of the runtime reflections without increasing the cost to render them. So the smaller the object with a reflective material the higher the resolution of the reflection. I constantly would joke with him saying "Reddit will love you for this." Keith stepped up to handle all of the other effects for the downstairs area of Joel's house and the effects for the drive into town. He also made the lens flares for the tops of the cop cars which was really cool. I used those lens flares on the helicopters flying around. We worked together to create some scripts to control the dirt kicked up by the car as it drives so that when the car would brake the smoke would look like it was being lit by the tail lights of the car.

In Town
With Keith's help on the other areas I was able to focus on the chaos going on in the town. It starts with their car being hit by a truck and I must have changed those glass particles like 30 times. The final result came out good though. I created a script to handle all of the events in the town that needed effects. For example the glass as Joel kicks it to each new horrible thing that happens as you move through the town. The gas station explosion had some amazing concept art to go on and I made a material that I thought worked fairly well for gas that shoots out during an explosion and then that gas ignites in mid air. This all happens really fast but it created a nice result. As you approach the end of the street near the theater there's a car that goes rolling by on fire and then explodes. I have the car leaving a trail of gas fire behind it as it rolls but like a lot of things in the level you can't take your time and look around less ye be attacked. As you run out the back of the bar I made some lingering dirt dust where the ambulance went off the road. These kinds of effects are subtle but add a lot of atmosphere to the environment.

The Sad Ending
When we work on cutscenes we have to watch them over and over again typically frame by frame. We don't hear any dialogue or anything but after enough viewings and having seen the mocap from the stage capture you know whats going on. I worked on the typical stuff like blood when the soldier is shot in the head by Tommy and dust as Joel rolls down the hill and scrambles towards Sarah. One of the interesting things I was able to work on was the tears on the characters. I created a hacked together kind of tool that allowed our animators to animate tears running down characters faces and we also used it to apply bloody hand prints from Sarah onto Joel's shirts where she grabs him on the shoulders. This cutscene is very emotional and the tears did a good job conveying that sadness. I'm glad we spent the time on that. Of course The scene wouldn't be what it is without Troy Baker and Hana Hayes. They did such an amazing job portraying those characters. I'll be adding more posts in the coming weeks.

Friday, June 14, 2013

The Last of Us Is Out!

The day has finally arrived. The game is out and we had an amazing turn out at the midnight releases. I will be updating this area with things I worked on in the game and other game vfx related stuff. If you haven't picked up a copy yet I highly recommend it. Not because I am personally invested in it but because I enjoy the shit out of good games and this is a great one. In the meantime checkout the trailer for the making of the game. The making of video is really awesome.