Pipeline. Period. en-us Thu, 25 Sep 2014 00:00:00 +0000 <![CDATA[Textures, it's always the textures]]>

Textures, it’s always the textures

‘What to do with the textures?’ is something that constantly pops up at work, that is where should we store them?

When I started back at Caoz after my stint at SPI I was scrambling to set up a somewhat working pipeline for our TV production that was starting up. We wanted to use Tactic since we had been lacking any sort of project tracking up until that point. (For some reason we were using Alienbrain which we have thankfully pretty much removed from our workflow) The problem is that modeling/shading had started and I was more worried about getting a functioning animatic > animation > lighting workflow going. The unfortunate side-effect of this was that the textures for the assets were now in 2+ locations, some of the textures were textures that were shared between assets and someone was clever enought to put them somewhere like


But some textures had been made after we started moving to working on a server (instead of alienbrains local->remote syncing shenanigans) so they ended up in a proper location like


Another thing we wanted to achieve was to have the textures files locally on each machine rendering. All of this texture crap led me to using something I dubbed the texture pit. This is just a vast dump of all the textures located on a common path on the server, e.g.


And at lookdev publish time all the textures are copied over there (if they don’t already exist) as well as a .tx file is created for our dear Arnold renderer. Then we replace the link inside Softimage to point to the environment variable $CZ_TEXTURE_PIT which for all gui instances of Softimage point to the server side texture pit. Now we turn to rendering. At the start of every render job the pit is synced to the local hard drive of the render client and then it is just a matter of redefining $CZ_TEXTURE_PIT within XSIBATCH to point to the synced texture pit on the local machine. Tada, all textures in one place and locally on the render machines.

This setup requires us also to define a texture root for SItoA as well as re-export all our environment standins and set the export to use relative texture paths.


  • It’s comfortable to know that all the textures are in that one folder on the server.
  • If the same texture file is used in multiple assets (same filename) then the one single texture in the pit already got it covered.
  • The textures are on the render clients local hard drives meaning faster renders and less network load.
  • We have hardly seen missing textures errors since we started using the pit, and if we encounter them, they are easily resolved with dumping the missing texture into the pit.


  • An evergrowing vast collection of textures being synced around the network many of maybe are never used because the texture was used for a prop which was used in episode no. 2 but never again, still that texture is being synced and stored on all our clients.
  • Wasted space on the server, keeeping the textures within the asset folder and the pit == twice the storage.
  • Finding a texture to use on a new asset requires the texture file names to be very descriptive so you can find them easily.
  • Does not enforce a structured workflow for texture artists, they can pretty much save their textures where they want while they work and then just at publish time sync their textures to the pit. So getting back to their work files can be tricky.
  • No version tracking whatsoever (this is just our setup, version tracking within the pit is quite possible)

I think I have written enough about our texture handling (or lack thereof) at Caoz.

Thu, 25 Sep 2014 00:00:00 +0000 <![CDATA[scntocEditor]]>


I just put on github a small side-project which should make it a tad easier for me to handle scntoc files at work. I thought that since I would do a special module to do this I might as well share it. So I present to you scntocEditor

It still has no documentation of any sort and the GUI could use like a 1000 things to make it really nice. But let’s take it one step at a time.

Thu, 13 Mar 2014 00:00:00 +0000 <![CDATA[update?]]>


Well it’s been more than a year since I wrote anything here and I’d like to do more of it so I am trying to ditch wordpress for something much minimalistic. After I saw Doug Hellmann’s post I decided to try tinkerer and it looks quite super. Lets see if that gets me somewhat motivated to write something clever.

I moved all the old posts (including my most popular post, ‘Replacing layers in AfterEffects’) over to restructured text and dumped into tinker (if you are curious you can check out my mega-hacky script here)

I did not try moving all the comments from wp to disqus. I haven’t even googled if that is possible.

Sun, 02 Mar 2014 00:00:00 +0000 <![CDATA[Super or super() ?]]>

Super or super() ?

I’ve seen two ways of calling superclass methods.

class Subclass(Superclass):
    def __init__(self):


class Subclass(Superclass):
    def __init__(self):
        super(Subclass, self).__init__(self)

and I started wondering about the difference between the two. The short simple answer is “none”. The slightly longer answer (Here is the long answer) is that the first method is the only way to go for classic classes, but new-style classes also support the super() builtin (in python 3.0 you can simply call super() without the type and object arguments). You gain a couple of things with the super() builtin. First, you can change the name of the superclass without having to go into all the overloaded methods to change Superclass to DifferentSuperclass. I have seen code where the same functionality was achieved by simply doing this:

from module import Superclass as BaseClass

class Subclass(BaseClass):
    def __init__(self):

I find this very confusing having to scroll all the way to the import statements to see the classes superclass, but it has the same effect. Second, and the really cool thing, is that super() searches all of your classes ancestors to find the method you wan to call. So if you have a complex inheritance scheme you don’t have to know/remember/care which superclass implemented the method you want to call and Python uses it’s MRO (Method Resolution Order) to search the class tree until it finds your method. For the detailed answer and some examples I highly recommend Raymond Hettinger’s excellent post on the matter just be aware that his examples are using Python 3 syntax.

Wed, 06 Jun 2012 00:00:00 +0000 <![CDATA[PyQt and drag'n'drop]]>

PyQt and drag’n’drop

Today I was trying to get drag and drop working in PyQt and I had the worst time getting it to work. I was trying to have a QListWidget accept file drops which would then add the path to the file to the list. To enable dropping on a widget you must do several things. First of all you must call:


Then you have to implement the following methods:

dragEnterEvent(self, event)
dropEvent(self, event)

What I forgot to do (when I read the docs carefully) is that you also need to implement

dragMoveEvent(self, event)

Which of course makes sense when you think about it. First the cursor enters the widget, then moves within it, then you drop. Simple, right? And since I couldn’t find an example of this behavior when I was googling (drop file on list, list adds file path) I threw together this example. This example can also reorder the list after you have dragged files on it.

import sys
from PyQt4.QtGui import *
from PyQt4.QtCore import *

class MyListWidget(QListWidget):
  def __init__(self, parent):
    super(MyListWidget, self).__init__(parent)

  def dragEnterEvent(self, event):
    if event.mimeData().hasUrls():
      super(MyListWidget, self).dragEnterEvent(event)

  def dragMoveEvent(self, event):
    super(MyListWidget, self).dragMoveEvent(event)

  def dropEvent(self, event):
    if event.mimeData().hasUrls():
      for url in event.mimeData().urls():

class MyWindow(QWidget):
  def __init__(self):

    self.list = MyListWidget(self)
    layout = QVBoxLayout(self)


if __name__ == '__main__':

  app = QApplication(sys.argv)

  window = MyWindow()

Wed, 23 May 2012 00:00:00 +0000 <![CDATA[coral]]>


I have recently been looking at a quite cool program called coral. I recommend you take a look at it. Anyway I’ve put on github a repository of a possibly useful plugin (it’s the same plugin only one is in python and the other one is a compiled one) that can read pc2 caches. *NOTE* the python one requires some changes to the coral source that haven’t made it back to the repo on google code, but that will probably happen at some point. This is mostly there for me version-tracking my code, but you are free to prod at it or *gasp* use it. coral_plugins on github

Tue, 08 May 2012 00:00:00 +0000 <![CDATA[Batch adventures (or: expanding variables in batch files)]]>

Batch adventures (or: expanding variables in batch files)

I was looking into writing a fairly simple batch file to install some stuff and update environment variables. At some point I wanted to do something like this (constructing a string of ‘;’ separated paths):

set env_vars = \path\to\stuff
if x%user%==xsveinbjorn (
set env_vars = %env_vars%;\another\path
if x%hostname%==xgefjun (
set env_vars = %env_vars%;\whoah\this\is\radical
echo env_vars

When I would run this I would always get


(Notice that the second path \another\path is missing from the result) Being very new to writing batch scripts I found this extremely confusing since this sort of stuff would work like a charm in python. So I started the google machine. The reason this happens is that variables enclosed in ‘%’ are expanded when the script is read, which is quite different from the way python handles this resolving stuff at the last possible time. So when the script is read it will actually look something like this:

set env_vars = \path\to\stuff
if xsveinbjorn==xsveinbjorn (
set env_vars = \path\to\stuff;\another\path
if xgefjun==xgefjun (
set env_vars = \path\to\stuff;\whoah\this\is\radical
echo env_vars

(I resolved the variables %user% to ‘sveinbjorn’ and %hostname% to ‘gefjun’) And we can clearly see why we got the result that we got. So what we have to do is tell the batch file to expand the variables as we go along (something close to how python does things) instead of this expand-it-when-you-read-it nonsense. To do this we simply have to do three things:

  1. Add this line to the top of the code

    setlocal EnableDelayedExpansion
  2. Add this to the end of it

  3. Replace the enclosing ‘%’ to ‘!’ for the variable you want to delay the expansion for.

    if x%user%==xsveinbjorn (
    set env_vars = !env_vars!;\another\path

So my original example would look like this:

setlocal EnableDelayedExpansion
set env_vars = \path\to\stuff
if xsveinbjorn==xsveinbjorn (
set env_vars = \path\to\stuff;\another\path
if xgefjun==xgefjun (
set env_vars = \path\to\stuff;\whoah\this\is\radical
echo env_vars

Now we get the result we were looking for:


This also applies to loops and other places where the variable might change between the time you start the batch script and when you actually want to expand it.

Wed, 14 Dec 2011 00:00:00 +0000 <![CDATA[subprocess.Popen and the env argument]]>

subprocess.Popen and the env argument

Today I was looking at launching programs with some custom environment variables set and if you don’t want to redefine a whole lot of them for this new environment I’d recommend is copying the os.environ dictionary and do your changes on the copy, like so:

new_env = os.environ.copy()
subprocess.Popen('path', env=new_env)

Then you should have your program launched with all them fancy environment variables set.

Wed, 30 Nov 2011 00:00:00 +0000 <![CDATA[XSICollections, python and you]]>

XSICollections, python and you

Have you ever called a some scripting function in Softimage and gotten back an XSICollection and printed that return value only to get a ‘None’ value printed to the log? Don’t worry, you got some data there. Just remember that thats the way python in Softimage prints XSICollections if you would iterate over the collection you will find your values:

for object in returnedCollectin:
   # do something with object

I have seen some people who just started scripting in xsi run in to this little issue.

Fri, 24 Jun 2011 00:00:00 +0000 <![CDATA[sjtCopySkinWeights]]>


This is a simple plug-in command to copy skin weights from one object to another with some significant restrictions: Download sjtCopySkinWeights

  1. The meshes must be exactly mirrors of each other vertex-number wise. This plugin simply uses the vertex numbers of the mesh so each vertex of object A must have a corresponding vertex on object B.
  2. The joint names must be somehow side-differentiated e.g. L_joint and R_joint or left_side_arm_JNT and right_side_arm_JNT or you must somehow be able to map one side of joint names to the other.

This has mostly been useful when dealing with hands, you skin one and then you have to copy the weights over, but sometimes maya does a lousy job. This plug-in is pretty much like going in the component editor and copying each value for each vertex between meshes (which would be insane to do by hand). Note: this is not a very fast script (I was trying to learn the Maya API while writing this) so give it some time to work through dense meshes. If you have questions or comments just either send me an email or comment below.


  1. Select the object with the correct weights.
  2. Select the object with the incorrect weights.
  3. Run the command e.g. ‘sjtCopySkinWeights -s “L_” -r “R_”’


This command accepts two arguments -search/-s and -replace/-r and each argument requires a string to follow it that tells the plugin how to map the right joint names to the left ones. Yes it works kind of backwards. The command first constructs a list of all the influences on the first object, then it goes over every vertex on the other object and tries to map it’s influences to the ones in the influence-list from the first object.


On one side the joints are called L_....._JNT and the other R_......_JNT the proper arguments for this command to work would be (MEL syntax):

sjtCopySkinWeights -s "L_" -r "R_"

(if no arguments are givien, this is the default search pattern) This would also have worked (since the search strings can be regular expressions):

sjtCopySkinWeights -s "L_" -r "^[rR]_"

This would allow the right side joints to be named either R_...._JNT or r_...._JNT Just remember the regular expression should go with the -r flag, the -s flag is just used to replace the match from the -r flag with.

Example file

To test the command immediately you can load up th test file included in the zip download ‘’. First try scrubbing in the timeline to see the difference in weighting. The right side (pCube1) bends in the middle but the left side(pCube2) does not. To copy the weights from pCube1 to pCube2 first load the plugin, select pCube1 then pCube2 and type (MEL syntax):


into the command line (or script editor) and then the weights will have been copied from pCube1 to pCube2. Voila.

Sat, 19 Mar 2011 00:00:00 +0000 <![CDATA[Select constraining object]]>

Select constraining object

This is a tiny snippet I threw together today to speed up selecting the object that was controlling my selected object. In this case the object that was being controlled was a curve, but the constraining object (controlling the curve) was an invisible transform node, so instead of going through the hypergraph I wrote this:

import maya.cmds as mc
selection =
toSelect = []
for item in selection:
   constraint = mc.listConnections( item+'.parentInverseMatrix[0]', d=1, s=0,type='constraint')
   if constraint:
      constraint = constraint[0]
      src = mc.listConnections(constraint+'.target[0].targetParentMatrix', d=0, s=1)
      if src:

Note: this allows you to select multiple constrained objects and this will try and find the driving objects, this does not handle multiple constraints or anything fancy like that. Enjoy

Tue, 25 Jan 2011 00:00:00 +0000 <![CDATA[What I learned today #5: Quicktime COM object's volume range.]]>

What I learned today #5: Quicktime COM object’s volume range.

When setting the volume of a quicktime player through COM please keep in mind that the range is from 0-1 NOT 0-100 as I thought (since there doesn’t seem to be any good documentation about the QT COM interface). QT allows you to set the volume to 100 and you end up with painfully loud sound. So set your volume to 1 to allow people to enjoy their hearing for a new day.

Tue, 23 Nov 2010 00:00:00 +0000 <![CDATA[What I learned today #4:Center Current Frame]]>

What I learned today #4:Center Current Frame

When using Maya’s Dope Sheet and Graph Editor you sometimes want to quickly center the editors on the current active frame. You can do this by going ‘View’>’Center Current Frame’ - or - you can add these two commands to your hotkey editor and map that functionality to some spiffy hotkeys: For the Graph Editor: animCurveEditor -edit -lookAt currentTime graphEditor1GraphEd; For the Dope Sheet: dopeSheetEditor -edit -lookAt currentTime dopeSheetPanel1DopeSheetEd; For those who like this sort of stuff there is Cameron Fielding’s ‘Tap your timing’ - tip

Wed, 13 Oct 2010 00:00:00 +0000 <![CDATA[What I learned today #3: Wrapping your paths in quotes!]]>

What I learned today #3: Wrapping your paths in quotes!

Always always always remember wrapping your paths in quotes. I keep running into stuff I wrote break because someone saved a file with a space in it and I forgot to wrap the path in quotes. This works: blackwave.exe -d 50 superwave.wav This doesn’t: blackwave.exe -d 50 super 2.wav (two file arguments, ‘super’ and ‘2.wav’) To fix this: blackwave.exe -d 50 "super 2.wav" So remember: whenever you are using path rembemer the "\""+ variable + "\"" (or something else that suits your language)

Wed, 06 Oct 2010 00:00:00 +0000 <![CDATA[What I learned today #2: Various definitions of TEMP]]>

What I learned today #2: Various definitions of TEMP

In Softimage on Windows, if you fetch the TEMP environment variable e.g. from witihn python (with the os.environ dictionary), you will get a different directory when you get the TEMP variable from outside Softimage. Outside Softimage you get: C:\Users\<username>\some\path\I\cannot\rembemer within it you get: C:\Users\<username>\some\path\I\cannot\rembemer\XSI_temp_### Just in case you wanted to write files to TEMP and read from them later.

Mon, 04 Oct 2010 00:00:00 +0000 <![CDATA[What I learned today #1: profiling helps you make things run faster]]>

What I learned today #1: profiling helps you make things run faster

After seeing an excellent post (as usual) on Hamish’s site about a profiling utility he wrote I decided to give it a try today, and man is this thing useful or what. It helped me find bottlenecks in two of my scripts today and I can only imagine how much of the user’s time it will save.

Wed, 29 Sep 2010 00:00:00 +0000 <![CDATA[Something sketchy]]>

Something sketchy

These have been making their rounds on the internet the last few days, and rightly so, they are absolutely fantastic. Sketchy Duel: Sketchy Ice Cream: Sketchy Guard: Truly fantastic work. Simple, clear, freaking hillarious.

Tue, 31 Aug 2010 00:00:00 +0000 <![CDATA[ - a fantastic python resource]]> - a fantastic python resource

I ran into Doug Hellmann’s site the other day And he an excellent collection of articles and examples for a bunch of modules from python’s standard library called Python Module of the Week. The one’s I’ve used and had no idea existed were configparser, optparser and the logging module. But there are many, many more there. Absolute gold for those of us who havent gone through every page of the documentation.

Wed, 16 Jun 2010 00:00:00 +0000 <![CDATA[An even tinier update]]>

An even tinier update

Well, this place sure has been quiet for the last few months. Might have something to do with having a 14 month old son coupled with working on Thor. Recently I’ve mostly been making some handy tools for Maya. One thing I learned is that if you playblast from maya using the x264 codec you simply need to remux the file and package it in an mp4 container and then you got yourself a nice quicktime-playing h264 playblast. Very handy stuff. Busy times. Who knows when i’ll post something again. The supsense is probably unbearable. As always you can catch my slighly more frequent posts on twitter.

Thu, 29 Apr 2010 00:00:00 +0000 <![CDATA[tiny update]]>

tiny update

A small tiny update with some fun news. I started working at CAOZ in Reykjavik a couple of months back. (Before that switch I animated two frog-filled Vodafone spots for Mistrti). I’ll be working on the first Icelandic CGI-feature Thor - the edda chronicles which is a co-production between CAOZ in Reykjavik, Ulyesses in Hamburg, Germany and Magma Productions in Galway, Ireland. I’ve been working on the storyboards (editing them together and such) and writing some rigging scripts and soon I’ll move over to some pipeline tools and some more rigging scripts. And of course animating once animation starts. Fun times ahead. So expect fewer posts than usual. (There is something less than 0?)

Wed, 25 Nov 2009 00:00:00 +0000 <![CDATA[Back from Siggraph]]>

Back from Siggraph

I’m back from Siggraph, which was a blast (although a bit hot). Met some fun people and it was unreal seeing my film on the big screen. At Siggraph I saw some clips of Sony’s Cloudy with a chance of meatballs (in 3d, which I don’t find all that exciting) and this looks like it’s going to be a really fun movie. I’m really digging some of the animation choices made on this film. For example I find the way Flint walks toward the garbage can on the pier in the ‘burger rain’ sequence (you might know what I’m talking about, if not you will in a couple of weeks) awesome. It’s just a fantastic walk! Anyway, I can’t wait to see this film.

Wed, 12 Aug 2009 00:00:00 +0000 <![CDATA[Siggraph here I come!]]>

Siggraph here I come!

Leaving for New Orleans (via New York) in roughly 6 hours. In the meantime you can check out my ‘almost’-new reel on the work page

Mon, 03 Aug 2009 00:00:00 +0000 <![CDATA[Small update]]>

Small update

I updated my resume a little bit. I’ve also updated my reel, but I’ve yet to upload it. I’m sure it will turn up here in the near future These are all small parts of the great “going-to-siggraph” plan.

Tue, 28 Jul 2009 00:00:00 +0000 <![CDATA[Siggraph 2009]]>

Siggraph 2009

Well, it’s settled - I’ll be going to New Orleans this August to attend Siggraph. Now I just have to decide what to do and when to do it while I’m there. We should definitely grab a beverage of some sort if you are going.

Sat, 04 Jul 2009 00:00:00 +0000 <![CDATA[A tiny FCP tip]]>

A tiny FCP tip

I had this issue the other day where I had at some point deleted the sound that accompanied a clip from a timeline. The quickest way I found was the ‘match frame’ (shortcut: f) command. Just put your playhead on the start of the clip you want to get the sound back from and hit f. Then the viewer loads with the source clip (not the clip from the timeline) with the appropriate in and out points. Then you can either hit f10 or use your preffered method of inserting thing into your timeline. And there’s your clip with sound. I found this extremely useful when I had to recover the sound from around 100 shots. Then I pressed the down arrow key, hit f, f10 and repeat.

Fri, 03 Jul 2009 00:00:00 +0000 <![CDATA[A really nice post on using GTD for animation]]>

A really nice post on using GTD for animation

Jason Schleifer wrote a really nice post about GTD and some ideas about how to use it for animation. He’s also got some nice posts about using and other nice stuff. Check it out.

Mon, 15 Jun 2009 00:00:00 +0000 <![CDATA[Really old stuff]]>

Really old stuff

Back in the day when I started messing with 3d I was usually planning crazy shorts, and I think this one takes the cake: Ducks at War. I think I only modeled a few assets for it, and If it looks a bit like Band of Brothers it’s no accident. Those were the days. (Click for bigger version) daw1

Thu, 04 Jun 2009 00:00:00 +0000 <![CDATA[Siggraph 2009 - the adventure continues]]>

Siggraph 2009 - the adventure continues

If you haven’t seen this already, I got nominated for an award at the siggraph 2009 computer animation festival, in the WTF (Well told fable) category. Official press release So I guess I’ll be going to New Orleans in August, or at least trying to.

Mon, 18 May 2009 00:00:00 +0000 <![CDATA[Replace layers in a composition in AfterEffects]]>

Replace layers in a composition in AfterEffects

I found this tip somewhere and thought I’d share this as the first in hopefully several posts of the “post a week ‘othon”. To replace a layer in a composition with a new item from the project window select the layer to be replaced in the composition window. Press option and drag the item from the project window and drop it on top of the selected layer in the composition window. Simple. This preserves everything you had done to the first layer. So this saves you the hassle from dropping in the new item, copying animation, effects and transforms. I don’t know why I didn’t know before last week.

Mon, 18 May 2009 00:00:00 +0000 <![CDATA[The best thing in the world]]>

The best thing in the world

Made in Canada

Yup, all the rumors are true, I’m a father now and by the way, it’s the best! This awesome boy was born Feb. 25th which makes him almost 10 weeks old. Man, time sure flies when you’re having fun (and animating for Framestore here in Iceland (a two week gig on Sherlock Holmes)).

Sun, 03 May 2009 00:00:00 +0000 <![CDATA[Cool news!]]>

Cool news!

I somehow forgot, but my short friends? was accepted to the Siggraph computer animation festival. Too bad I can’t go to New Orleans, that would have been a blast.

Sat, 02 May 2009 00:00:00 +0000 <![CDATA[Dancing with the poses]]>

Dancing with the poses

Since this last season of ABC’s Dancing with the Stars is over I thougt now would be an appropriate time to write a little bit about posing that has been on my mind these last couple of weeks. Dancers sometimes push their poses to the extreme, it’s what makes their dances look good and makes it fun watching them and the same goes for animation. Animation without good posing can at best be really well timed crap. Pushing my poses is something that I have struggled with in my animation and I’m constantly trying to get myself to push the pose a little bit further since it’s always easier pulling back a little then trying to push them more after the fact. A couple of weeks ago while watching an episode of Dancing with the Stars I started paying attention to the pro-dancer’s posing versus the star’s. The pro usually takes his poses a little bit further and that makes all the difference. Here is a picture from one of the last episodes of DwtS:


Here you can clearly see the difference between the pro (on the right) and the amateur (on the left). His dynamic pose is full of character and engergy while her pose is rigid and boring. More examples:

image1 image2 image3

These examples clearly show how important posing is. But you already knew that.

Tue, 02 Dec 2008 00:00:00 +0000 <![CDATA[Friends? on Youtube]]>

Friends? on Youtube

Seems VFS has decided to put my film on Youtube, just to let the world know. Link to Friends? on Youtube

Wed, 05 Nov 2008 00:00:00 +0000 <![CDATA[Add 360 to keyframe values]]>

Add 360 to keyframe values

Here’s a little mel snippet that I found occasionally useful while animating, all these commands do is add (or subtract) 360 from a keyframe value - which is perfect for those rotational values that need to come down (or go up). Anyway, to add 360 degrees: keyframe -e -r -vc 360; Subtract 360 degrees: keyframe -e -r -vc -360; I’ve found this useful in certain cases (gimbal lock?). And hopefully someone can find this useful as well.

Thu, 02 Oct 2008 00:00:00 +0000 <![CDATA[Maya scripts]]>

Maya scripts

While I was making friends? I wrote some useful maya scripts that did all sorts of tedious things (like creating 100 bend deformers and controlling them with one control and a dash of randomness). I’ve decided to put some of those scripts online and you can find them on the new Maya scripts page ( there only two there right now ). Some of those scripts are written in Python, some in Mel, although I do like Python way more then Mel (somehow using backticks as an integral part of a programming language doesn’t strike me as a good idea).

Sun, 24 Aug 2008 00:00:00 +0000 <![CDATA[Small update]]>

Small update

Just updated The work page with “new” old stuff. Enjoy.

Thu, 21 Aug 2008 00:00:00 +0000 <![CDATA[friends?]]>


[flashvideo filename=efni/friends.500x270.flv width=500 height=270 /] Finally it has arrived. My VFS final project titled friends? that I have been working on for the last 6 months. A better looking Quicktime version is on the new work page. Just a little plug; the music is by my brother, Einar Sv. Tryggvason. Enjoy.

Mon, 18 Aug 2008 00:00:00 +0000 <![CDATA[Something is brewing]]>

Something is brewing

Two weeks until I hand in my final reel. Two weeks.

Thu, 31 Jul 2008 00:00:00 +0000 <![CDATA[Maya's built-in calculator (sort of)]]>

Maya’s built-in calculator (sort of)

Just a little Maya tip here if you have Maya 8.5 or later. If you need to make some calculations and don’t want to go find your calculator of choice you can use Maya to calculate stuff for you. First, make sure you have python active in the command line (bottom left text field).


If it says MEL, just click it and it should switch to Python


Then you just type in what you want calculated, for example if you type in “4+4” and then hit control-enter, then the results pops up in the command response window. Easy.


IMPORTANT NOTE To use Python as your calculator you have to remember that if you are using division remember to type the number you want to divide as a decimal number (like 5.0 instead of 5) otherwise you’ll get a rounded down result. 5/2 gives you 2 and 5.0/2 gives you 2.5. This obviously doesn’t matter if you are adding, multiplying or subtracting.

Wed, 16 Apr 2008 00:00:00 +0000 <![CDATA[sjtNotes v1]]>

sjtNotes v1

Well, it’s been pretty quiet around here for the last couple of weeks (months?) but now something happens; a new mel script. sjtNotes is a supersimple script that simply allows you to have some notes inside your scene that are saved along with your scene file. The script is ridiculously simple and opens this window:


Then you type your notes and hit “Save & close” and then run the script again and edit those notes and again save and close. You get the drift

Anyway, here’s the link to this awesome script: sjtNotes v1 If there is anything wrong with this script or you actually can use this then please let me know. In other news I’m just busy working on my demo reel at VFS mostly spending my time rigging and learning stuff about maya that I didn’t know, like the deformation order, which I like a lot and has saved my ass on one occasion. Oh, and I’m dabbling with RenderMan, it. is. awesome. (so far at least).

Wed, 02 Apr 2008 00:00:00 +0000 <![CDATA[Macbook Air]]>

Macbook Air

I like Wil Shipleys post on the Macbook Air.

I couldn’t agree more.

Wed, 16 Jan 2008 00:00:00 +0000 <![CDATA[What's new]]>

What’s new

1. Term 3 just started and it looks like it will be a busy one. 2. I might try to keep this blog a tad more active while working on my final project. Or not. 3. For other news see my twitter page or just check out my tweets here (look in the right column, and scroll a little bit down)

Tue, 15 Jan 2008 00:00:00 +0000 <![CDATA[Match translation "tool" for Maya]]>

Match translation “tool” for Maya

For those who have used XSI for anything have most likely encountered the very useful “Match translation” tool (and it’s variants). This tool exists in Maya but according to some it doesn’t work very well especially when within a hierarchy. So a solution was to constrain the object you want to move to the object that we want to match the translation to and then, in the outliner, delete the constraint. This obviously is very tedious especially if you want to this many times. So I decided to try creating my first mel scripts and created a set of scripts in a custom shelf that do this automatically. Here is the “Match translation” script: string $nodes[]; $nodes = `selectedNodes`; pointConstraint -name tmpconstraint -offset 0 0 0 -weight 1; select -r tmpconstraint; delete; select $nodes[size($nodes)-1];

This script simply automates the steps listed above and the other variants (translation+orientation, orientation, scale) all work in almost the same way. These scripts work like this: you first pick the object that you want to match the translation to and second select the object you want to move and then hit one of the shelf buttons. Simple right? I like to use these script as marking menus and on that note I was thinking about creating a tutorial that shows how to add custom marking menus, since I guess that some people simply don’t know how to do that (but many of you do). That tutorial will hopefully be up soon. Anyway, you can find the script here and to install it you simply place it in

/Users//Library/Preferences/Autodesk/maya/8.5/prefs/shelves (on a mac)

and I can’t remember where to place it on other platforms.

Thu, 18 Oct 2007 00:00:00 +0000 <![CDATA[Animation Show 3]]>

Animation Show 3

Well, last Saturday me and Halldora went to see the Animation Show 3, a collection of 14 animated shorts. It was really fun seeing all these diffirent styles of animation coming together. Some of my favorites of the show are Don Herzfeldt’s “Everything will be OK”, Bill Plympton’s “Guide Dog”, “Overtime” and “Collision”. “Collision” was really interesting since it showed only shapes being animated and yet managed to tell a story (of sorts), it’s always fun to see something totally new (to me). So all in all it was a really fun show and I recommend that you try and see it when you can. Tomorrow I am going to see the SIGGRAPH Electronic Theatre. Hope that will be as fun as the Animation Show.

Wed, 19 Sep 2007 00:00:00 +0000 <![CDATA[Vancouver, here we are!]]>

Vancouver, here we are!

Well, I’m finally here in beautiful Vancouver, British Columbia. Actually right now I’m sitting on the Starbucks just down the street from where I and my girlfriend are living. Yesterday I accidentally bumped into Helgi, an Icelandic student in 3D Animation & visual effects at VFS. That lead to an informal tour of the Burrard campus. We went to see several computer labs, classrooms and students busy trying to complete their projects in time. Now I really can’t wait to go to orientation day which is in 9 days. What to do until then? Maybe get an apartment?

Sat, 11 Aug 2007 00:00:00 +0000 <![CDATA[More animation tests.]]>

More animation tests.

This is a shot test I just did. It’s fun. [flashvideo filename=efni/kuluGil_2_thjappad.flv width=500 height=300 /]

Sat, 21 Jul 2007 00:00:00 +0000 <![CDATA[Bouncing balls are fun.]]>

Bouncing balls are fun.

Sat, 21 Jul 2007 00:00:00 +0000 <![CDATA[After Effects ScriptUI]]>

After Effects ScriptUI

A few weeks ago I was looking through Jeff Almasol’s site (whose rd_ScriptLauncher script is awesome) and I wanted to create a script that utilizes a UI like his scripts do. I started looking through the AE scripting documentation and only found ScriptUI mentioned in the introduction. After a bit of digging I found that the Bridge javascript reference (pdf) has a ScriptUI reference section. Not everything in there works with AE but most of it does. So now nothing should stop me from scripting awesomeness.

Wed, 20 Jun 2007 00:00:00 +0000 <![CDATA[The theme]]>

The theme

I got the new theme up and running. Now to fix the rest of the site ...

Tue, 19 Jun 2007 00:00:00 +0000 <![CDATA[New old stuff]]>

New old stuff

Well, I finally added some more old stuff to, Headless, a little test I made a few months ago. Sadly that is the only thing that has happened.

Tue, 05 Jun 2007 00:00:00 +0000 <![CDATA[]]>

Well, is back up with some of my stuff - I think I’d like to put more stuff there, but we will see. Now the only thing left to do is make this blog look a little nicer than it does now. Hopefully I’ll get a chance to do that in the coming weeks.

Sun, 13 May 2007 00:00:00 +0000 <![CDATA[nr. 2]]>

nr. 2

I hope you are still ready.

Mon, 07 May 2007 00:00:00 +0000 <![CDATA[nr. 1]]>

nr. 1

This is the first post. Get ready.

Wed, 18 Apr 2007 00:00:00 +0000