kelly

This user hasn't shared any biographical information


Posts by kelly

Mars Structure Art Study

This is a study I did to get some time in with Substance Painter 2.5.


Rendered in Unreal 4

mars_painterRendered in the Substance Painter viewport.

ih_martian architecture_08d The exercise was a lot of fun, particularly painting in Substance Painter.  It has it limitations, esp in regard to “standard” bitmap operations like cut, paste, transform, etc. However, it is incredibly fast for material assignment and procedural effects, like edge wear.  The resolution independence was very nice too.  I’ve never painted an asset so quickly.

It is based on an old Red Faction Guerrilla Concept.

I hope to find some time to play around with Quixel soon.

Unity Demo01

This video is a WIP of a demo I’ve been throwing together in Unity to explore and better understand its capabilities and use of c# scripting and shaders.

This has been my first real foray into Unity “hands on” and I estimate I’ve spent between 60-80 hours over the course of about a month working on it so far, having started during the Winter holiday.

It has been a blast and time permitting I will get back to the missing aspects and polish soon.

MotionBuilder get final camera rotations

GOURCE visualization of ‘vmobu’

For fun, I used the open source gource app to generate this video. http://gource.io/

 

To create it I had to pull changelist data from our perforce server and conform it to a log format that gource would use. To accomplish this, I made this quick little python script, intended to be run from a console.

python script.py "depot_path" "output.gource"
gource output.gource -o gource.ppm

With the “script.py” being this script:

import P4
import os
import sys
from optparse import OptionParser

P4_ACTION_TO_GOURCE = {
	"add"				: "A" ,
	"branch"			: "A" ,
	"edit"			: "M" ,
	"move/add"		: "M" ,
	"integrate"		: "M" ,
	"delete"			: "D" ,
	"move/delete"	: "D",
	"purge"			: "D"
}

class P4_Connect( object ):
	"""
	Context manager that connects a p4 instance on entry if it is not connected and disconnects on exit.

	Also, p4 exception level is raised to Errors.

	**Arguments:**
		:``None``: ``

	**Keyword_Arguments:**
		:``p4_instance``: `P4.P4` Optional P4 instance rather than creating one on the fly.

	**Returns:**
		:``None``: ``

	**Examples:** ::
		>>> with P4_Connect() as p4:
				p4.run_sync()

	**Author:**
		* kelly.snapka, kelly.snapka@volition-inc.com, 6/25/2016 9:05 PM
	"""
	def __init__( self, p4_instance=None ):
		self.p4_instance						= p4_instance or P4.P4()
		self.exception_level					= self.p4_instance.exception_level
		self.p4_instance.exception_level = P4.P4.RAISE_ERROR


	def __enter__( self ):
		self.isConnected = self.p4_instance.connected()
		if not self.isConnected:
			self.p4_instance.connect()

		return self.p4_instance


	def __exit__( self, type, value, tb ):
		self.p4_instance.exception_level = self.exception_level
		if not self.isConnected:
			# Only disconnect if a connection was made in the __enter__ method
			self.p4_instance.disconnect()


def printProgress (iteration, total, prefix = '', suffix = '', decimals = 1, barLength = 100):
	"""
	Call in a loop to create terminal progress bar
	@params:
		iteration   - Required  : current iteration (Int)
		total       - Required  : total iterations (Int)
		prefix      - Optional  : prefix string (Str)
		suffix      - Optional  : suffix string (Str)
		decimals    - Optional  : positive number of decimals in percent complete (Int)
		barLength   - Optional  : character length of bar (Int)
	"""
	formatStr       = "{0:." + str(decimals) + "f}"
	percents        = formatStr.format(100 * (iteration / float(total)))
	filledLength    = int(round(barLength * iteration / float(total)))
	bar             = '*' * filledLength + '-' * (barLength - filledLength)
	sys.stdout.write('\r%s |%s| %s%s %s' % (prefix, bar, percents, '%', suffix)),
	if iteration == total:
		sys.stdout.write('\n')
	sys.stdout.flush()
	

def get_options():
	usage		= "Usage: %prog [options] DEPOT_PATH OUTPUT_FILE"
	parser 	= OptionParser( usage )
	return parser.parse_args()

def build_log( depot_path, *args ):
	log = ''
	with P4_Connect() as p4:
		changes = p4.run_changes( depot_path, *args )
		changelist_numbers = [ d['change'] for d in changes ]
		changelist_numbers.reverse()

		_depot_path = depot_path.split("...")[0]
		num_changelists = len( changelist_numbers )
		for n in range( num_changelists ):
			changelist_number = changelist_numbers[ n ]
			printProgress( n+1, num_changelists, prefix = 'Progress:', suffix = 'Complete', barLength = 50)
			descriptions = p4.run_describe( '-s', changelist_number )

			for d in descriptions:
				timestamp	= d.get( 'time' )
				author		= d.get( 'user' )

				num_files = len( d.get( 'depotFile' ) )
				for i in range( num_files ):
					action		= P4_ACTION_TO_GOURCE[ d.get( 'action' )[i] ]
					depot_file	= d.get( 'depotFile' )[i]

					if _depot_path in depot_file:
						log += '{0}|{1}|{2}|{3}\n'.format( timestamp, author, action, depot_file )

	return log


def write_log_to_disk( p4_log, gource_file ):
	with open( gource_file, 'w' ) as file:
		file.write( p4_log )


if __name__ == "__main__":
	options, args	= get_options()
	depot_path		= args[0]
	gource_file		= args[1]

	p4_log = build_log( depot_path )
	write_log_to_disk( p4_log, gource_file )

Locate pydevd at runtime

One of the quirks in remote debugging an application with PyCharm is that you need to be able to import the proper pydevd package.  This tends to change location with every PyCharm installation and update.  Rather than hardcode these paths and check against the installed version of PyCharm to locate them, I’ve found it convenient to simply use a running instance of PyCharm to locate the location of the pydevd that I need to import into the client app.

Once you have the path, you can append it to you sys.path or import it directly with a module like “imp”.

Eitherway, here is the snippet that locates pydevd for the running instance of PyCharm…

import os
import sys
import win32com.client

