It has been silent for nearly two weeks now. I am working on the animatic, and i see very little point in updating a lot before that part is finished.
Animatic is a great way to test out the the rig i have made so far and there are a number of fixes that needs to be done. Also to the current scene-set.
Tuesday, 14 July 2009
Saturday, 4 July 2009
Versions of the Rig
I have, after heavy pressure from morten made some scripts and versions of the rig for:
proxy
Lowres
Highres
(I will post the scripts here later on, when they hasve proven to work 100%)
proxy
Lowres
Highres
(I will post the scripts here later on, when they hasve proven to work 100%)
Friday, 3 July 2009
Animatic
Morten is intensly working on the music, but finally things seems to be moving a tad faster.
Editing!
Meanwhile i am doing my rigging. My good friend Morten Overlie has come to visit me here in Spain to do a little editing of my shortmovie in-between the sangrias he has promised to consume. In vast quantities.
Hopefully I can release parts of the first animatic-sessions here on the blog.
The animatic will be done entirely in 3d as i see little point in starting drawing/scanning/editing pictures when the entire process is so quick in 3d.
Hopefully I can release parts of the first animatic-sessions here on the blog.
The animatic will be done entirely in 3d as i see little point in starting drawing/scanning/editing pictures when the entire process is so quick in 3d.
Friday, 26 June 2009
Corrective morph-system
Sometimes. Most of the time. Two morphtargets will not play friends. Meaning that together they move same points in [X,Y,Z] When both are triggered the points get a double-translation that ends in PURE UGLINESS.
To ensure that the result is better, we apply a third morph that fixes the result
This morph is dedicated to only fix this coincidene and is called a corrective-morph
Morph1 + Morph2 = ugly
Morph1 + Morph2 +correction = nice
UGLY----->NICER 
Thats all nice.
The problem i had was how to make this system automatic.
When the two morphs are triggered together i wanted a percentage of the third morph to be triggered. Doesnt sound hard? We are actually talking here about two values controlling one value. And there is no multiply/divide-node in max.
The resulting math would look something like this:
Morph1*morph2 = value of correctivemorph/2
But where to write this in max?
So i decided on fixing it on the face-gui level.

The yellow dot is the controller. When moved along Y. it triggers morph1. Along X, Morph2.
Since the extenct of values are [1,1] the diagonal would have to be 45-degrees.
So if i made a another "invisible shape"(the grey rectangle inside the yellow dot) 45 degrees on the controller...its local-axis X would always be defined by the controllers XY. Perfect. One value derived from TWO values.
Pointconstrain the "invisible shape" to the controller and voila!
This localX was easy enough to use to trigger the corrective morph through a ExposeTransform-node.
To ensure that the result is better, we apply a third morph that fixes the result
This morph is dedicated to only fix this coincidene and is called a corrective-morph
Morph1 + Morph2 = ugly
Morph1 + Morph2 +correction = nice


Thats all nice.
The problem i had was how to make this system automatic.
When the two morphs are triggered together i wanted a percentage of the third morph to be triggered. Doesnt sound hard? We are actually talking here about two values controlling one value. And there is no multiply/divide-node in max.
The resulting math would look something like this:
Morph1*morph2 = value of correctivemorph/2
But where to write this in max?
So i decided on fixing it on the face-gui level.

The yellow dot is the controller. When moved along Y. it triggers morph1. Along X, Morph2.
Since the extenct of values are [1,1] the diagonal would have to be 45-degrees.
So if i made a another "invisible shape"(the grey rectangle inside the yellow dot) 45 degrees on the controller...its local-axis X would always be defined by the controllers XY. Perfect. One value derived from TWO values.
Pointconstrain the "invisible shape" to the controller and voila!
This localX was easy enough to use to trigger the corrective morph through a ExposeTransform-node.
Thursday, 25 June 2009
More Morphs
Shifting volume around can be tedious. but after a while it becomes rather meditative. And you keep moving point/vertices around untill its looking good. :)
This is the mesh that is going to be the morph-target for the inner part of the eyebrow...moving down.

the eyebrow is divided into three. Inner, middle, outer. They have to move: up, down, left, right.
And since the system needs to be on both sides we get
3*4*2=24 morphs just for the eyebrows. Luckily its easy to flip the geomitry over to the right side with the new polygon tools in max.
That little toolbox there with looptools (curve and straight) really makes my day.
This is the mesh that is going to be the morph-target for the inner part of the eyebrow...moving down.

