While college was on I hardly had any time at all to work on this. I found a spare three hours this morning and implemented 'controllers'. Currently you can instruct the boids to follow or to be attracted/repelled/directed by controllers. I also implemented a way of detecting the orientation of the ground plane from the cross product of the last two direction vectors (with necessary error checking, direction flipping etc) and replaced all of the orientation interpolation code with quaternion slerp. This will obviously need some more careful coding to make sure that the boids don't suffer from quaternion flip - hopefully I can get the smooth interpolations of quats with the twistability of eulers (i.e. >360 degree angles).
I've also been messing with low-poly stuff seeing as that seems to be in vogue this year what with 'Between Bears' rocketing up the vimeo charts. After walking in the woods this evening in low light I was trying to work out how to get the sense of a curved ground plane from only the striation of the tree trunks. Kept running into anti-aliasing issues though - the opposite type from usual - smooth fades from black to white wasn't quite what I had in mind.
Two reels of Kodachrome and one of Ektachrome back from Dwayne's Photo USA. Point and hope film-making meets Dada-ism when I get behind a Sankyo MF404 with a shorting out power pack, focus marks that don't match and a wonky reflex mirror. Its sad to think that in 16 days time no-one in the entire world will be able to develop such a vivid and reliable film stock - this was shot on 19 years out of date K40 and the weakest link in getting it on the net is my brother's HD handycam I used for the telecine not the ageing AGFA Family Projector Set. Video's in the processing queue on Vimeo - fingers crossed it will be up this afternoon - codecs kill the grain though.
Here's a couple of Muybridge sequences (public domain) which I motion tracked and ghosted. I often turn on arcs and ghosting in Blender and Maya, but occasionally I'm not sure what I'm meant to be looking for. Neither my tracking nor the Muybridge sequences are perfectly synced but you get the rough idea.
This one was a pain to even out - There's almost certainly a mis-shoot in the original Muybridge photos.
Both of these are based on public domain material so you can download them for free and use them for commercial or non-commercial purposes. For what its worth my addition to the Muybridge images is licensed as CC-0.
I spent a few hours earlier today filing bug reports for things that cropped up over the course of the last few mini-projects and tidying up some of my model files and sticking them on blendswap for the perusal of the masses. Hopefully the few improvements to the rig will make it harder to break in future (I unearthed a few problems as the animation work progressed). I plan to retarget my basic biped rig to a few other character models I'm working on. Nothing exciting to show for them now - spent the whole evening pushing triangles out of the face topology!
Wow, that's pretty much the first full project I've run from start to end through the blender 2.5 pipeline. Its not bugless yet, but its getting there. Automerging keyframes still seems to have a few problems on the animation front, and I encountered one or two armature bugs along the way - all thankfully now fixed in the SVN builds. Hair sim seems a little crazy at times - It was adding a humongous amount to my render times in the calculating vector pass (probably a bug?) and getting blender to render from the same particle cache which is on display in the viewport takes some persuading. Much fewer crashes than I was used to last time I tried to render a complex scene in 2.5 but I still had to do the late night babysitting to restart the render when I hit an occasional glitch. Hopefully I'll get some time to do some bug reporting over the weekend.
Thanks to some help from Jahka on #blendercoders I've now fathomed what the cache buttons do and a few other options relating to hair dynamics:
Cache Step: This affects how often results are saved and as a result the accuracy of the played back simulation cache/bake. When you run a simulation each frame (and any subframe steps if you have them enabled) gets calculated, but if your cache step is set at 10 then only every tenth frame is actually saved for playback.
Quick Cache: With this on the cache step is used for the simulation. If cache step is at 10 then only every 10th frame is simulated and only every tenth frame is saved.
Effectors and Hair Dynamics: If you have hair dynamics off then effectors (objects with force fields etc) get used to shape/twist/curve the hair in all sorts of interesting and exciting ways. You can use empties with forces on (on the same layer) to fake the effect of the wind/follow-though etc or curve guides to change the hair style. If you switch on hair dynamics suddenly all these forces have a different meaning. They are now used to effect the dynamic simulation of the hair rather than to effect its grown shape.
Sometimes my poses are just too strong and the animation ends up being very exaggerated and hard to follow, and sometimes they're too weak and need amplifying. Joshua Leung's new push and relax features for pose bones in blender do a great job of handling in betweens and making them more or less similar to the neighbouring keys. Often I find that before I even get to the inbetweening phase of animation I want to edit my key poses in a similar manner. Especially with the spine and neck I want to be able to relax the bone's locations and rotations towards the rest pose (the same way I would smooth vertices when I'm modelling). Here are two more python scripts I threw together this morning while working on another walk cycle...
Smooth Pose
import bpy,mathutils
amount=0.05
a=mathutils.Quaternion((1,0,0,0)) for each_bone in bpy.context.selected_pose_bones: each_bone.location=each_bone.location*(1-amount) if each_bone.rotation_mode=='QUATERNION': each_bone.rotation_quaternion=each_bone.rotation_quaternion*(1-amount)+(amount*a) elif each_bone.rotation_mode!='AXIS_ANGLE': each_bone.rotation_euler[0]=each_bone.rotation_euler[0]*(1-amount) each_bone.rotation_euler[1]=each_bone.rotation_euler[1]*(1-amount) each_bone.rotation_euler[2]=each_bone.rotation_euler[2]*(1-amount)
Exaggerate Pose
import bpy,mathutils
amount=0.05
a=mathutils.Quaternion((1,0,0,0)) for each_bone in bpy.context.selected_pose_bones: each_bone.location=each_bone.location*(1+amount) if each_bone.rotation_mode=='QUATERNION': each_bone.rotation_quaternion=each_bone.rotation_quaternion*(1-amount)-(amount*a) elif each_bone.rotation_mode!='AXIS_ANGLE': each_bone.rotation_euler[0]=each_bone.rotation_euler[0]*(1+amount) each_bone.rotation_euler[1]=each_bone.rotation_euler[1]*(1+amount) each_bone.rotation_euler[2]=each_bone.rotation_euler[2]*(1+amount)
At the moment the scripts only support quaternions and eulers as that's all I use in my rigs. If you're an axis angle person please enlighten me as to what on earth its for! Here's the walk cycle (crits welcome):
On another note I started hacking away at blender's source code last night trying to code smoother deforms for b-bones, which in my opinion look great until you turn on mesh display when it somehow manages to fold up the mesh in all sorts of nasty ways if you're using it for something wide (like a torso) rather than something skinny (like an arm). While I haven't made much useful progress yet (other than beginning to understand the built in math libraries) I did stumble upon this very nice explanation of matrices, vectors and coordinate systems which I wish I'd found ages ago when I started diving into python in blender.