def get_pydevd_path():
	"""
	Gets the pydevd path based on locating the executable path of a running PyCharm process.

	**Arguments:**
		None

	**Keyword Arguments:**
		None

	**Returns:**
		:``pydevd_path``: `<str>` E.G. "C:/Program Files (x86)/JetBrains/PyCharm 4.0.1/pycharm-debug.egg"

	"""
	pydev_path = None

	WMI = win32com.client.GetObject( 'winmgmts:' )
	processes = WMI.InstancesOf('Win32_Process')

	for process in processes:
		if 'pycharm' in process.Properties_('Name').Value:
			path = process.Properties_('ExecutablePath').Value
			p = os.path.abspath(os.path.join( os.path.dirname(str(path)), '../debug-eggs/pycharm-debug.egg'))
			if os.path.exists( p ):
				pydev_path = p
				break

	return pydev_path

Debugging Motion Builder Scripts in PyCharm (3.4)

So, you want debug python in MoBu with PyCharm but either aren’t sure how to set it up or missed some detail along the way.  Well, this post should help.

Note: Much of this information holds true for Maya and other applications with integrated python. More >

Python FBX SDK, brief intro…

I had the opportunity to crack open the Python FBX SDK the other day.  Doing so happily validated many assumptions I had made confirming that I can read\modify\write .fbx files without going through a DCC.   While not hard to overcome, I thought it might be nice to have some of the initial items I stumbled on collected in a single post.

First, get the Python FBX SDK  here: http://usa.autodesk.com/fbx/

Second, be aware that due to its c++ underpinnings it relies heavily on iterators to build up collections.  This was a little foreign to me as I’m used to looping through existing loops.  For example, to build a list of properties on an object one needs to enter a while loop until an invalid property is returned…

props = []
prop = obj.GetFirstProperty()
    while prop.IsValid():
        if prop.GetFlag(FbxPropertyAttr.eUser):
            props.append( prop )

        prop == obj.GetNextProperty( prop )

Third, the python exposure of FBXProperties has no “get()” method. So, you have to cast it into a appropriate property type that does.  I found a post on Autodesk’s Area that covers this well.

http://area.autodesk.com/forum/autodesk-fbx/fbx-sdk/fbxpropertyget-in-20131-python/

Fourth, Python FBX SDK is highly enumerated.  An example of this is in the code above where I inspect a property to see if it is a custom, user defined property.

if prop.GetFlag(FbxPropertyAttr.eUser):

Well, that’s about it for now.  I’m pretty excited about the doors opened by being able to leverage this library in standalone python scripts.

THQ is no more…

The studio I work for, Volition, has been auctioned off with the winning bid going to Koch Media. While we’ve seen this coming for a while and I’m thankful Volition has made it through these troubled times I’m still in shock and have many questions.

Here is the official THQ letter to its employees:

More >

Exporting to FBX from MAX (Morpher Issues)

I’ve been looking into porting assets to Maya, MotionBuilder, Softimage via FBX. One problematic area I ran into early on was that of the ‘Morpher’ modifier…

To maintain quads, be sure to do the following:

  1. All mesh objects should be of class ‘Editable_Poly’
  2. In the exporter options, “Preserve Triangle Orientation” should not be checked.

Morpher compatibility…

  1. It seems that only the top most MORPHER modifier is exported with FBX. The others are ignored.Furthermore,it seems that morpher modifiers are limited to 100 channels. While you can set channels above this in mxs, the results are not as intended and I’ve only seen one channel above 100 work and it seems to be any index over 100.
  2. All morph targets need to exist in the scene as objects and targeted via the MORPHER ui. Failing to do this will result in the channel names being truncated to the first letter of their name. IE “Jaw_open” and “Jaw_back” both become “J” and “J” respectively. A script below helps address this by extracting and re-targeting morph target objects embedded in the MORPHER modifier.

More >

Facial Animation R&D

For years now, we’ve been using morph target based facial animation on our games at Volition. At the start of a new project there is a typical “bones vs. morphs” debate that occurs and we’ve always stuck to what we know. In the past, I’ve been on the recipient side of reviewing the results of debates and proposals. On a recent project, I had the opportunity to dive into this topic more hands on and I was quite surprised to hear myself recommending a ‘bones based’ approach…

You need to install or upgrade Flash Player to view this content, install or upgrade by clicking here.

NOTE: Normal map is inverted and wrinkle maps are not setup or shown here.
  • I made this simply to get an animated facial bone setup that we could use to test in our engine.  It is by no means final or indicative of quality. The animation is rough as quality of the performance was not under evaluation here.
  • This video is a screen capture from within 3ds Max of a 44 facial bone  setup (counting head, jaw, and tongue too).
  • I setup and animated the head in Softimage:Face Robot.
  • I did the eyes and head movement by capturing mouse tracking. The eye blinks were captured by setting keys during playback.
  • Lipsync was done with SI’s lip sync tool and it did a very nice job imo.

Head (work-in-progress) model courtesy of Ben Eoff.

More >

Performance Opt. for 3ds Max 2012 – Disable Hidden Skin & Morpher

It seems the 3ds Max 2012 is still processing Skin and Morpher modifiers when their geometry objects are hidden.  So, this quick snippet just toggles the modifiers onoff across the entire scene based on their objects’ visibility.

mapped fn toggleSkinMorph_basedOnVis obj = (
   modA = obj.modifiers
   for m in modA do (
      if classof m == Skin or classOf m == Morpher then (
         m.enabled = not obj.isHidden
      )
   )
)

toggleSkinMorph_basedOnVis $geometry

SR3 Screenshots…

It is becoming increasing difficult to “capture” the essence of a game that is in motion in a single screenshot. We did make use of various techniques to compose screenshots that were representative of the player’s experience. Everything was captured from the game, but frequently composited or at a minimum balanced in Photoshop. Here is a collection of screens that I contributed using such techniques for SRTT (think of them as video game photography):

SR3 Jobsheet – Cutscene Lighting Pass

Here is an example jobsheet that I made for the Lighting Pass on a SR3 Cutscene:

High level documentation and examples helped outline the style we were aiming for. This document provided specifics and immediate goals including which colorscript (separate reference) to refer to .

SR3 Cinematics Progressed per the following:

  1. script
  2. storyboard
  3. animatic
  4. animation pass
  5. facial pass
  6. lighting & fx pass

SR3 Jobsheet – Cutscene Prop

Here is an example jobsheet for one of the many cinematic props for SR3 that I directed the outsourcing on:

These props were significantly simpler to execute with outsourcing as they only appeared in cinematics.  Standard game constraints and specifications did not need to be adhered to (e.g. no need for collision models).