the eyebrow is divided into three. Inner, middle, outer. They have to move: up, down, left, right.
And since the system needs to be on both sides we get
3*4*2=24 morphs just for the eyebrows. Luckily its easy to flip the geomitry over to the right side with the new polygon tools in max.
That little toolbox there with looptools (curve and straight) really makes my day.
Wednesday, 24 June 2009
Scripts scripts scripts
I am a beginner scripter. I am really new to it all.
But they are a great way to save you loads of work.
Here is an example:
15 bones are running down each arm the torero. I want them to be maya-style/tendons so i can easily pull them off the rig and make nice arcs etc etc.
That would take me half an hour of quite repetitious clicking/selection/applying/aligning.
Here is a script that does it in one second. It could probably be written nicer and use FN()-functions for some of the things. But it works great!
AxisPointArray=#()
BoneArray =#()
join BoneArray $Selection
for i=1 to BoneArray.count do
(
PositionPoint = point()
PositionPoint.box = true
PositionPoint.size = 8
PositionPoint.wirecolor = color 0 255 0
PositionPoint.transform = BoneArray[i].transform
PositionPoint.name = "Position_" + BoneArray[i].name
join PositionPointArray PositionPoint
)
for i=1 to BoneArray.count do
(
AxisPoint = point()
AxisPoint.box = true
AxisPoint.size = 8
AxisPoint.wirecolor = color 0 255 0
AxisPoint.transform = BoneArray[i].transform
AxisPoint.name = "Axis_" + BoneArray[i].name
in coordsys local move Axispoint [0,0,8]
join AxisPointArray AxisPoint
AxisPoint.Parent = PositionPointArray[i]
)
for i =1 to BoneArray.count do
(
--BoneArray[i].position.controller = position_XYZ ()
BoneArray[i].position.controller = position_list ()
MyposConst = Position_Constraint ()
MyposConst.appendtarget PositionPointArray[i] 50
BoneArray[i].pos.controller.Available.controller = MyposConst
)
for i=1 to BoneArray.count-1 do
(
Aimer= lookat_constraint()
BoneArray[i].rotation.controller = Aimer
BoneArray[i].rotation.controller.constraints.appendtarget PositionPointArray[i+1] 50
Aimer.lookat_vector_length = 0
Aimer.PickUpNode = AxisPointArray[i]
Aimer.upnode_world = false
)
-------------------------
------------------------
And here is what the script does :
Adds the green points to the correct-places and binds the bones to the green points.
But they are a great way to save you loads of work.
Here is an example:
15 bones are running down each arm the torero. I want them to be maya-style/tendons so i can easily pull them off the rig and make nice arcs etc etc.
That would take me half an hour of quite repetitious clicking/selection/applying/aligning.
Here is a script that does it in one second. It could probably be written nicer and use FN()-functions for some of the things. But it works great!
AxisPointArray=#()
BoneArray =#()
join BoneArray $Selection
for i=1 to BoneArray.count do
(
PositionPoint = point()
PositionPoint.box = true
PositionPoint.size = 8
PositionPoint.wirecolor = color 0 255 0
PositionPoint.transform = BoneArray[i].transform
PositionPoint.name = "Position_" + BoneArray[i].name
join PositionPointArray PositionPoint
)
for i=1 to BoneArray.count do
(
AxisPoint = point()
AxisPoint.box = true
AxisPoint.size = 8
AxisPoint.wirecolor = color 0 255 0
AxisPoint.transform = BoneArray[i].transform
AxisPoint.name = "Axis_" + BoneArray[i].name
in coordsys local move Axispoint [0,0,8]
join AxisPointArray AxisPoint
AxisPoint.Parent = PositionPointArray[i]
)
for i =1 to BoneArray.count do
(
--BoneArray[i].position.controller = position_XYZ ()
BoneArray[i].position.controller = position_list ()
MyposConst = Position_Constraint ()
MyposConst.appendtarget PositionPointArray[i] 50
BoneArray[i].pos.controller.Available.controller = MyposConst
)
for i=1 to BoneArray.count-1 do
(
Aimer= lookat_constraint()
BoneArray[i].rotation.controller = Aimer
BoneArray[i].rotation.controller.constraints.appendtarget PositionPointArray[i+1] 50
Aimer.lookat_vector_length = 0
Aimer.PickUpNode = AxisPointArray[i]
Aimer.upnode_world = false
)
-------------------------
------------------------
And here is what the script does :
Adds the green points to the correct-places and binds the bones to the green points.

Subscribe to:
Posts (Atom)