Posts Tagged ‘WAI’
Vue Stereo Image Camera Creation Script
Sunday, August 16th, 2009
This python script creates a pair of cameras for rendering stereo images in Vue. It’s pretty easy to do without the script but this just speeds things up a bit. Christina has two tutorials about making stereo camera’s on her web site. Its a basic solution that doesn’t generate an animated camera and it won’t work with cameras that aren’t flat and level. Originally created after a request from Jim Coe.
Note: This script does not render the scene. Once you have used it you will need to render the scene from each camera yourself and do whatever magic you need to do with the output.
Download: Vue Stereo Camera Script (3k Zip Archive)
Python Code
#******************************************************
# Creates a pair of cameras in a vue scene for
# rendering stereo position images
#
# - vuestereocamera.py
# - By Mark Caldwell
# - Version 0.1
# - 3rd September 2007
# - Copyright Mark Caldwell 2007
# - Tested with Vue 6.5 Infinite
#
# How to use in 3 easy steps
#
# 1. Download this file onto your computer
#
# 2. Position a camera where you want to render a
# stereo image for and make sure it's your selected
# camera
#
# 3. Then run script and wait for it to work
# To run it go to Python -> Run Python Script
# Then locate the file on your computer
#
#******************************************************
#------------------------------------------------------
# Get Input and Test Value is a positive floating point
#------------------------------------------------------
def TestValAngle (messagetxt,titletxt,default):
hit=-2
val=-1
while hit<0:
try:
if float(val)>0:
hit=1;
elif hit==-2:
val=Prompt (messagetxt,default,true,titletxt)
hit=-1
else:
val=Prompt ("Error: Value must an positive number\n\n"+messagetxt,val,true,titletxt)
except:
hit=-1
val=Prompt ("Error: Value must an positive number\n\n"+messagetxt,val,true,titletxt)
return float(val)
#------------------------------------------------------
# Convert Degrees to Radians
#------------------------------------------------------
def degtorad(deg):
rad=deg*(math.pi/180)
return rad
#--------------------------------------------
# Start of Main Code
#--------------------------------------------
import math
separation=TestValAngle ('Eye Separation','Eye Separation','6.5')
camX=StoreCamera ()
SwitchCamera (camX)
SelectByType(VuePython.VUEBasicObject.VOT_Camera)
cam = GetSelectedObjectByIndex(0)
pos=cam.Position()
rot=cam.GetRotationAngles()
y=(math.sin(degtorad(rot[2]))*separation)+pos[1]
x=(math.cos(degtorad(rot[2]))*separation)+pos[0]
cam.SetPosition(x,y,pos[2])
#----------------------------------------------
# End of Script
#----------------------------------------------
Vue EcoRotate Python Script
Friday, August 14th, 2009
This script for Vue Infinite and xStream allows all the objects / instances in an EcoSystem to point in a direction. It also allows a a bit of variation to be included in the rotation.
Download: EcoRotate (3k Zip Archive)
Python Code
#***********************************************************************
# Set all instances in an EcoSystem to point in a given direction
# - EcoRotate.py
# -
# - By Mark Caldwell
# - Version 0.2
# - 25th August 2007
# - Checked with Vue 6.5 Infinite
#
# How to use in 4 easy steps
# 1. Select an object with a populated EcoSystem
#
# 2. Run this script
#
# 3. Enter the values requested by the script
#
# 4. Wait for the script to work
#
#***********************************************************************
#----------------------------------------------------
# Get Input and Test Value for value 0-360 for Angles
#----------------------------------------------------
def TestValAngle (messagetxt,titletxt,default):
hit=-2
val=-1
while hit<0:
try:
if int(val) in range (0,360):
hit=1;
elif hit==-2:
val=Prompt (messagetxt,default,true,titletxt)
hit=-1
else:
val=Prompt ("Error: Value must be an integer between 0 and 360\n\n"+messagetxt,val,true,titletxt)
except:
hit=-1
val=Prompt ("Error: Value must be an integer between 0 and 360\n\n"+messagetxt,val,true,titletxt)
return float(val)
#--------------------------------------------
# Get Input and Test Value for valuse 0 or 1
#--------------------------------------------
def TestValZO (messagetxt,titletxt,default):
hit=-2
val=-1
while hit<0:
try:
if int(val) in range (0,2):
hit=1;
elif hit==-2:
val=Prompt (messagetxt,default,true,titletxt)
hit=-1
else:
val=Prompt ("Error: Value must be either 0 or 1\n\n"+messagetxt,val,true,titletxt)
except:
hit=-1
val=-3
return val
#--------------------------------------------
# Start of Main Code
#--------------------------------------------
import random
#--------------------------------------------------------------------------
# Test the user has a scene loaded
#--------------------------------------------------------------------------
if TestLoaded():
#--------------------------------------------------------------------------
# Test the user has 1 object selected with an Eco System on it
#--------------------------------------------------------------------------
numselected=CountSelectedObjects()
if numselected>1:
message="Please select only one object."
elif numselected<1:
message="Please select an object."
else:
#--------------------------------------------------------------------------
# Get User values for rotation required, which to rotate and randomness
#--------------------------------------------------------------------------
xon=TestValZO ('Rotate on X axis? (Enter 0 for yes and 1 for no)','Rotate on X?','0')
if xon=="1":
rx=TestValAngle ('Rotate to X (0 to 360 degrees)','X Rotation','0')
rxv=TestValAngle ('Variation of Rotation to X (0 to 360 degrees)','X Rotation Variation','0')
yon=TestValZO ('Rotate on Y axis? (Enter 0 for yes and 1 for no)','Rotate on Y?','0') # Rotate y (set to 1 to change 0 to leave alone)
if yon=="1":
ry=TestValAngle ('Rotate to Y (0 to 360 degrees)','Y Rotation','0')
ryv=TestValAngle ('Variation of Rotation to Y (0 to 360 degrees)','Y Rotation Variation','0')
zon=TestValZO ('Rotate on Z axis? (Enter 0 for yes and 1 for no)','Rotate on Z?','0') # Rotate z (set to 1 to change 0 to leave alone)
if zon=="1":
rz=TestValAngle ('Rotate to Z (0 to 360 degrees)','Z Rotation','0')
rzv=TestValAngle ('Variation of Rotation to Z (0 to 360 degrees)','Z Rotation Variation','0')
#--------------------------------------------------------------------------
#Set Up a Few Variables
#--------------------------------------------------------------------------
bObject=GetSelectedObjectByIndex(0) # Get first selected object
Eco = GetEcosystemOnObject(bObject) # Get EcoSystem on first selected
objlist=[bObject]
if Eco==None:
message="Please select an object with an EcoSystem material applied to it."
elif bObject.IsLocked(): # Check object isn't locked
message="Please select an object that isn't locked."
else:
ecocount=Eco.GetInstanceCount () # Count number of instances in EcoSystem
if ecocount==0:
message="Please select an EcoSystem that has been populated."
else:
#--------------------------------------------------------------------------
# Rotate EcoObjects
#--------------------------------------------------------------------------
for i in range(0,ecocount):
currentrotation=Eco.GetInstanceRotation (i)
if xon!="1":
rix=currentrotation[0]
else:
rix=rx+random.uniform(-rxv,rxv)
if yon!="1":
riy=currentrotation[1]
else:
riy=ry+random.uniform(-ryv,ryv)
if zon!="1":
riz=currentrotation[2]
else:
riz=rz+random.uniform(-rzv,rzv)
Eco.SetInstanceRotation(i,rix,riy,riz)
message="Eco Rotation Success"
else:
message="No Scene Loaded"
Message(message) # Display message
#--------------------------------------------------------------------------
# End of Script
#------------------------------------------------------------------------
Vue EcoSystem Vertical Scatter
Thursday, August 13th, 2009
This python script vertically scatters the objects in a Vue EcoSystem by a random amount and works with Vue Infinite and xStream.
Download: Vue EcoSystem Vertical Scatter Script (3k Zip Archive)
Python Code – Vue EcoSystem Vertical Scatter Script
#***********************************************************************
# Set all instances in an EcoSystem to have random heights
# - EcoVerticalScatter.py
# -
# - By Mark Caldwell
# - Version 0.1
# - 5th September 2007
# - Checked with Vue 6.5 Infinite
#
# How to use in 4 easy steps
# 1. Select an object with a populated EcoSystem
#
# 2. Run this script
#
# 3. Enter the values requested by the script
#
# 4. Wait for the script to work
#
#***********************************************************************
#------------------------------------------------------
# Get Input and Test Value is a positive floating point
#------------------------------------------------------
def TestVal (messagetxt,titletxt,default):
hit=-2
val=-1
while hit<0:
try:
if float(val)>=0:
hit=1;
elif hit==-2:
val=Prompt (messagetxt,default,true,titletxt)
hit=-1
else:
val=Prompt ("Error: Value must an positive number\n\n"+messagetxt,val,true,titletxt)
except:
hit=-1
val=Prompt ("Error: Value must an positive number\n\n"+messagetxt,val,true,titletxt)
return float(val)
#--------------------------------------------
# Start of Main Code
#--------------------------------------------
import random
#--------------------------------------------------------------------------
# Test the user has a scene loaded
#--------------------------------------------------------------------------
if TestLoaded():
#--------------------------------------------------------------------------
# Test the user has 1 object selected with an Eco System on it
#--------------------------------------------------------------------------
numselected=CountSelectedObjects()
if numselected>1:
message="Please select only one object."
elif numselected<1:
message="Please select an object."
else:
#--------------------------------------------------------------------------
# Get User values for rotation required, which to rotate and randomness
#--------------------------------------------------------------------------
heightup=TestVal ('Maximum Z Increase','Maximum Z Increase','100')#
heightdown=TestVal ('Maximum Z Decrease','Maximum Z Decrease','0')
#--------------------------------------------------------------------------
#Set Up a Few Variables
#--------------------------------------------------------------------------
bObject=GetSelectedObjectByIndex(0) # Get first selected object
Eco = GetEcosystemOnObject(bObject) # Get EcoSystem on first selected
objlist=[bObject]
if Eco==None:
message="Please select an object with an EcoSystem material applied to it."
elif bObject.IsLocked(): # Check object isn't locked
message="Please select an object that isn't locked."
else:
ecocount=Eco.GetInstanceCount () # Count number of instances in EcoSystem
if ecocount==0:
message="Please select an EcoSystem that has been populated."
else:
#--------------------------------------------------------------------------
# Rotate EcoObjects
#--------------------------------------------------------------------------
for i in range(0,ecocount):
currentposition=Eco.GetInstancePosition (i)
x=currentposition[0]
y=currentposition[1]
z=currentposition[2]+random.uniform((-heightdown),heightup)
Eco.SetInstancePosition(i,x,y,z)
message="Eco Vertical Scatter Complete"
else:
message="No Scene Loaded"
Refresh()
Message(message) # Display message
#--------------------------------------------------------------------------
# End of Script
#------------------------------------------------------------------------
Vue Tape Measure
Monday, July 27th, 2009
This little python script for Vue finds the distance between two selected objects. To use it simply select to objects and run the script. A message will be displayed showing the distance between them in Vue’s own units.
Download: VueTapeMeasure (2k Zip Archive)
Python Code
#******************************************************
# Find the distance between two objects
#
# - centrefinder.py
# - Finds the Distance between two objects
# - By Mark Caldwell
# - Version 0.1
# - 3rd July 2007
# - Copyright Mark Caldwell 2007
# - Tested with Vue 6 Infinite
#
# How to use in 3 easy steps
#
# 1. Download this file onto your computer
#
# 2. Select 2 Objects
#
# 3. Then run script and wait for it to work
# To run it go to Python -> Run Python Script
# Then locate the file on your computer
#
#******************************************************
from math import sqrt
countobj=CountSelectedObjects()
if countobj>1:
object=GetSelectedObjectByIndex(0)
pos1=object.Position()
object2=GetSelectedObjectByIndex(1)
pos2=object2.Position()
x=pos2[0]-pos1[0]
y=pos2[1]-pos1[1]
z=pos2[2]-pos1[2]
d=sqrt(x*x+y*y+z*z)
Message ("Distance: "+str(d),"VueTapeMeasure")
#----------------------------------------------
# End of Script
#----------------------------------------------Colour Fixing
Saturday, July 25th, 2009
Just a little bit of tweaking of the impworks site colours so they achieve WAI – WCAG AAA accessibility. Testing using the hand and nicely designed Check My Colours. Everything was pretty much there except there were some dark blue on light blues where the blues were too similar.
Open the Door
Wednesday, July 22nd, 2009
How players’ characters approach a simple doors in a setting says a lot about a role playing game. A cautious door approach can indicate a game with high character mortality or it may simply, as in the case of D&D and its many subsequent editions, reveal that every door opened is likely to result in a new encounter. At the opposite extreme in high action low lethality games doors may be simply kicked down, blown up or smashed through.
On another level doors can also let us know quite a lot about a game system. Does a door have statistics for how strong it is, how much armour it has or how easy it is to pick the lock. Do doors have a price tag? This usually means that characters can get rich enough to comission buildings or that the game designer who made the equipment lists is either a quantity surveyor or needs medical help. Finally how many dice rolls will a party make to get through a door?
Here are a few (humerous) illustrations, if I’ve missed your favorite game feel free to e-mail me your suggestions. A version of this list first appeared in Valkyrie but over the years a few more games and settings have been added. The odd game which isn’t an RPG has crept in too (it’s my list so neh if you don’t like that!)
- D&D (Original 1st Edition)
- Thief uses hear noise to listen at door, finds traps, removes trap from door, open lock and walks through the door.
- Call of Cthulu
- Open the door, see greater being lose 1d100 San.
- Tunnels and Trolls
- I roll my bucket of dice the door rolls its bucket of dice.
- Munchkin
- Open the treasure, kill the door, steal the monster.
- AD&D
- Thief uses hear noise to listen at door. Barbarian (Unearthed Arcana) smashes door down in frustration
- Role Master
- Check breaking down doors critical table.
- Shadow Run
- Street Samurai blow the door away with a GPMG. Decker walks up and politely asks the door to open.
Racoon Shaman walks up to door and asks spirit to open the door. Troll ignores door as inconsequential to its worldview and carries on through it. - Vampire
- Agonise over the door. Explore the political, sensual and aesthetic properties of the door.
- Champions/Hero
- How many points is the door built with?
- Munchkin Fu
- Open the treasure, kill the door, steal the monster.
- Star Trek: The Next Generation (Unicorn Games)
- If the door doesn’t open with a “woosh-woosh” call the Tellarite Engineer by striking your nipple and talking to the air. When they arrive they will open it using an Engineering Systems (Intellect) Environmental Systems test.
- OG The Role Playing Game of Prehistoric Free-Style Role Playing Game System
- “You Me Small Rock Bang Tree Thing”.
- Traveller
- Short lived character blown out of airlock door during character generation shock.
- Legend of the Five Rings
- Challenge the door to an Ijitsu duel. Raise. Raise. Raise. Pass. Then kill it with a single well-placed blow.
- Kobolds Ate My Baby
- Kobold hits door with other kobold until door (or kobold) breaks.
- Spycraft
- Defeat undefeatable biometric lock with false finger prints lifted from evil corporate executives/renegade CIA/terrorists stupidly expensive bottle of imported, designer, micro-brewery beer stolen by a beautiful, double agent working undercover for the CIA/FBI/DEA/MI5/DSS within the organisation of the evil corporate executives/renegade CIA/terrorists who has a cover job at a bank and a couple of friends who havn’t a clue.
- Warhammer Fantasy Roleplay
- Kick the door down with gritty British style.
- Star Trek
- If the door doesn’t open with a “woosh-woosh” either apply a judicious use of a Scottish accent or break out the phaser rifles and blow it away.
- AD&D 2nd Edition
- Thief (Treasure Seeker Kit) uses hear noise to listen at door. Half Ogre (Book of Humanoids) Fighter (Hairy Barbarian Kit – Fighters Handbook) smashes door down with Axe +5 door smasher while wearing girdle of Storm Giant Strength.
- Star Trek: Deep Space Nine
- Curse Cardassian’s persuade a Ferengi to get the parts in return for trade right in another quadrant. When they don’t deliver on time because of an incident involving a shape shifter and a plasma conduit get the Klingon to force it open.
- Twilight 2000
- Not much of an issue because 1) there has been a nuclear war 2) all the doors have all been used to make shelters following the instructions in Protect and Survive.
- Two-Fisted Tales
- Kick door down, draw pistols, roll through both guns blazing, stand up, get knocked unconious by bad guy hiding behind the door.
- D&D 3rd Edition
- Thief uses only a d20 to open the door not needing any of those other dice that earlier editions were made so complicated by.
- OG The Role Playing Game of Prehistoric Free-Style Role Playing Game System
- “You Me Small Rock Bang Tree Thing”.
- Elite
- Begin your new life as Commander Jameson stocks up on Food and Minerals at Lave. Jump to a nearby system. Fight a Krait rendered lovingly in innovative vector graphics. Locate the Coriolis station and approach it. Fly near to the station towards the planet (monitoring altitude carefully). About face so your ship is orientated towards the entrance. Approach at DEAD SLOW SPEED (original manual’s emphasis not mine). Manually control the Cobra’s roll to match the rotation of the Coriolis station. The entry port must be as nearly horizontal as possible. Scrape the sides of the aperture. Lose defensive shields and cargo. Suffer a horrible death as your body is exposed to space. Work har to raise the credits to buy an automatic docking computer so you never have to manually dock again.
- GURPS: Doors
- Steve Jackson Games could never get that desperate. Could they?
- Dark Conspiracy
- Drive through the sprawl to the demonground in ’50s cool, retro styled car. Strut from car to door in an outfit straight out of a Meat Loaf / Bonnie Tyler video accessorised with pistol, assault rifle, grappling hook and flash light. Argue with GM when you claim your character has Darkling Empathy. Persuade him you do. Sense nothing on other side of the door. Kick down the door. Find a massive swarm of Michael Jackson style zombies waiting to eat your brains. Make note on the character sheet of the now dead character to back down if the GM catches you cheating with your next character.
- Deadlands
- Shoot the lock with a six-shooter then swagger in.
- Toon
- Remove one extra large ACE rubber hammer from pocket and apply to door until it falls down.
- Cyberpunk
- The fixer obtains a really hot deck, the netrunner takes three hours of play to do the run to get past all the black IC and unlock the door. The cybered up solo fights their way to the door and opens it. The Corporate walks cautiously out of their private rest room and pays everyone.
- Trail of Cthulhu
- Open door. Wonder why you ever played that other Cthulhu game. See greater being. Lose Mind.
- Pantheon
- And on the thirtieth day Buzz Saw the god of carpentry and other handicraft invented the door thus putting an end to the reign of terror brought upon the mortals by the goddess of drafts Swanway. Challenge!
- Feng Shui
- Character use all their chi in a devastating Storm of the Tiger bare handed strike and watch the door disintegrate into splinters.
- James Bond 007 RPG
- Pick lock. Draw Walther PPK. Open Door. Trip over white cat coming the other way through the door. Get captured by Evil Genius’ henchmen set on world domination. Get taken to Evil Geniu’s secret base. Face certain, slow death in Evil Genius’ secret agent (slow) killing device. Escape when Evil Geniu’s back is turned. Stop Evil Geniu’s not so genius evil plan. Escape from soon to be destroyed base. Get the girl/boy.
- Lost Souls
- Walk through the door without opening it but only three times a day.
- Dr Who
- What else is a sonic screw driver for?
- Millennium’s End
- Set the shaped charge plastic explosive strip round the door. Retire to a safe distance. Detonate it and watch it fall quietly inwards.
- Extreme Vengeance
- Set Plastic Explosive charges on the door. Retire a short distance. Set off the charges then stride into the room like a manly man.
- Hong Kong Action Theatre
- Set Plastic Explosive charge on the door. Retire a short run up away. Run at the door, set off the charges and ride the blast wave into the room full of mooks as a grade A stunt.
- Sengoku
- Kneel before the door and wait patiently for someone to ask you in.
- Conspiracy X
- Opening the door was the easy part. Covering up what you find on the other side will take all your guile, skill, ingenuity and just a few resource points of used up gear.
- The Babylon Project
- This joke awaiting approval by JMS.
- d20 Modern
- Agonise over best door opening method between magic, psionics, lock picking, a lump of C4 or good old brute force. Then do it just the same as in regular d20.
- Star Wars
- Use the Force. If that fails use a Thermal Detonator.
- Babylon 5
- Ko’Dath demonstrates airlock accidents are not just a problem for Traveller characters. The only real question is did G’Kar give her a little push?
- 7th Sea
- Doors are for the boring. Use a crossbow to fire a grapple to the roof and swing in through the stain glass window. Gain one Drama Dice.
- Bushido
- Kneel before door and commit seppuku embarrassing the door into opening.
- SLA Industries
- The Wraith Sniper covers the door from 1000m while the Ebon uses Sense to feel what is on the other side of the door. The media package Brain Waster films the Frother (aka Barbarian in a skirt on drugs) charge in hyped up on UV and Kick Start who tears into it with a flick scythe. The finance package human tries to balance the profit from the film footage with the charge for the damage to the door including bullet tax and form fees.
- Wraith
- What’s my character’s motivation to bother with the door?
- Paranoia
- What colour is the door handle?
- Mage
- Entropy mage twiddles a stick near a door. The door unlocks itself and swings open.
- Stargate SG 1
- Combat engineer complains at not being allowed to open door with explosives on a sneaky, sneaky mission. Takes door off hinges using powered screw driver instead.
- Marvel Universe
- Check you have enough counters to open the door while feeling remarkably reasured that this is a newer, better, different type of game from those other roleplaying games. It says so in the book. Which explains why it vanished when it wasn’t a big hit.
- Changeling
- Wander up to door. Smile sweetly. Walk through.
- Lord of the Rings
- Oh Please we are just so much a better class of fantasy RPG than to lower ourselves to that kind of door opening scene. I mean we might win an Oscar* and we are consistently voted the greatest book ever. Oh alright then – the Fellowship find a blank bit of cliff by a nasty looking pool. Big G waves his hand and a secret door and some secret elf-letters are revealed but it remains closed. Everyone wonders what “speak, friend and enter” means. Big G doesn’t know. Everyone gets dismayed. Wolves howl in the distance. A couple of pages and some howling wolves later Big G solves it. The door opens. Happy now?
- Werewolf
- Kick the vampires out of the way, walk through the wraiths, treat the changeling with pure disdain snarl at the mage until they get the message break down the door.
- All Flesh Must Be Eaten
- Whats the point? We know there will be zombies on the other side!
- Buffy the Vampire Slayer
- Agonise over teenage troubles and the pressure of responsibility then open the door and kick
some demonic vampire backside while looking cool and without breaking a nail. - World of Warcraft
- Millions of paying players, a lock picking skill and an engineering profession but only twenty doors in the whole universe. We’re finding it hard to work out what they are.
* We went on to win 11 of them (more than Star Wars got) not that we were counting.
Vue Python for Beginners
Friday, June 19th, 2009
What is Python?
Python is the industry standard, cross-platform, object-oriented application scripting language. It is both sufficiently easy to use and powerful to let you develop complex scripts and expand the capabilities of Vue 8.5 Infinite.
Or so says the Vue manual, in an explanation that is as clear as mud (at least if you’re not an experienced software engineer).
Python is a computer programming language that lets people write things called scripts. It’s not the only programming language; there are lot of others such as C, C++, Perl and Visual Basic. Scripts are computer programs, little pieces of software that your computer can run.
E-on software included a version of Python in Vue 4 Pro, Vue 5 Infinite, Vue 6 Infinite, Vue 7 Infinite, Vue 7 xStream, Vue 7.5 Infinite, Vue 7.5 xStream, Vue 8 Infinite, Vue 8 xStream, Vue 8.5 Infinite and Vue 8.5 xStream which is why we are interested in it. Vue 7 Pioneer, Vue 7 Esprit, Vue 7 Pro Studio, Vue 7 Complete, Vue 8 Pioneer, Vue 8 Frontier, Vue 8 Esprit and Vue 8 Studio can also run third party Python scripts from Cornucopia3D but not from elsewhere. Their version of Python includes extra features that let a programmer make Vue do things. A script may do something simple, like adding stones to make a circle, or something complex, such as changing the textures of lots of objects at once.
The Translated Man
Sunday, April 5th, 2009
Finished reading The Translated Man by Chris Braak yesterday. Since I’m being regularly e-mailed by a web site who’ve taken to including my posts tagged reviews are included in their review listings where the reviews are in turn reviewed I’m going to do a bit of a Corbett first. While I may tag this as a review it is in fact more of a loose collection of ideas and opinion strung together without any proper, formal review process being undertaken. Nothing that follows is rigorous or properly thought about and in fact its just my opinion in the end. If it were a review (like the ones I wrote for Valkyrie a long time ago) I’d put a lot more effort in even though I know that in the end it is just my opinion and is fairly meaningless after all that.
But to get back to my (not) review…
The Translated Man is a novel available from Lulu running just short of 240 pages in length laid out at a size that means two pages comfortably print to a side of A4. That was a good thing as I was enjoying it so much that I printed the whole of it out so I could read it away from my computer. Thats a first for an ebook I’ve bought of this length. It was a real page turner so I had to have pages to turn.
The story is an atmospheric police procedural tale that could be said to be steam punk or perhaps victorian fantasy in genre. Its set, mostly, in a city. A city where everything, including the architecture, has been shaped by various power struggles between wealthy families. A city which is struggling under the burden of war and with racial tension waiting to boil over.
The main characters work for one of a number of police organisations in the city, the Coroners. Their specific area is hunting down criminals who comitt heresy including such acts as reanimating the dead. Their colourful staff include a hard bitten detective a the young, foppish junior detective, a clairaudient and the only reanimate ever declared not to be a heresy. All the characters are interesting. Even when at first glance they might have been detective genre or fantasy standards are more than two dimensional cliches.
The story itself has an excellent plot which twists and turns from its in medias res opening to its dramatic finale. It cuts back and forth amongst the investigators. Even though the setting is fantasy it holds together logically and provides enough information to allow the reader to leap to the right (or wrong) conclusions as the events unfold.
It isn’t a perfect work. A bit more proof reading would have picked up the handful of places where typos slip through, robe for rope at a dramatic moment springs to mind because it distracted me at a crucial moment in the plot. A few sections where none of the view point characters are present are described in a slightly awkward tell rather than show kind of way. After a fair amount of thought I wonder if might have been avoided by adding a character of a lowly gendarme from a competing police force who could easily have been on the scene at a couple of points in the story and who could have acted as our eyes. Early on in the story there is also a two page info dump about the city’s architecture which I can’t think of an easy way round. While later in the story dates are given for historical events early on years relative to the main detectives time are give. Not a huge problem but as a reader of detective stories it pulled me out of the story as I started to try and look for clues hidden by the slightly awkward writing when there were none.
Those however are my only criticims of the story. I can’t go into a lot of what I enjoyed about it without risking spoiling the story. I did have a small laugh when the characters attend The Bone-Collector’s Daughter given Kim wrote The Bone Magician’s Daughter. As I said already – a real page turner. All in all very good.
Terrain CSV
Friday, March 27th, 2009
Here are two scripts that allow you to work with a terrain by exporting it as a CSV file that can be edited in a spreadsheet and then importing it back into Vue.
Select a terrain and then run terraintocsv.py. A file called terraindata.csv will be saved in the directory you put the script in.
Edit the CSV file in your prefered spreadsheet or text editor. Save a CSV file over the original terraindata.csv
Go back to Vue. With the original terrain selected run the csvtoterrain.py and the altered CSV file will be loaded and used to set the terrains altitudes.
Terrain to CSV / CSV to Terrain 0.1 (4k Zip Archive)
Python Code – Save Terrain
#******************************************************
# Generate a CSV file from a Terrain
#
# - terraintocsv.py
# - By Mark Caldwell
# - Version 0.1
# - 29th August 2006
# - Tested with Vue 5 Infinite 5.10 and Vue 6 Pre Release
#
# How to use in 4 easy steps
#
# 1. Download this file onto your computer
#
# 2. Edit file to set where the file will be saved
#
# 3. Select a Terrain Object
#
# 4. Then run script and wait for it to work
# To run it go to Python -> Run Python Script
# Then locate the file on your computer
#
#******************************************************
#----------------------------------------------
# Configuration: Set these to alter end result
#----------------------------------------------
file='terraindata.csv' # Full Path to where you want the CSV data saved
#--------------------------------------------------------------------------
# Test the user has a scene loaded
#--------------------------------------------------------------------------
if TestLoaded():
#--------------------------------------------------------------------------
# Test the user has 1 object selected and it is a terrain
#--------------------------------------------------------------------------
numselected=CountSelectedObjects()
if numselected>1:
message="Please select only one object."
elif numselected<1:
message="Please select an object."
else:
#--------------------------------------------------------------------------
# Read the terrain and generate a CSV file from it
#--------------------------------------------------------------------------
bObject=GetSelectedObjectByIndex(0) # Get first selected object
if bObject.IsTerrain()==False:
message="Please select a terrain."
elif bObject.IsLocked(): # Check object isn't locked
message="Please select an object that isn't locked."
else:
TerrainObj=bObject.ToTerrain() # Get Terrain Object
height= TerrainObj.Height() # Get Terrain Objects Height
width= TerrainObj.Width() # Get Terrain Objects Width
altitudes=TerrainObj.TerrainAltitudes () # Get the Terrain Objects Altitude Array
output=open (file,'w')
for i in range (0,height):
line=""
for j in range (0,width):
line=line+str(altitudes[i][j])
if j<(width-1):
line=line+','
output.write(line)
output.write('\n')
output.close()
message="Terrain to CSV Successful"
else:
message="No Scene Loaded"
Message(message) # Display message
#--------------------------------------------------------------------------
# End of Script
#--------------------------------------------------------------------------
Python Code – Load Terrain
#******************************************************
# Generate a CSV file from an ecosystem
#
# - terraintoeco.py
# - By Mark Caldwell
# - Version 0.1
# - 29th August 2006
# - Tested with Vue 5 Infinite 5.10 and Vue 6 Pre Release
#
# How to use in 4 easy steps
#
# 1. Download this file onto your computer
#
# 2. Edit the configuration variable file to set where the file was saved
#
# 3. Select an object with a populated EcoSystem applied
#
# 4. Then run script and wait for it to work
# To run it go to Python -> Run Python Script
# Then locate the file on your computer
#
#******************************************************
#----------------------------------------------
# Configuration: Set these to alter end result
#----------------------------------------------
file='terraindata.csv' # Full Path to where you saved the CSV file
#--------------------------------------------------------------------------
# Test the user has a scene loaded
#--------------------------------------------------------------------------
if TestLoaded():
#--------------------------------------------------------------------------
# Test the user has 1 object and that it is a terrain
#--------------------------------------------------------------------------
numselected=CountSelectedObjects()
if numselected>1:
message="Please select only one object."
elif numselected<1:
message="Please select an object."
else:
bObject=GetSelectedObjectByIndex(0) # Get first selected object
if bObject.IsTerrain()==False:
message="Please select a terrain."
elif bObject.IsLocked(): # Check object isn't locked
message="Please select an object that isn't locked."
else:
#--------------------------------------------------------------------------
# Apply terrain data to terrain
#--------------------------------------------------------------------------
altitudes=[]
TerrainObj=bObject.ToTerrain()
file=open(file,'r')
while 1:
line = file.readline()
if not(line):
break
bits=line.split(',')
alt=[]
for x in bits:
alt.append(float(x))
altitudes.append(alt)
TerrainObj.SetTerrainAltitudes (altitudes) # Set terrain heights
message="CSV to Eco Successful"
else:
message="No Scene Loaded"
Refresh()
Message(message) # Display message
#--------------------------------------------------------------------------
# End of Script
#--------------------------------------------------------------------------
Random Walk
Friday, March 27th, 2009
Select some objects, run this script and they wander around randomly in your scene.
Random Walk 0.1 (2k Zip Archive)
Python Code
#******************************************************
# Add a random walk animation to selected objects
# - random_walk.py
# - Give Selected Objects a simple random
# animation
# - By Mark Caldwell
# - Version 0.1
# - 30th April 2006
# - Tested with Vue 5 Infinite 5.10 and Vue 6 Infinite Pre Release
#
# How to use in 4 easy steps
#
# 1. Download this file onto your computer
#
# 2. Edit the configuration variables below
#
# 3. Select Objects to be Replace in Vue Infinite
#
# 4. Then run script and wait for it to work
# To run it go to Python -> Run Python Script
# Then locate the file on your computer
#
#******************************************************
def RandomWalk (objprop,i,accxmin,accxmax,accymin,accymax,acczmin,acczmax):
vx=random.uniform(accxmin,accxmax)
vy=random.uniform(accymin,accymax)
vz=random.uniform(acczmin,acczmax)
vel=[vx,vy,vz]
objprop=UpdateObj (objprop,i,vel)
return objprop
def UpdateObj (objprop,i,vel):
objprop[i][0]=objprop[i][0]+vel[0]
objprop[i][1]=objprop[i][1]+vel[1]
objprop[i][2]=objprop[i][2]+vel[2]
return objprop
import random
#----------------------------------------------
# Configuration: Set these to alter end result
#----------------------------------------------
# Frames to generate
start=0 # First frame of animation
stop=101 # Last frame of animation if step divides into stop add 1 to get a frame on last step
step=10 # Number of frames between key frames
# Starting Velocity of objects
velsxmin=-1 # Starting Minimum Velocity in the x direction
velsxmax=1 # Starting Maximum Velocity in the x direction
velsymin=-1 # Starting Maximum Velocity in the y direction
velsymax=1 # Starting Maximum Velocity in the y direction
velszmin=-1 # Starting Maximum Velocity in the z direction
velszmax=1 # Starting Maximum Velocity in the z direction
# Random Walk accelerations applied at a key frame
accxmin=-20 # Minimum Acceleration the x direction
accxmax=20 # Maximum Acceleration the x direction
accymin=-20 # Minimum Acceleration the y direction
accymax=20 # Maximum Acceleration the y direction
acczmin=-20 # Minimum Acceleration the z direction
acczmax=20 # Maximum Acceleration the z direction
#----------------------------------------------
# Internal Variables Set Up: Don't alter these
#----------------------------------------------
obj=[]
objprop=[]
ran = random.Random()
countobj=CountSelectedObjects()
#----------------------------------------------
# Find Selected Objects
#----------------------------------------------
for i in range(0,countobj):
object=GetSelectedObjectByIndex(i)
obj.append(object)
vx=random.uniform(velsxmin,velsxmax)
vy=random.uniform(velsymin,velsymax)
vz=random.uniform(velszmin,velszmax)
v=[vx,vy,vz]
objprop.append(v)
#----------------------------------------------
# Add Plants
#----------------------------------------------
for j in range(start+step,stop,step):
SetCurrentFrame (j)
for i in range(0,countobj):
object=obj[i]
objprop=RandomWalk (objprop,i,accxmin,accxmax,accymin,accymax,acczmin,acczmax)
object.Move(objprop[i][0],objprop[i][1],objprop[i][2])