We did author these a little higher resolution than normal items in the game would normally be as they were intended to be viewed in the cinematics.

SR3 Jobsheet – Cutscene Animation Pass

Here is an example of a jobsheet for an Animation Pass on a SR3 Cutscene:

At this point in the process, the focus is on integrating final assets including:

  • Final set
  • Final characters
  • Final props
  • Final vehicles
  • Mocap & secondary animation
  • Any change requests that have developed

SR3 Cinematics Progressed per the following:

  1. script
  2. storyboard
  3. animatic
  4. animation pass
  5. facial pass
  6. lighting & fx pass

SR3 Vehicle Documentation

Here are some thumbnails from a document I assembled for the outsourcers working on vehicles for SR3.  The vehicles technical specifications were complex and this document attempted to breakdown what was expected of the vendor, in what order tasks should be performed, and provide reference to technical details they would need to adhere to.

MXS Transform Test

Objects in 3ds Max will typically need to have “clean” transforms.  It is quite easy to invalidate them via non-uniform scales or mirroring. I wrote a simple script to identify objects submitted to us by our vendor that are in need of correction.

The script checked for offset pivots, mirrored  objects, and non-uniformly scaled objects.

Here is an example of the feedback dialog that the user would be presented with.

SR3 Vehicle Jobsheets

Below are some SR3 Vehicle Jobsheet examples.

  • One key goal with these jobsheets was to place all key information onto a single page that can be viewed at once in a single window, second screen, or printout.
  • Furthermore, all text in the jobsheet is kept in an editable format that may be more easily translated by foreign vendors (in contrast to baking text into an image as one might with Photoshop).

SR3 Jobsheet – Cutscene Animatic

Here is a example jobsheet for a SR3 Cutscene Animatic.

In each of the jobsheets, we tried to provide:

  • Context
  • Camera Direction
  • Asset List & file locations (which included pre-approved 2D storyboards & rough audio)

One of the many challenges we encountered at this stage were the unfinished nature of assets, like the set.

SR3 Cinematics Progressed per the following:

  1. script
  2. storyboard
  3. animatic
  4. animation pass
  5. facial pass
  6. lighting & fx pass

SR3 MXS Convert Pattern Maps

We discovered, after the majority of assets were authored, that we needed to convert our PC pattern maps to the technique we were using with NPC’s.  Pattern maps were used to customize the characters by replacing the pure RED, GREEN, or BLUE with a new color via the shader at runtime.

Rather than stick someone with the tedious task of reworking all of these bitmaps by hand, I created a maxscript that handled the heavy lifting.  Details below:

You need to install or upgrade Flash Player to view this content, install or upgrade by clicking here.

Here is an overview of how the script works.  It has  THREE main operations:

  1. Convert PC pattern maps to NPC pattern maps, as follows:
    1. Renders existing pattern maps (UV3) out to UV1…
    2. Converts the color setup from PC to NPC…
    3. Combines the Pattern & Diffuse…
  2. Renders out Decals on UV1.
  3. Ports shaders from PC to NPC materials.

Bake Multi Low Poly Meshes to Single Low Poly Mesh

We had the need on SR3 to bake game resolution mesh elements down into an even simpler version, specifically in the waist/hip area.  We were experiencing issues with the belts and accessories in this area having intersection issues with other assets and we did not want to outright hide them.  So, I threw the following tutorial together for the artists to make a pass on addressing the issue.  LINK

SR3 MXS Toggle Character Bitmap Size

This was a quick script that I threw together to help with outsourcing.  I needed to be able to quickly check for an evaluate the delivered high resolution and low resolution bitmaps authored for the character assets.

To toggle between the large and small maps, the script looks at the materials and finds the bitmaps in use. Then it looks on disk for it’s counterpart and swaps the entry in the material.  Simple stuff, but it makes the workflow of selecting a character and running the script much faster than doing it by hand.  The only requirements are that the filenames use the naming conventions already established, that is “_SM” for small and “_LG” need to appear somewhere in the filenames.

By default, the script runs on all selected objects toggling the maps highlighted in the scripts gui.  You can <CTRL> or <SHIFT> click to add or remove maps from the selection.  If a new map type needs to be added, it can easily be done in the script.

SR3 Character VID’s Demonstration

Saints Row 3 features a highly customizable Player character.  The player may choose their sex, race, body proportions, facial features, hair styles, make-up, and off course what the character wears.  The paperdoll system enforced a series of constraints via templates that were followed by the artists.  This allowed some amount of predictability and in turn the ability to handle different combinations of clothing.

One such feature that helped enable this was the use of VID’s.  The acronym is not important, but I believe it is simply “Volition ID” and was essentially just an index assigned to a face.  We used these grouping to identify regions of the character mesh that could be toggled on/off.  Assets needed to be modeled to make use of these groups, in particular match up with the seams.

To help explain, visually, how this works for the artists I assembled the video below.

You need to install or upgrade Flash Player to view this content, install or upgrade by clicking here.

SR3 DX9 Shader to Simple Shader

This post shows a simple script & shader that I wrote to workaround an issue and better visualize the results an artist would see with their asset further down the pipeline in game.  This was by no means an ideal solution and was only a bandaid.

You need to install or upgrade Flash Player to view this content, install or upgrade by clicking here.

NOTE: The intended audience of the video was a group of outsourced artists.

The issue:

Our game materials are authored in a proprietary editor that generates multiple shaders for different targets, such as different hardware consoles or optimizations.  One such target is a DX9 shader that is viewable in 3ds Max.  Unfortunately, Max handles normal maps inversely from how our game renderer handles it and the tool did not account for this in the hlsl that it generated.  This meant that it was difficult for the artist to identify and correct normal map seams early in the process (prior to exporting and viewing in game, which many outsourcers did not have the ability to do).

This was a known, long standing problem and existed on the work backlog for one of our employees to address.  Unfortunately it was lower priority than other work yet was still deemed to be something that would get resolved properly and ‘soon’ by the individual. Rather than step on his toes and avoid jumping into, admittedly unfamiliar, c++ territory for the proprietary editor I implemented a quick solution…

The solution:

  • I authored a simple dx9 shader that would properly display our game’s normal map format in the 3ds Max viewport.  This shader was very stripped down to the basics…diffuse map, normal map, and ambient color.
  • I authored a simple maxscript gui to …
    • control toggling between the game shader and this simple diagnostic shader (non destructively using scene states)
    • toggle map and parameters on\off quickly

