Saturday, March 19, 2011

Change is in the air

Spring is a wonderful time of renewal and rebirth. It's a glorious...

Yeah, fine...get to the point already!

*ahem*

I just finished my last set of Animation Mentor campus crits...not just for this term, but possibly for good. That's the change to which I mysteriously alluded in my Facebook status earlier this week. I will not be returning as a campus mentor in the spring, and it's possible that I will not do any more mentoring with AM in the future.

My five-and-a-half years as a mentor with AM have been quite an experience. I've learned a ton, met a lot of amazing people, and enjoyed the opportunity to share my meager knowledge of animation and the entertainment industry. It's also been a bit of an emotional roller-coaster, particularly during the past three years after I set aside animation in favor of programming and TD work at Reel FX. The decision to step away from mentoring at AM is partly because of that roller-coaster, and partly because of other things happening in my life right now. While I will miss the regular interaction with AM staff and all the aspiring animators in the program, this change really is for the best.

To everyone at Animation Mentor -- staff, students, and graduates -- I express my deepest thanks for an amazing experience. While I won't be on the school site after the end of next week, or walking in costume across the stage at future graduation ceremonies, I hope to stay in touch with as many of you as possible, and wish you all the best in your animation journey.

Friday, March 18, 2011

Maya/Qt posts delayed indefinitely

I probably should have posted this some time ago, but the reality of the situation is that I have no idea when I'll get back to the Maya/Qt materials. I haven't done any further work with Qt at Reel FX since I initially wrote about it. Part of that is because our current projects are all using Maya 2010, but the biggest issue is that the majority of the Maya tools that I develop at Reel FX need to work both in-house and for our ever-morphing collection of remote animators.

While the crew at the studio have set up an efficient Maya/Qt workflow for internal use, setting up a home system to get Maya and Qt talking nicely appears to be a bit of a chore (to put it mildly). It's tricky enough troubleshooting the problems that remote animators sometimes encounter while setting up their systems to work with our pipeline and tools. Putting them through Qt setup process on top of that would be asking a bit too much.

Once we have a project that will use Maya 2011 and I dive back into Qt work, I may bring this back up, but the remote situation is the key factor. Without a way to ensure that our remote artists can *easily* get the same Qt UI results that we do, it's not worth the development effort.

Thursday, January 20, 2011

Maya caching UI images?

I'm curious if anyone else doing Maya UI development has noticed that Maya will cache images used in UI elements, and not refresh them if the image data changes. I haven't done a thorough test to see if it's specific to certain image formats, as I'm only using XPM files, but this problem has been there for ages. If you haven't seen it in action, try this:
  • Make a small image (100 x 100 is good) in your favorite image editing application, and save/export it in XPM format.
  • Script a simple Maya interface that assigns this image to a control, like the iconTextButton. Open your UI and confirm that the image displays correctly.
  • Go back to your image editing app, make some obvious change to the image, and save/export it with the same name as before.
  • In Maya, reload your UI, and you should still see the original image, without the change you just made.
  • Restart Maya and load your UI again. The changed image should appear this time.
I've tried a number of things in an attempt to work around the problem, but it appears that the only way to force Maya to see the change in the image file is to close it and re-open it. Not exactly the most productive option.

If the test above doesn't operate as described for you, I'd love to hear about it. Post the Maya version and OS that you're using. I'm curious if there's a pattern to this problem. I'd also appreciate hearing if you know of any proven work-arounds.

Monday, September 27, 2010

Maya/Qt posting delays

Yes, I plan on posting more about the transition from Maya's UI to Qt. A few posts have already been started. Sadly, though, the reality of my busy schedule has once again reared its head (I don't dare say it's ugly...it doesn't like that). Priorities being what they are, those other posts are on the back burner for a while. My apologies for the delay.

Wednesday, August 18, 2010

Maya to Qt: Preface

Before digging into the meat of the Maya-to-Qt discussion, I should probably cover some basics first.

Software Versions

