diff options
Diffstat (limited to 'release/scripts/scripttemplate_camera_object.py')
-rw-r--r-- | release/scripts/scripttemplate_camera_object.py | 104 |
1 files changed, 104 insertions, 0 deletions
diff --git a/release/scripts/scripttemplate_camera_object.py b/release/scripts/scripttemplate_camera_object.py new file mode 100644 index 00000000000..cacc35ed1a5 --- /dev/null +++ b/release/scripts/scripttemplate_camera_object.py @@ -0,0 +1,104 @@ +#!BPY +""" +Name: 'Camera/Object Example' +Blender: 245 +Group: 'ScriptTemplate' +Tooltip: 'Script template for setting the camera direction' +""" + +from Blender import Window +import bpy + +script_data = \ +'''#!BPY +""" +Name: 'My Camera script' +Blender: 245 +Group: 'Object' +Tooltip: 'Rotate the camera to center on the active object' +""" + +import Blender +from Blender import Window, Scene, Draw, Mathutils + +# Rotate the camera in such a way that it centers on the currently active object +def RotCamToOb(cam, ob): + + # Get the camera matrix + camMat = cam.getMatrix('worldspace'); + + # Get the location of the camera and object and make sure they're vectors + camLoc = Mathutils.Vector(cam.loc) + obLoc = Mathutils.Vector(ob.loc) + + # Get the vector (direction) from the camera to the object + newVec = obLoc - camLoc + + # Make a quaternion that points the camera along the vector + newQuat = newVec.toTrackQuat('-z', 'y') + + # Convert the new quaternion to a rotation matrix (and resize it to 4x4 so it matches the other matrices) + rotMat = newQuat.toMatrix().resize4x4() + + # Make a matrix with only the current location of the camera + transMat = Mathutils.TranslationMatrix(camMat.translationPart()); + + # Multiply the rotation and translation matrixes to make 1 matrix with all data + newMat = rotMat * transMat + + # Now we make this matrix the camera matrix and voila done! + cam.setMatrix(newMat) + +#Make sure blender and the objects are in the right state and start doing stuff +def SceneCheck(): + + # Show a neat waitcursor whilst the script runs + Window.WaitCursor(1) + + # If we are in edit mode, go out of edit mode and store the status in a var + emode = int(Window.EditMode()) + if emode: Window.EditMode(0) + + # Get the scene, the camera and the currently active object + scn = Scene.GetCurrent() + cam = scn.getCurrentCamera() + ob = scn.getActiveObject() + + # Lets do some checks to make sure we have everything + # And if we don't then call a return which stops the entire script + if not cam: + Draw.PupMenu('Error, no active camera, aborting.') + return + + if not ob: + Draw.PupMenu('Error, no active object, aborting.') + return + + if cam == ob: + Draw.PupMenu('Error, select an object other than the camera, aborting.') + return + + # Start the main function of the script if we didn't encounter any errors + RotCamToOb(cam, ob) + + # Update the scene + scn.update() + + # Redraw the 3d view so we can instantly see what was changed + Window.Redraw(Window.Types.VIEW3D) + + # If we were in edit mode when the script started, go back into edit mode + if emode: Window.EditMode(1) + + # Remove the waitcursor + Window.WaitCursor(0) + +# Start the script +SceneCheck() + +''' + +new_text = bpy.data.texts.new('camobject_template.py') +new_text.write(script_data) +bpy.data.texts.active = new_text +Window.RedrawAll() |