SR3 Outsourced NPC Feedback…

Here is an example of typical feedback I would provide the vendor.  The format was essentially visual aid with labels that corresponds to an expanded list of text direction.  The reason for this is that the visuals help communicate the text and the text is easily translatable into the native language.

  1. Proportions do not match Zimos B or the Heroic Male Skeleton.  Please correct. Related to proportions, the shoulders need to be higher and slightly wider.
  2. Add the unbuttoned buttons
  3. Indicate the pockets in the fabric.
  4. Crotch should be just visible.
  5. These areas are  short-“furry”
  6. If the boots  can’t work with the skeleton’s pivot points and floor, replace them with normal boots  that do not have platforms.
  7. Pants should hang lower over boots.
  8. Rhinestones should be visible in the sculpt
  9. Rhinestones should be visible in the sculpt

‘nother trip to Shanghai

I’m back from Shanghai, all caught up with work and finally over my jet lag from the 2 week trip. We visited several of the partners that we’re currently working with. Our goals were relatively simple. Primarily we wanted to get some face time with the people who we’ve been communicating with almost solely through email.

Click here for more (and photos)…

SR3 PC Outfit Jobsheet…

Here is an example jobsheet that would be sent to a vendor to create a collection of assets that would make up an outfit that could be worn by a highly customizable male or female player character in combination with out clothing assets.  IIRC, I directed outsourcing for some 60+ outfits and 40+ hair pieces.

Higher level stylistic and technical guides were provided.  Many rules and templates had to be adhered to in order to make everything work.  Even then, our team spent a significant amount of time fixing problem combinations we missed in planning the setup.

My recommendation…avoid customization unless it is critical for your game.  It is very difficult, costly at runtime, and never results in characters that look as good as those that are created unique.  Still, it is fun for the player.

San Diego Trip, THQ Art Council & Comic Con

I’m late on posting this, but I felt I should add a note about my business trip to San Diego.

I serve on the THQ Art Council representing Volition.  The council meets in person every so often and a meeting was held at the THQ San Diego studio just prior to comic con. This was a great opportunity to get together with the other council members and talk shop.  Obviously it would be inappropriate for me to post meeting details here, but I can say that it was very productive and I think THQ is making some great steps.

Click for more…

SR3 NPC Jobsheet…

Here is an example NPC Jobsheet.  IIRC, I directed the outsourcing of a little over 130 non player characters.

Here is the resulting character in 3ds max.  The solid colors are areas set in the game via it’s shader.  Also other artifacts are present in the max viewport that appear correct in the game, such as normal map seams.

Moving On…

My blog has been silent for a while as I’ve been frantically preparing for a major change.  Here’s the news:

  1. I’m stepping down as Studio Art Director at Volition Inc. and am moving into an Art Director role, remotely overseeing outsourcing on a new project. Expand…
  2. My wife and I are moving to Seattle
    Expand…

  3. Here are some pictures of our new house in Monroe, WA
    Expand (photos)…

  4. Here are some pictures of the house we’re selling in Champaign, IL.  2 business days on the market and several offers, 1 pending!
    Expand (photos)…

(art test) – Heist Animatic

I recently took one of our old internal art tests.  I do these from time to time to evaluate the validity of the test in terms of our instruction, time required, usefulness of the result, etc. On a side note, we generally do not administer tests with applicants unless there is a compelling reason to do so.  However, we do use work such as this from ramping up exercises for newhires or employees interested in learning about or moving into a new role.

This test was fun.  It incorporated some PS2 generation art assets from an exploratory project that we never made at Volition.  The characters with simple FK rigs, the rooftop set, and the audio voice clips were provided. For those unfamiliar with animatics, these are used to pace, time, and scope a full cinematic.  From here, motion capture, fx, and other custom work would be scheduled for integration later in the process.

In terms of evaluation (click to expand…):

Instructions: Cinematic Artist Test (click to expand…):

GDC 2010

I just returned from this marathon Game Developers Conference in San Francisco.  As always, it is a great event to gain insight into the industry and network.  I find myself getting less and less out of the lectures as the years go by, but the round-tables on the other hand are particularly useful and interesting as you get to pose questions to peers and see how specific items of interest are being handled at other studios.  Speaking of roundtables, Volition dominated these in the visual arts track with 3 out of the 4 being hosted & moderated by Volition employees including Technical Art, Technical Animation, and Studio Art Culture.  Kudos to Jeff Hanna, Tim Borrelli, and Keith Self-Ballard for doing this.  Volition is in between projects, but I expect next year we’ll be able to share some of the great stuff that we’re up to right now.

A few days prior to the conference, THQ held its own summit.  This was excellent.  Representatives for the entire CORE business unit got together to discuss current status, outlook, and initiatives for the upcoming year.  We then split into individual councils.  I helped moderate the Art Council from which we outlined goals and assigned actions items for the members to work on for the next meeting.  Overall the push for quality games and cross studio collaboration is strong.  I’m highly encouraged by this initiative and look forward to its results.  I’d love to post more detail, but I may be getting into confidential information…so its best to leave it a little vague 😛

Update to vMeshProjector post…

I just updated my “vMeshProjector” post with the following samples of the tool in action (sped up 2to3x).


Dog Gun Seat Skull

Review(book): Picture This:How Pictures Work, by Molly Bang

I was introduced to this book some years ago and recently rediscovered it and how great it is. I highly recommend any artist spending the hour or so it takes to read and digest this book.

“Picture This” summarizes much of what we take for granted when we see an interesting image.  The book focuses on how we can harness the elements in a picture to create emotional responses, and why these responses occur.  For trained artists, it offers a simple refresher to concepts of composition, shape language, rhythm, repetition, color, balance, tension, etc. that we are taught in school.  It is refreshing and inspirational to read and contemplate the concepts that Molly builds on through simple shape illustration of Little Red Riding Hood in this book.

Click here for detailed description by Molly….

Author’s website: http://www.mollybang.com/Pages/picture.html

Review(Game):Mass Effect 2

I just completed ME2 and thought I’d get into the spirit of a blog and document my thoughts. Overall, I felt the game was decent.  I’d probably throw it into a 80% range.  It had high production quality but failed to really pull me into the narrative, experience, or offer anything new/original.

***Warning: Potential SPOILERS below***