Because all of my Maya/Qt work is currently happening at Reel FX (as I still don't have a current version of Maya at home for various reasons), everything I do will be based on the software versions installed at Reel FX. As of this writing, we're using PyQt 4 with Qt 4.4.2. Most of my work at this point is with Maya 2009. While we do have later versions available, and I may make occasional reference to idiosyncrasies in those versions, assume for the most part that this is all happening in Maya 2009.

Installation

One thing that I definitely won't talk about in these posts is how to install either Qt or PyQt, or how to get PyQt conversing with Maya in versions prior to 2011. I'm avoiding that hurdle largely because it was cleared for me by the folks at work, so I don't have any hands-on experience to share in that regard. If you want, head on over to Nathan Horne's blog, where he has kindly shared some packages that he put together to make the PyQt installation process a little easier. I haven't personally used those, though, so I can't offer any comments on their effectiveness.

Code Content

While the code samples that I list will be (ideally) fairly complete, I may only present partial code pieces here and there, partly because I'll be pulling some of these examples from actual stuff I'm doing at work. Those omissions are not only to address code-proprietary-ness issues, but because of some customizations that were done to unify all of our Maya/PyQt development at Reel FX. Just be aware of that in case you copy-paste any code samples that you find here. I'll leave in the essential stuff like imports, naturally, but some other parts won't be there.

I think that about covers it. In the first post (coming soon), we'll take a look at Qt's signals and slots, and then delve into meatier UI topics from there.

Tuesday, August 17, 2010

More Python/Qt posts pending

After mulling over the matter of this pesky blog a bit more, I think I finally hit on a topic that will keep me posting semi-regularly, at least for a little while. Seeing that I'm learning all kinds of fun new things as I try to rework various Maya tools at Reel FX to use the Qt framework instead of Maya's own UI framework, I will do my best to share those discoveries here in the interest of helping those who may be traveling a similar path.

In my online searches to figure out this stuff, I've seen plenty of "generic" examples of how to use the various classes available in the Qt framework (and the PyQt module used to interface with it), but haven't stumbled across many that address the specific issues faced by Maya developers. I'd like to remedy that (or at least try to) in this blog.

While Qt offers so much more flexibility than Maya's UI tools, the level of functionality that I find myself trying to achieve in my first full UI conversion (which is about 80% done as of this writing) is that of simply matching Maya's existing capabilities. As inflexible as the default Maya UI tools are compared to Qt (speaking of the original MEL-based tools that have been around for so long), the Maya developers provided fairly easy access to a number of very useful features: popup menus, drag-and-drop, grouped radio buttons, widgets with attached labels, etc. I imagine that many pre-Qt developers who have been coding Maya interfaces for a while -- in either MEL or Python -- are probably at least a little bit like me, and have reached a point where these features are taken for granted to some extent. You may look at that list and say, "What's the big deal? Widgets with labels? Pshaw! That's standard!" Yeah, well it was a bit of an interesting revelation to discover that many of these features don't come auto-attached to most (if any) widgets in the Qt framework. The ability to use these features is all there, but it takes a bit more work on the front end to set them up. Some require very little work, while others require a bit more.

That's the kind of stuff that I'd like to cover here. In short, I want to do my best to answer the "how do I replicate [insert Maya UI feature here] using Qt?" question. That's what's been running through my mind over the past couple days, and I've made some interesting discoveries in my search for the answers. Generally speaking, it's fairly easy to match what Maya can do. However, the real fun begins when you realize how much farther you can go, and I'll try to offer some of those "go farther" tips as well.

As I've said before, I don't have an official programming background -- just a deep passion for problem-solving and tinkering. Most of this stuff is coming to me through trial and error, with a little help from the Qt framework docs and various web searches, so there may be hiccups in some of the stuff I present. If your experience has led you to do things differently, or if I just flat-out get something wrong, feel free to speak up.

By the way...did you know that the official pronunciation of "Qt" is "cute"? Before digging into it, I heard tons of references to "Q-T", but not one talking about it with its real name. Is it because it's a bunch of guys who have this thing with saying "cute" in the context of programming geekiness? Is it ignorance? A bit of both, perhaps? No matter. You can say it however you wish. As for me, it's "cute" all the way. :)

Monday, August 16, 2010

