For Blitz3D machinima, a few years ago I experimented with using Blitz3D itself. What I did was create room setup, character movement, and camera movement functions, along with text display ones. I then read from a script (just a plain text file) and called those functions (passing a single number to tell it which pre-coded portion to run) based on the number of seconds elapsed.
For example, here's the start of the Hungry Guy script:
3
disp 1
6
disp 0
Cam 1
7
Cam 0
8
disp 2
11
disp 0
Cam 2
While this worked, it made the script rather hard to understand. So for the Shootout script, I improved the text file reader function to support more options. The parameters in most cases are just passed directly to the appropriate Blitz command, though sometimes several Blitz commands are used together for complex actions. Shootout's script begins:
0 Initial Setup
Cam -30,15,0,0,-120,0
AmbientLight 120,120,120
anim Good1, 13, 1, 0.3, 0
anim Good2, 13, 1, 0.4, 0
anim Bad1, 24, 1, 0.35, 0
2 Soldier 2 asks question
disp 0,255, 0,500,500, "Did you hear something?",2
5 Soldier 1 replies
disp 128, 128, 255, 300, 500, "No, nothing.", 2
7 Start the bad guy creeping forward
anim Bad1, 28, 1, 0.25, 10
move Bad1, 0, 0, -.15, 6
8 Move camera to show bad guy
cam 0, 25, 5, 20, 180, 0
Here are the compiled results for you to look at:
http://neonavis.com/HungryShootout.zip (3.7 megs).
The only other tools used here are XLnt ii GUI for the playback controls, though those aren't needed in actual cutscenes (be sure to hit "Play" to start Hungry Guy; Shootout auto-starts). The animated models' pre-done animations are called with the usual LoadAnimMesh/ExtractAnimSeq/Animate commands. Camera movement is via MoveEntity/TurnEntity (and PointEntity to follow a character's movement).
So, Blitz3D can serve as a capable cutscene engine. Its flexibility is especially nice for things like substituting characters (if one were dead and another took its place) and otherwise changing things to match what happened earlier in the game.