Loved: (click to expand…)

Hated: (click to expand…)

Other comments: (click to expand…)

Site Update – Summoner 2 Environment Concepts

I just stumbled on some old Summoner 2 environment concepts and posted them up. Have a look…

Quick Anatomy Study

Here is an anatomy study that I made over the weekend.  It is based on following the Zack Petroc Human Anatomy DVD published by the Gnomon Workshop.  Like the DVD, I started with a box model created in Maya and then sculpted the rest in ZB3.

The muscle forms are a bit exaggerated and I rushed the hands, feet, and head.  I particularly like the torso area.

This was a fun exercise and I recommend others to give it a spin.

(be sure to click on the image to see the turntable video)

Figure Drawings added…

Check them out here: http://www.kellysnapka.com/tag/figure-drawing/

Site Updates

I’m still filling up the site with lots of old content.  I’ve updated the following pages:

This site is now live!

I just wanted to briefly commemorate this moment with a post.  Now comes the tedious process of adding content.  Fortunately, I can do much of this from the comfort of my lap, via my MacBook.

Hello world!

Under Construction

Started putting together my new website to document and share work that I’ve done over the years.  I’m excited about the functionality offered, but it may take a while before everything is ready to release.

UPDATE (1/15/10): Well, I ran into a few quirks and limitations here and there.  So, I’m rapidly brushing up on PHP & HTML to customize the site.  It is fairly straightforward, but reading PHP is an eye-sore given how it is interspersed with HTML.  Ugh.  Still after a day or so of reading sites, looking at examples, and trying things out I think I have a grasp on how to do what I’m after…that being “photoblog” capabilities and built in archive/gallery displays on appropriate pages.  <fingers crossed> 🙂

UPDATE (1/17/10): Everything is looking good and ready to go.  Time to start adding content!

GDC.China’09-Presentation

Here are the animated slides from the day long tutorial that I gave at GDC China 2009 in Shanghai. Sorry I didn’t have time to record and sync up voice.  Hopefully you’ll be able to pull out something useful here or there.  If I have several requests come in for the voice, I’ll try to make the time to fill in the gaps that are missing without the vo.

This presentation was given alongside a translator changing everything thing I said in English into Mandarin.  So, I kept everything dry and straightforward.  The presentation uses Saints Row 2 as an example for discussing project development cycles, where focus should be spent, and why.

Don’t hesitate to maximize the video(s) if something is too small.

Part 1 – Introduction

You need to install or upgrade Flash Player to view this content, install or upgrade by clicking here.

Part 2 – “Discovery”

You need to install or upgrade Flash Player to view this content, install or upgrade by clicking here.

Part 3 – “Pre Production”

You need to install or upgrade Flash Player to view this content, install or upgrade by clicking here.

Part 4 – “Production”

You need to install or upgrade Flash Player to view this content, install or upgrade by clicking here.

Part 5 – “Post Production”

You need to install or upgrade Flash Player to view this content, install or upgrade by clicking here.

Part 6 – “Conclusion”

You need to install or upgrade Flash Player to view this content, install or upgrade by clicking here.

Crucial Conversations ‘Master Mission’ completion

Here is the digital certificate that I recieved after completing a “Crucial Conversations” course offered at work by Vital Smarts.  Level three was the end of the class. I also have certificates for level 2 and level 1, but they’re essentially the same thing and I didn’t want to clutter up this post with them.

The course took place over an eight week period comprised of 2 hour classes with weekly homework assignments & exercises.  While this type of training is awkward and hard to take seriously at times, I felt that this course offered many useful insights and techniques into holding productive discussions on difficult topics.  I was part of a charter group at Volition who underwent the training and I recommend its application to all of our employees, particularly those in lead roles.

vArt Test – RFG Character

Here is my work-in-progress from a Volition Character Artist test that we abandoned some time ago as it has proven to take too much time for the applicant to complete to a quality result.  It looked like fun and I wanted to validate the findings myself.

The basic approach I took was starting from scratch with a box in 3dsmax and then leveraging the Graphite modeling tools to build the base mesh for sculpting and possibly for the final result as it was weighing in at around 9k polys.  I left the test at the point of doing a gross Zbrush pass on the arms and head.  The next steps were to be completing the sculpt on the softer portions of the costume, moving into fine detail, painting the diffuse & spec, and then baking it all down to a game res mesh.

The hair turned out to be a particularly troublesome area due to trying to author to support the limited alpha support\sorting that we have in our game engines.  I left the test at the point of favoring an interpreted sculpt rather than opting for a series of planes on the head.

To see the Zbrush turntable, click HERE

To see the concept used for the test, click HERE

3dsmax viewport screenshots

vMesh Projector

3dsmax maxscript that I threw together that aids in retopologizing hi-poly meshes down to lo-poly.

“vMeshProjector” is a maxscript that projects one mesh onto another. It is primarily envisioned as a tool to aide in building lo-poly meshes that conform to high poly counterparts, from which normal maps and other data may be pulled. It does however have other potential uses, particularly in the areas of kit bashing.

It was a fun project and I learned a lot.

Here are some additional samples of the tool in action:


Dog Gun Seat Skull

3dsmax Viewport Fire

You need to install or upgrade Flash Player to view this content, install or upgrade by clicking here.

We began a series of “vfx classes” in the studio to familiarize non vfx artists with what it takes to make vfx.  We were also interested in identifying untapped aptitude.  The first session included learning the basic properties of a particle system.

While participating in this endeavor, I quickly created this video.  Having already been familiar with particle systems, I focused on the trying to see how far I could push the result in the 3dsmax viewport.  So, I incorporated lighting, shadow, and hlsl on the particles.  The particles have sliding normal maps and layered masks, via the shader.  The gnome, gas can, and biped are just there for staging.

Figure Drawing

Figure Drawing

Figure Drawing

Figure Drawing

Figure Drawing

Figure Drawing

Figure Drawing

vArt Test – Towtruck

This is my result after taking our (Volition’s) “Vehicle Artist Test.”  It is incomplete as I attempted to stay within the time recommendations we provided (20 to 30 hours).  Granted an experienced Vehicle Artist should be faster at this as it is similar to something they would do repeatedly whereas it is the first wheeled vehicle I’ve ever made.

An outcome of  both my and other internal vehicle artists experience with this test have concluded that too much time was necessary for candidates to create a high quality submission and the current test has been simplified as well as updated to current game specifications.