The latest goings-(Pyth)on

Now that animation has wrapped at Reel FX on both Open Season 3 and the three Wile E / Roadrunner shorts, I'm back to updating the animation tools. While I was able to do a little development during production, it's tough making big changes for various reasons. With things flowing a bit slower now, it's nice to finally have the time to tackle some long-overdue to-do items.

One particular programming puzzle piece that I've been half dreading, half eagerly-anticipating is Qt. For those not in the know, Qt is (in the words of its current developer, Nokia) "a cross-platform application and UI framework." With the popular PyQt module that provides an interface to this framework for Python users, its use in the development of tools and interfaces for CG software has grown immensely, just as Python's use has grown in the same field.

The TD team at Reel FX has been steadily pushing farther into Qt development over the past several months, but production demands pretty much kept me from taking a serious look at it until last week. After just a few days of play, though, I'm already a fan/convert/addict. Just as Python is so much more versatile than MEL, Qt's UI tools are WAY more versatile than the UI tools provided by Maya. My mind is reeling with so many ideas of how we can significantly upgrade our animation tools to take advantage of the versatility provided by the Qt toolkit. While I'm far from an expert at it after only a few days, I've managed to conduct several successful tests of greatly enhanced functionality for our character GUI system, and can't wait to overhaul the whole thing and put the new pieces in place.

The only hitch is that getting Maya set up to use the Qt framework takes a bit of work, at least if you're using Maya 2009 (which we still are for some recent projects). While the folks at work have taken care of that already, and we are already using Qt for a greater number of internal Maya tools, we have several tools that are also used by remote animators who are hired to help us with various projects. By relying only upon the toolset within Maya up until now, we've been able to minimize the setup hassle for remote artists. If we suddenly ask folks to also go through the necessary steps to get Maya and Qt talking, we'll likely run into some problems, and that kind of remote support is something that we're just not prepared to handle.

This means that until production switches to using the later versions of Maya that have built-in Qt support, it's going to be difficult to justify spending much time on the tools that are used by both internal and external animators, which is just a tad frustrating. However, there are plenty of internal-only things that can be upgraded, which will give me time to become more familiar with Qt's idiosyncrasies.

On a somewhat-related note, I've taken on yet another side job. This one's more informal, though, but it also involves Python. One of my friends owns a dent-repair business, and he approached me a few weeks ago asking for help with something that will perform a bunch of calculations and track certain information related to the jobs done by him and his team members. Originally he wanted to do everything in a spreadsheet, and in our initial meeting we came up with something that worked fairly well after a couple hours. However, as my friend came up with additional features that he wanted for this system, it quickly became apparent that while it's certainly possible to do the whole thing via spreadsheets, in the long run it would be too much of a headache. I've been wanting to try my hand at standalone development for a while, and this looked like the perfect opportunity. To keep deployment simple, I plan on using Tkinter for the program interface, and will pack the whole thing up using py2exe. While I've only put a few hours into it so far, my experience with Python development at work is helping immensely. I could not imagine tackling something like this in my early Python programming days.

I hope to put out some more posts in the coming days/weeks with some further Python programming thoughts, but only time will tell if it actually happens.

Thursday, July 22, 2010

Looney, you say?

Jerry over at Cartoon Brew just posted his thoughts about the new 3D CG short films featuring Wile E. Coyote and Roadrunner, the first of which can be seen in front of Cats and Dogs 2 beginning next week. The article features a few stills plus a 25-second clip from the first short. It's a real cliff-....er.....bridge-hanger. ;)

Tuesday, July 13, 2010

Anniversaries

I don't often think about this, but summer is a celebration of two industry anniversaries for me. One in late June marks my entrance into the Reel FX family, while the other in mid-May marks my entrance into the animation industry. This year the counts are:

6 years at Reel FX
9 years overall

What brought this to mind was the realization that next year will bring the overall count into double digits. I realize that there are plenty of people who have been in the biz far longer than that, but consdidering (all together now) "these tough economic times" (*ahem*), I'm pleased as punch that I've managed to last this long. It's been quite an interesting ride, and I'm sure there are plenty of new thrills and spills (hopefully fewer of the latter than the former) on the road/track ahead.

