This video is a reel of the FX work I did on Marvel Ultimate Alliance 2 for Xbox 360/PS3 in 2009. Made using Vicarious Vision’s proprietary tools. Note: There’s no audio. It’s not you.
At the tail end of my stint at Inland Productions, I did a few snowmobiles for their port of Midway’s Arctic Thunder to the PS2 and XBox, but I left for Sony before it was completed. These vehicles were additions to the ones from the arcade version and were my own concepts, models, and textures. Basically they are tricked out, over the top, arcadey snowmobiles.
When I was at Vicarious Visions working on Spiderman 3, artists were responsible for building collision geometry. More often than not, a bounding box was the recommended collision type.
Once we started doing Interiors with the system, it became apparent that folks needed a better way to make an OBB and AABB for selected geometry, so I created a tool in Maxscript that let them easily do so. I can’t share the code, but below is a video that I made while I was working there to introduce the PaintOBB tool to the artists on the team.
The idea was to let the artist invoke the tool, then paint over faces on the selected model. The tool would then generate a first pass bounding box based on the selection. Then the user would move their mouse along the desired axis, and the box would shrink wrap to fit around the geometry, creating the most efficient OBB with minimal work.
Here’s some artwork from one of my first titles. You’ll see a bunch of what look like satellite imagery. These were overhead maps that the player would use to choose their starting location. Some were 8 miles by 8 miles if I remember correctly. Others were a little closer up, like 1 mile by 1 mile. These were really fun to build. I’d receive an ugly looking snapshot of the world like this:
Then I’d take it into Max, get the heightmap for the level, displace it, light it, and then use that for a shade map. Then I’d take the whole thing into Photoshop and start painting it up. Sometimes I’d do it up and make a spec map on the water or bump maps on the forests and rerender it.
Then there is a sheet of tile textures that I did for a winter level. The system for this game was actually kind of cool, and was a precursor to systems I would use years later on Spiderman 3. It was a tiling and instancing system that allowed the world to be miles across. So those little square textures would each be one quad on the map. Then using a tile builder, a roughly 16×16 quad tile would be populated with trees and other entities. Then that tile would be arranged on the world map.
The upside of this is a huge world. The downside is that the world was quite repetitive. Anyhow, it was a hunting game. It was 1999. People liked this kind of thing.
Last there were a few low poly models in there too. I show those just to say hey, I made a bunny in under 100 triangles. Those models were even rigged and animated. I’ll see if I can dig it up, but I have a sick bunny hopping loop that this portfolio is sorely lacking.
Ok so this is a funny project to show for me for a few reasons. First, it is O-L-D. I did these before I was even in the game industry, right out of college. Second, I’m not a mechanical modeler by trade, but I can certainly do it if called on, and I like showing that. We all have favorite projects and this is one of mine. It was done in 3DSMax v2 or somewhere around that vintage.
It was a real blitzkrieg of a schedule, and I was holed up in my studio for a month or so modeling these things with just brochures for reference. There was rarely a good orthoganal shot and no measurements besides broad dimensions. And on top of that I was working on a Pentium-Pro 200 which was a 10th the speed of an iPhone!
Also of note was that this was way before the days of your fancy newfangled Global Illumination renderers. This is pure Max scanline baby. And of course it still took 10 minutes to render each shot.
Still, it was fun. The project was for training software for this pump manufacturer, and I also had a hand in the UI design as you can see in the last shot. There were animations as well but they weren’t very interesting, just showing a line traversing a cross section of the pump.
I still get excited when I’m out and come across a pump.
This example shows a relatively low-poly head rigged with bones for the standard lipsync viseme targets. This was matched to a system called Animeter that has since been bought and sold a bunch of times. Anyway, the standard targets still apply now.
So, the way this guy works is that we have a head model that is rigged and animated to a different morph target every 5 frames. The script creates a button in the head object’s rollout called “Create Morpher Head”. When the artist hits the button, Max snapshots the head along the timeline to create morph targets. It then assigns the targets to a base head with the Morpher modifier. Then you’re ready to roll.
The advantage to this is that since morphs are always topology dependent, we can’t tweak the model very much without ruining the rig. So instead, we make modeling changes to the skinned head and regenerate the morph targets from there. This can save artists a bunch of time.
Below is the source for the script.
makeHeadCA = attributes makeHead ( parameters main rollout:params ( makeHeadBtn type:#boolean ui:makeHeadBtn ) rollout params "Make Morpher" ( button makeHeadBtn "Create Morpher Head" on makeHeadBtn pressed do ( headBasis = $ nameArray = #("head_player_none_male","Eat","Earth","If","Ox","Oat","Wet","Size","Church","Fave","Though","Told","Bump","New","Roar","Cage","EyebrowRaiseLeft","EyebrowRaiseRight","BlinkLeft","BlinkRight","LookUp","LookDown","LookLeft","LookRight","EyebrowRaiseBoth","BlinkBoth") sliderTime = 0f headPosX = 0.5 headDone = 1 global headMorphs = #() --snapshot the main head for i = 1 to nameArray.count do ( newHead = snapshot headBasis headPosX = headPosX + .5 newHead.name = nameArray[i] newHead.pos.x = headPosX append headMorphs newHead sliderTime = sliderTime + 5f ) sliderTime = 0f --now add the morpher plus the targets mainHead = headMorphs addmodifier mainHead (morpher()) global theMorpher = mainHead.morpher select mainHead for i = 1 to (headMorphs.count - 1) do ( print ("adding " + headmorphs[i+1].name) WM3_MC_BuildFromNode mainHead.morpher i headMorphs[i+1] ) ) ) ) CAs = custattributes.getdefs $head_basis.skin if CAs.count > 0 then ( for i = 1 to CAs.count do ( custattributes.delete $head_basis.skin i ) ) custAttributes.add $head_basis.skin makeHeadCA
This project was done for a friend who worked at Scripps Institute in San Diego, CA. Their technology using carbon nanotubes for medical magic of some sorts was given the cover of Chemical and Engineering News, so they needed a cover image. Really fun project! I’d love to do more medical illustration because people get really excited seeing their ideas visualized.