Were I to complete it, I would of course finish the diffuse texture.  Then I would create the normal and spec map followed by a shader that would leverage them, dialing in the shader properties appropriately.

Test Specs:

  • 5000 polygon limit
  • (1) 1024×1024 texture map (currently a 2048 in the screenshots above)
  • (1) 1024×1024 normal map (absent from my result)
  • Interior needs to be modeled/textured, but emphasis need to be placed on exterior.
  • Doors need to open
  • Wheels need to be able to spin.
  • Please make the truck’s base paint color white or off-white.
  • Be sure that the truck is scaled appropriately to a human.
  • Optional(encouraged):
    • Reflection\Spec\Bump maps (should be kept at or under 1024×1024)
    • Texturing the underside of the vehicle is optional for this exercise.
    • Hood does not have to open unless you have time…if you do, you’ll need to model\texture the engine compartment.

3D Self Portrait

Self portrait made in 3dsmax from photo reference and rendered with Mental Ray.  Hair is done using the standard plugin that ships with 3dsmax.

This was just a quick weekend project.  I think I spent about 8 hours on it start to finish. Never did get around to the glasses or a shirt. Still, it was a fun little test.

Right-click to save .mov

RFG road tools R&D

One of the many challenges that we faced on RFG was that of making roads in the rocky Martian terrain.  The videos below demonstrate two techniques we explored.

Technique #1 – Spline borders with edge softening

This demonstration is rather drawn out and shows what is happening under the hood.  The basic idea was that a level artist or designer could drop down road outlines and use the lines to control the width, bank, and slope of roads projected into height map terrain.

You need to install or upgrade Flash Player to view this content, install or upgrade by clicking here.

Technique #2 – Spline w/knot controls

This technique is similar to what we went with for our world editor on RFG.  One spline with knot controls defines the road direction, width, banking, and slope…augmenting the height map terrain to fit.  We actually took this a step further and leverage stitch piece geometry that would literally conform and carve into the terrain.

You need to install or upgrade Flash Player to view this content, install or upgrade by clicking here.

RFG World Editor R&D workflow mockup

I created this video early in pre-production on Red Faction Guerilla to help communicate some ideas that I had at the time for building terrain and placing structures in a rapid, non-linear manner.  Some of these ideas were incorporated into the proprietary editor used on RFG.

You need to install or upgrade Flash Player to view this content, install or upgrade by clicking here.

The tool was mocked-up inside of 3dsmax using a combination of maxscript, modifiers, and wired parameters.  Even though it appears to be a functional tool in the video, it is really just a demo turning on/off parameters and moving them around to show how such a tool set might be designed and used.

**FWIW, I never recommend building world editors inside of DCC apps.  We’ve gone down this road and it works, but it doesn’t scale well and becomes very slow and hard to work with in fully loaded production settings.

Building Placement R&D

As SR2 approached, I was concerned about the time it took to construct the city for Saints Row and conducted several tests to explore possible tools or workflows to improve this.  The following video is one of them…

You need to install or upgrade Flash Player to view this content, install or upgrade by clicking here.

This video illustrates a concept of “pedestals” that would accompany every building that would be placed into the world.  The pedestals could add or subtract from the terrain as appropiate, carving out a level foundation or building one.  Not shown in the video is the idea of a distinction between hard and soft edges.  Additionally, it doesn’t show the concept of clutter or accessories objects or integration with adjacent objects or streets.

Road Maker R&D

As SR2 approached, I was concerned about the time it took to construct the city for Saints Row and conducted several tests to explore possible tools or workflows to improve this.  The following video is one of them…

You need to install or upgrade Flash Player to view this content, install or upgrade by clicking here.

This video illustrates a concept of building up a city by, essentially, connecting nodes together to create roads and boundaries.  This video only scrapes the surface on how far this concept could extend and allow for rapid building of cities and levels for game environments.

Female Character Concept & Model

Female character concept Female Model wipThis is a concept & model that I created for a character that I was going to use in an animation study.  I wonder if I’ll ever get back to it and finish it.

Rhinobird with girl

Just exploring the Rhinobird design in a Beauty/Beast theme.  Thought it might be interesting to try a contemporary costume for the female.

Rhinobird in flight

Pencil sketch quickly colored in Painter.

360° Billboards

You need to install or upgrade Flash Player to view this content, install or upgrade by clicking here.

vAnimBarGUI

You need to install or upgrade Flash Player to view this content, install or upgrade by clicking here.

This was a experiment in creating a graphic widget via maxscript for some general purpose trackview type manipulation of data.  I learned a great deal such as the use of back buffers and updating regions to speedup the drawing of a bitmap to the screen.  Additionally, I learned about mouse tracking and parsing a bitmap font sheet for letter forms to create words in the bitmap.   MXS is not fast at drawing bitmaps, but I think this actually managed to hit an acceptable level of performance.

This was initially designed to fill a whole in loss functionality in 3dsmax’s trackview which we want to have custom blocks of labeled keys to control lip synch data.  We ended up modifying our lip-synch method and never actually put it to use.

RFG Terrain R&D

Here are some of my early R&D videos for using normal maps and layered normal maps on terrain.  Keep in mind that this is from back when widespread use of normal maps and “next gen” techniques were fairly new.

Technique #1 – Normal Map large features of terrain

This video shows using a normal map derived from a high resolution terrain mesh applied to a low resolution mesh.

You need to install or upgrade Flash Player to view this content, install or upgrade by clicking here.

Technique #2 – Layered Normal Maps

This video shows a possible shader that leverages a couple of simple noise normal maps sized differently and blended together to achieve a large, medium, and fine detail visual.

You need to install or upgrade Flash Player to view this content, install or upgrade by clicking here.

Seamless ‘rock’ and normal map introduction

You need to install or upgrade Flash Player to view this content, install or upgrade by clicking here.

vCombo_UVW’s

You need to install or upgrade Flash Player to view this content, install or upgrade by clicking here.

This maxscript I made to initially assist the vehicle artists added the missing functionality of being able unwrap multiple objects simultaneously.  This is incredibly useful when working with multiple objects that share the same texture sheet.  Modifications subsequent to this video include support of multiple map channels, epoly support, and support to maintain morpher modifiers.

Note: Autodesk added this in subsequent versionsof 3dsmax, starting in r9 IIRC.

Object Renamer