I'll save the big gushy post for next year. For now, I'll just offer a brief but heartfelt thanks to God for allowing this all to happen, and to all those who I've had the pleasure of meeting along the way for making the journey interesting.

Thursday, May 20, 2010

Sorry, friends...

The last post had to be temporarily removed due to certain restrictions of which I was unaware. Kinda sad when lots of people know you did something, but you can't say it yourself. What a crazy world.

Thursday, March 04, 2010

FWIW

If you don't know what "FWIW" means, you're probably not alone. At least one of the animators at Reel FX didn't know what it meant until yesterday. I used that acronym (which, BTW, means "For what it's worth") in a reply to a post he'd sent to the animation crew, and he responded with a puzzled look....well, a puzzled-looking email. After I explained it, one of the other guys chimed in with, "OTWTM IWLT" (later translating it into "Oh that's what that means. I was lost, too"). That, in turn, spawned numerous other comedic replies.

The last reply in the thread used selected letters from the original guy's name as a fake acronym, and that was the spark that led me to create the list below. It contains the name of every animator (and one non-animator) at Reel FX, but the names are all printed "long-form", as if the name were actually an acronym for something else. As you can see, I had way too much fun (and probably took more time than I should have) trying to figure out what that "something else" could be for each one. In most cases, I wasn't aiming for anything specific, though a few passages do contain items relating to actual qualities/traits about the associated individual.

While I figured everyone would get a kick out of the list, I wasn't prepared for the replies from the group. Almost immediately, people started replying in the same pseudo-acronym "code", taking their real message and expanding it out to a bunch of nonsense words and phrases. The exchange was so funny (IMO) that I asked for permission from the group to share their replies here as well. You find them below the main list. The scary thing is that some of them actually make sense outside of their fake acronym-ity.

Enjoy!

---------------------

David almost veered into dedicated luchadors, inflating Steve's big ego.

Kent enjoys new tomatoes, and leaves fifteen rabbits eating dessert.

Randy accidentally nudged Doug, yet handily applied yams evenly spaced.

Joe oversaw every jump, only hitting Nelson six times over nothing.

Justin upset Steve's tray, inverting nine bottles and royally ruining Ernesto's tea time.

Ray acquired yonder cheese? Huzzah! Always so excellent.

Bryan rode yaks, and nearly exceeded Nelson's greatest ride. Almost, man.

Ken's egrets never hike up long inclines near goats.

Ernesto races Nigerian elk, skillfully taking over better opportunities to teach gerbils English. Really!

Doug ousted underpaid garment labelers after sprinting liberally in Texan ostrich skins

Monica owns no ice cream, although avocados sometimes tempt one nibble.

Ben: excellent ninja, jumping all mountains instantly. No, really! Obviously superior athletic limbs easily scale.

Trevor recovers emeralds, vanquishing outrageous rhinos, yammering ocelots, unbelievably nefarious giraffes.

John obviously has nifty beats, excellent rapping rhymes, yo.

Steve takes elephants Venetian eggplant nuggets in chocolate hollow orbs, like so.

Michael intercepts camouflaged hairpieces, and even liberates hidden oranges lurking languidly amid nectarines during evening rituals.

Tim is mysterious, like a nondescript nugget of nougat

Abraham breaks reclusive armchairs, hammering at manifold armoires. "Give up! I like applied radiology!"

Sean, earnestly anticipating new encounters, recently made effervescent yogurt

Eric rips into chocolate deposits ravenously, overtly bypassing internal lemon essence

Dave avoids vicious emus, vivaciously applying liberal linguistics on next email

Tom overcooks meringue dishes and neatly engineers neckties.

Josh? Oh, snap! He creates awesomely rigged eyes. Yeah!

Nelson elevates limp sombreros over nineteen blazing rings on Wednesday nights.

---------------------

Responses

Why are Steve and Nelson listed so frequently?
- Kent

Pure randomness. If someone's name came to mind at a certain point, and it fit the flow of the text, I used it.
- Me

So he understands the underlying problems, knowingly entertaining nobody today
- John