You need to install or upgrade Flash Player to view this content, install or upgrade by clicking here.

This video demonstrates a rather simple but useful enhancement to the object renaming tool that ships with 3dsmax.  Nothing complex here, just string operations and a decent preview of the result prior to committing.

vProp Shop 3

vPropShop3 is a light-weight asset management system that facilitated creating a sharable library of assets that could be browsed, shared, and leveraged by production artists at Volition.

Key Features included:

• TreeView and browser with list, detail, and thumbnail views
• Placement tools for dropping objects into 3dsmax
• Easy method for adding props to the library
• Ability to edit entries in the library, locking them from multiple edits
• Multi-user support
• Light-weight approval and commenting system

Initially, this script started out as a small dialog with a text list of objects in it that could be selected an merged into the 3dsmax session, by Adam Pletcher.  I saw a benefit for adding preview support for v2, and then v3 added a new gui browser (somewhat inspired by XSI’s style). Up through v3, the script simply used the Windows file system.

The script became heavily used by the Environment Artists at Volition.  For Saints Row 2 another employee Andy Tidball, picked up the script and reworked it to be integrated with Perforce.

Enable Renderable Vertex Colors

Vertex colors do not render in the scanline or mental ray renderer by default in 3dsmax.  Nor is there a switch to enable them.  So, I built a script that tweaked the selected object or scene’s materials to allow this.

Interface Shot:

Material Change:

Results:

The screenshot above has a Advanced Lighting Radiosity pass baked down into vertex colors that were tweaked using the Vertex Color Tools Suite script to augment hue, control blending, and fix problem areas.

The render maintained the vertex colors, allowed over-brightening, and added cast shadows.

vConvex Hull Maker

Here are some screens from a convex hull maker script that I made as we began to integrate physics engines into our games and hence had the need for convex shells for collision calculations.

It was an interesting script to right.  I treat the source meshes as a point cloud.  I then start at any three points, build a face, and then randomly jump through all of the remaining points looking to the center to see if it can see any triangles.  It is sees one, it is concave and is deleted.  Then new faces are built.  Process is repeated until all the points have been run through.

Description:

  • This script builds convex hulls based on selected geometry.
  • Definition of a convex mesh: ”An object is defined as convex if, given any two points inside the object, you can always go in a straight line from one to the other without going out of the object.”

Usage:

  • Workflow:
  1. Select the object(s) that you want to build a convex hull around.
  2. Verify that the scope option in the script’s ui is set appropriately.
  3. Press the “Build Hull” button to create the new hull object(s).
  4. Select the new hull(s) and name them properly. (They will all be named “ObjectXX”)
  • Options:
    • Scope:
      • “Selection as single object”
      • “Individual Objects”
      • “Update Viewports”
        • This is a frivolous option that will allow you to watch the hull being built in the viewport.
        • Note this option drastically slows down the hull creation process.

Advanced Lighting Settings Utility

Description:

3dsmax had one of the first available tools for calculating radiosity and it did this at the vertex level.  So, we decided to make use of this for generating vertex color based lighting for our levels. The problem that quickly arose is that we wanted different light setups within the same level max file, i.e. one for a daylight exterior, another for a darker interior, and so on.

This script facilitates this by storing multiple radiosity and exposure settings coupled with associated geometry and lights.  It allows for batch processing one or more of these settings and where possible blending the vertex colors at transition edges, such as the threshold of a door.

Screenshots of the script’s gui:

Usage demonstration:

Vertex Color Tools

vcTools is a compilation of several maxscripts that aide in manipulating vertex colors on single or multiple objects at a time in 3dsmax r5+.  I built this script suite as a reaction to missing functionality that we needed to set and manipulate vertex colors in 3dsmax for level art in Summoner.

There were several modules including:

• Assign Vertex Colors
• Adjust Vertex Colors
• Pits’n’Peaks
• Utilities
• Vertex Color Selection tools

Download the .chm file HERE for complete details.

NOTE: This script relied on several compiled extensions that do not ship with 3dsmax and therefore it is not compatible with current versions of 3dsmax.  It could be updated, but the reason to do so has become much less compelling since the inclusion of the Vertex Paint Modifier (which incidentally referenced this script numerous times in is beta spec.)

Here are a few sample images from the documentation:

Summoner2.Matte-“Isle of Teomura”

(matte painting used for cinematic back plate)

(as seen in the cinematic with clouds and airship)

Summoner2.Concepts-“Sharangir”

Summoner2.Concepts-“Eleh”

Summoner2.Concepts-“Pirate Ship”

Summoner2.Concepts-“Pirate Base”

Summoner2.Concepts-“Munari City”

Summoner2.Concepts-“Khargathalan”

Summoner2.Concepts-“Cabal”

Summoner2.Concepts-“Halasar”

Summoner2.Concepts-Monsters

Here are some random encounter monsters for Summoner 2.

Summoner2.Concepts-Summons

Here are some concepts for some potential summons.  Some are themed into 3 stages.

Summoner2.Concepts-Odoni

Here are some concepts for a “fire” race, the Odoni.

Summoner2.Concepts-Munari

These concepts are brainstorms for an aquatic race, the Munari.

Summoner2.Concepts-Miscellaneous

Just a collection of some random concepts I made for Summoner 2…

Summoner2.Concept-Garzumbuk

I forget the premise behind this concept.  I think it was the physical manifestation of the evil leader of the twilight realm.

The original drawing was 9×13 marker on paper.

Summoner2.Level Art

Here are some screenshots from levels that I made for Summoner 2.  Unfortunately, I don’t have shots from all of the levels I worked on.

Isle of Teomura

This was the second level in the game and the first one that I built for S2.  It essentially was the piece that I used to develop my workflow and what prompted me to develop the Vertex Color tools scripts to help assign and manipulate vertex colors.

Munari City

This city was inhabited by an aquatic race, the Munari.  I used Frank Lloyd Wright as the primary inspiration for this level.  I was particularly interested in creating a wide amount of parallax and constant movement via cloth and water.

City of Masks

Summoner2.Concept-Votaan

Here is a quick sketch for a ghost character that was cut from the game design and never made it into the game.

Summoner2.Concept-Pava

Here are some quick concepts that I made for the Queen Pava character.  This character never made it into the game.

Summoner2.Cinematic.02-“Sangaril Leaps In”

You need to install or upgrade Flash Player to view this content, install or upgrade by clicking here.