Has anyone had a half a** hamburger accident?
- Joe

Like old Lenny?
- John

Now I can eat
- Joe

Winning eliminates lame losers. People like all your excessive domination!
- David

You offer umbrellas and rain, even jokingly uttering sad thoughts... John empties angry lotus orbs under sweet juice oak humming nests.
- Kent

Is life in Kentuky exciting, capsules ate kewl envelopes
- Ray

pickle grandma rain yelling monkey September ninja brick pee pee whisper happy.
- Joe

Really answering Nelson's doorknock, you see that interesting neighbor Kent's sexiness.
- Kent

On hibiscus nibs, oranges wallow happily after tipsy housewives applied vivid eggplants in domes over next event
- Me

Y’all obviously underestimate all literary levity. How are varied enigmas written, and you’re totally overlooking obvious mastery? Unlike childish happenstance from really elementary efforts, this iteration marks expertise.
- Tim

Tony is missing wonderfully insane nonsensical stuff!
- David

Time I met your old ugly retarded obnoxious codger kid. Jackson unbelieving sucker thought Whitaker had a tight isolated white anger soon. Tenaciously heightening its noodley kind in near grossness.
- Randy

Monday, July 13, 2009

Animate a Face SOLD OUT!

The last copy of my Animate a Face CD set has been sold! I won't get a chance to update my site until later tonight, so if you know someone who's about to place an order, please pass along the news.

Even though the first-run CDs are gone, I still have a set for my own use, and am still keeping an eye out for alternate avenues of distribution. One distribution firm I was considering apparently doesn't have a system in place to sell multi-disc products. I haven't looked at the contents in a while, but there may be a way to compress it down to a single disc. Electronic distribution is an option that some have suggested, and I'd like to explore that if possible. Leads to appropriate distribution solutions are most welcome!

I'm very grateful to everyone who has taken a chance with my little tutorial product, and hope that it's been helpful in your animation efforts.

Monday, June 29, 2009

Two Webosaurs vignettes online!

We've been producing a number of short 15-second vignettes for Webosaurs, and the first couple have been released into the wild!

What I love about these pieces (not just these two, but the whole series) is that the animators at Reel FX were given a huge amount of ownership over their work. The team was given the task of creating mini-stories that could tie in with certain parts of the Webosaurs world. The group split into pairs, and each twosome developed a script, boarded and pitched it, directed the voice talent (Justin Harder and myself), animated the shots, and even offered direction on the background designs. It's been a huge collaborative effort, and the end result in each case is something that's part story, part ad, and all fun.

(Edit: word has it the crew here is going to update the clips so the ends don't get truncated by good ol' YouTube. They're a tad short in their current form.)

(Edit edit: fixed links to embedded videos, fixed size)



Wednesday, May 13, 2009

Kicking off voiceover site

I'm finally kicking off a separate voiceover web site:

www.justinbvocal.com

Just a temp splash page for now, but the blog portion of the site is alive and kicking. Voiceover-related posts from this blog will gradually move over there. Many thanks to Grant Goodwin for help with the logo design.

Thursday, April 30, 2009

Short Story: The Cobweb

A little over a month ago, I took a day off to just relax and unwind. Somewhere in the middle of the day, the voiceover bug jumped up and bit me, and before I knew it I was perusing the available projects in the Librivox forum in search of something short to record.

It wasn't long before I located a thread for a collaborative production of Beasts and Super-Beasts. I'd been searching for material to use as practice for narrative voiceover work, and one of the unclaimed short stories in this collection caught my attention. After receiving word from the project coordinator that I could claim the requested story, I dove in. An hour later I uploaded the finished piece, which I present for your listening pleasure:


There are things that I could have done better, but all in all, I'm very happy with how it turned out. I hope you enjoy it!

Monday, April 06, 2009

Twitter me this...

I've semi-recently become a Twitter semi-junkie. As part of this semi-new-found addiction, I've added a Twitter gadget to the blog sidebar. Happy to hook up with other animators, developers, etc. However, be warned: I do weed my follower list from time to time, blocking users who (for lack of a better phrase) creep me out. If your creep quotient is low, you'll likely stay. :)

Wednesday, April 01, 2009

Totally awesome!

ThinkGeek always comes out with the best products. Especially at this time of year. :)

Sunday, March 29, 2009

Monsters vs. Aliens vs. Apathy

There are a only a handful of animated films that I have intentionally avoided for one reason or another. In some cases, the animation style was just too off-putting. In others, it was the apparent quality of the film as a whole that turned me off.

In the case of Monsters vs. Aliens, however, I simply didn't care. Not about the plot, and not about the characters. While I got a few minor chuckles when I watched the early trailers, nothing in them raised my interest to the point where I felt myself saying, "I have to see this!" In fact, the film was so far off my radar that I frequently found myself saying, "Oh yeah...I forgot that was coming out," when friends would ask about it.

And that's another thing: almost nobody in my animation circle was talking about it. It wasn't a hot topic like many past films had been, so those moments were friends would ask about the film were few and far between. Hence the forgetting.

Anyone else feel the same way? Chime in! Anyone see it? If so, what are your thoughts?

Friday, March 27, 2009

tweenMachine 2.03

tweenMachine 2.03 is published. It fixes a problem that has prevented Maya versions in the 200X series from using the special tick color feature. If you run into any issues, drop a note here (still haven't got the contact page on my site updated yet).

Thursday, March 26, 2009

Booleans, ternary operators, and max

I ran into a situation today that initially stumped me. I needed to take a list of unknown size, check each item in the list to see if it could be found in a line of text, and return a single True or False if any one item in the list matched that check. Oh, and if the list was empty, that had to be addressed appropriately as well. And I wanted to do it in the smallest way possible.

Originally I'd hacked together a short four or five line function that did the job. However, after coming back to the code for some other updates, I noticed that said function was only being called once, so I began looking for ways to nix that function and do the job more directly. Part of the challenge was that this comparison I needed to do was part of an existing if statement, and it had to remain so due to the way the rest of the code worked. In short, the comparison went like this (in pseudo-Python):

thisList = ["list", "of", "unknown", "length"]
if not ":" in line and not anythingInThisList in line:
do stuff
else:
do other stuff

The first thing I tried to figure out was a way to get a single True or False out of a list of various Boolean values. On a whim, I tried to use the built-in max function. I'd used max before in standard numeric comparisons, but never with Booleans. Not surprisingly, it worked quite well.

>>> max(True, False)
True
>>> max([False, False, True, False])
True

Getting the necessary Boolean list to pass to max was a no-brainer thanks to Python's list comprehensions. Here's an example that quickly shows if a given word contains any vowels:

>>> vowels = ["a", "e", "i", "o", "u"]
>>> max([v in "sadness" for v in vowels])
True
>>> max([v in "shhhh" for v in vowels])
False

This process alone solved most of my problem. However, I couldn't always be sure that my list of things to look for would contain anything. The variable containing the list was set by an argument in a function definition, and that argument defaulted to None if no other data came through. That meant that I had to somehow force the output of the max comparison to False if the variable was None, or let it do its thing if not.

That got my thoughts going toward ternary operators. For those who don't know, many programming languages offer a condensed one-line shortcut for the standard if-else comparison, called a ternary operator. In short, it turns this:

if statement:
doThis
else:
doThat

into this:

statement ? doThis : doThat

Not long ago I dug around to see if Python supported anything like this, and sure enough it does (as of one of the more recent versions, but I forget which one), although it isn't in the standard documentation from what I could see. At any rate, the above example would look like this using Python's approach to the ternary operator:

doThis if statement else doThat

With that applied to my max comparison, the end result looked something like this (and I hope this all ends up on a single line in the blog post):

# "line" is the line of text
# "y" is either None or a list of items to find in "line"

max([x in line for x in y] if y is not None else [False])

The reason that False needs to be encapsulated inside a list is because max needs a list of items through which to iterate, even if that list only contains a single item.

It's also possible to generate the Boolean list using the map function and a lambda, and the code isn't that much longer:

max(map(lambda x:x in line, y) if y is not None else [False])