This is the first in game cinematic and introduces Sangaril, a Munari (aquatic race), party member.

As with all Summoner 2 cinematics, I was responsible camera work, choreography via rough character animation, and implementation into the game. Each Summoner 2 cinematic averaged about 3 days of total work.

In hindsight, most of these scenes could improve from better pacing.  There is a notable lack of anticipation and dramatic pause.  Furthermore, the animation is extremely rough exhibiting neither the realism of motion capture nor the personality of key frame.  However, under the limited timeframe and staff capacity, I still view these as a creative accomplishment.

Summoner2.Cinematic.04-“The Rune Stone”

You need to install or upgrade Flash Player to view this content, install or upgrade by clicking here.

This scene introduces a “summoning” stone, which are scattered throughout the world and unlock Maia’s summon abilities.  Of particular interest are the environment and the stone itself, as I created each.  The stone is interesting in that I hand created the mip maps such that as the player approached, the runes would glow and as the player moved away, the orange ring around the stone would appear (dissipating upon approach).  Additionally, the surface of the stone would become transparent upon approach revealing an animated, “living” rune and star-scape below.

Regarding the scene, in addition to the usual work listed below, I created the fragmentation pass on the ground.  I modelled fragments, split them up, bound them to a ripple space warp, and then shot them up/out in successive sequences.

As with all Summoner 2 cinematics, I was responsible camera work, choreography via rough character animation, and implementation into the game. Each Summoner 2 cinematic averaged about 3 days of total work.

In hindsight, most of these scenes could improve from better pacing.  There is a notable lack of anticipation and dramatic pause.  Furthermore, the animation is extremely rough exhibiting neither the realism of motion capture nor the personality of key frame.  However, under the limited timeframe and staff capacity, I still view these as a creative accomplishment.

Summoner2.Cinematic.05-“Prince Neru Forever”

You need to install or upgrade Flash Player to view this content, install or upgrade by clicking here.

This was a fun scene.  I remember gathering with a few coworkers to choreograph the fight.  It turned out fairly well, imo, even showcasing Neru’s awkward “hair-blade” attack.  The kick at the end could stand some improvment.

As with all Summoner 2 cinematics, I was responsible camera work, choreography via rough character animation, and implementation into the game. Each Summoner 2 cinematic averaged about 3 days of total work.

In hindsight, most of these scenes could improve from better pacing.  There is a notable lack of anticipation and dramatic pause.  Furthermore, the animation is extremely rough exhibiting neither the realism of motion capture nor the personality of key frame.  However, under the limited timeframe and staff capacity, I still view these as a creative accomplishment.

Summoner2.Cinematic.06-“Leaving Teomura”

You need to install or upgrade Flash Player to view this content, install or upgrade by clicking here.

This scene showcases the launch and transformation of the pirate airship that the player acquires.  This was a relatively fast scene to do.  Of note, I rigged the airship and painted the matte used in the final shot.

As with all Summoner 2 cinematics, I was responsible camera work, choreography via rough character animation, and implementation into the game. Each Summoner 2 cinematic averaged about 3 days of total work.

In hindsight, most of these scenes could improve from better pacing.  There is a notable lack of anticipation and dramatic pause.  Furthermore, the animation is extremely rough exhibiting neither the realism of motion capture nor the personality of key frame.  However, under the limited timeframe and staff capacity, I still view these as a creative accomplishment.

Summoner2.Cinematic.11-“The Heirophant’s Ritual”

You need to install or upgrade Flash Player to view this content, install or upgrade by clicking here.

As with all Summoner 2 cinematics, I was responsible camera work, choreography via rough character animation, and implementation into the game. Each Summoner 2 cinematic averaged about 3 days of total work.

In hindsight, most of these scenes could improve from better pacing.  There is a notable lack of anticipation and dramatic pause.  Furthermore, the animation is extremely rough exhibiting neither the realism of motion capture nor the personality of key frame.  However, under the limited timeframe and staff capacity, I still view these as a creative accomplishment.

Summoner2.Cinematic.14-“Imarbeth’s Riddle”

You need to install or upgrade Flash Player to view this content, install or upgrade by clicking here.

One trick employed with this scene is the shot where the three characters simultaneously press the crystals.  I fake three cameras by placing the characters next to one another with to black bars dividing them.  I complete the effect by using a camera that is far away with a very narrow fov to minimize the parallax and depth of field.

As with all Summoner 2 cinematics, I was responsible camera work, choreography via rough character animation, and implementation into the game. Each Summoner 2 cinematic averaged about 3 days of total work.

In hindsight, most of these scenes could improve from better pacing.  There is a notable lack of anticipation and dramatic pause.  Furthermore, the animation is extremely rough exhibiting neither the realism of motion capture nor the personality of key frame.  However, under the limited timeframe and staff capacity, I still view these as a creative accomplishment.

Summoner2.Cinematic.16-“Morbazan the Invicible”

You need to install or upgrade Flash Player to view this content, install or upgrade by clicking here.

This was another fun scene as I was able to show Morbazan playing with his opponents and then ruthlessly eliminating them.

As with all Summoner 2 cinematics, I was responsible camera work, choreography via rough character animation, and implementation into the game. Each Summoner 2 cinematic averaged about 3 days of total work.

In hindsight, most of these scenes could improve from better pacing.  There is a notable lack of anticipation and dramatic pause.  Furthermore, the animation is extremely rough exhibiting neither the realism of motion capture nor the personality of key frame.  However, under the limited timeframe and staff capacity, I still view these as a creative accomplishment.

Summoner2.Cinematic.18-“I am Iari”

You need to install or upgrade Flash Player to view this content, install or upgrade by clicking here.

This scene was fairly straightforward, with the exception of the droid.  I accomplished this effect by splitting the mesh and animating it exploding.  Then I reversed the keys to make it come back together.  After this I added the rotation by linking the exploded pieces to dummy objects animating at different speeds.

As with all Summoner 2 cinematics, I was responsible camera work, choreography via rough character animation, and implementation into the game. Each Summoner 2 cinematic averaged about 3 days of total work.

In hindsight, most of these scenes could improve from better pacing.  There is a notable lack of anticipation and dramatic pause.  Furthermore, the animation is extremely rough exhibiting neither the realism of motion capture nor the personality of key frame.  However, under the limited timeframe and staff capacity, I still view these as a creative accomplishment.