| Description | A script to generate a panoramic AVI video file using the Sapphire 3D renderer. |
|---|---|
| Author | Aaron |
| Created | 2010/05/09 |
| Requires | L3DT 11.07 beta 2 or later |
| Download | SapphirePanoramaAVI.zs |
To use this script, first open Sapphire and move the camera to the vantage point from which you would like the panorama generated. Then, in the Sapphire menu, select the 'Scripts→Run script file' menu option, and select this script file.
//
// Title: Sapphire Panorama AVI script
// Author: Aaron Torpy
// Date: 5 Mar 2009
// URL: http://www.bundysoft.com/wiki/doku.php?id=tutorials:l3dt:panorama
// Updated: 14 Jul 2011
//
hvar pHF
set pHF <GetMap "HF">
float scale
set scale <map.GetHorizScale pHF>
// create settings variables
float ls.PositionX
float ls.PositionY
float ls.Heading
float ls.Altitude
int ls.nFrames
// initialise settings with default values
set ls.PositionX <div <map.GetWidth pHF> 2>
set ls.PositionY <div <map.GetWidth pHF> 2>
set ls.nFrames 360
set ls.Altitude 500
set ls.Heading 0
// get position from Sapphire if open
if <Sapphire.IsShown>
set ls.PositionX <Sapphire.Camera.GetPosX>
set ls.PositionY <Sapphire.Camera.GetPosY>
set ls.Altitude <Sapphire.Camera.GetPosZ>
set ls.Altitude <mul ls.Altitude scale> // convert from reduced units to metres
set ls.Heading <Sapphire.Camera.GetAzim>
set ls.Heading <RadToDeg ls.Heading> // convert to degrees
endif
// ask user for settings
if <not <EditUI &ls "Enter movie settings">>
return false
endif
// ask user for filename
filesel FS
filesel.Init &FS false NULL "AVI movie file (*.avi)|*.avi|" "avi" NULL
if <not <EditUI &FS "Enter output file">>
return false
endif
string FileName
set FileName <filesel.GetPathA &FS>
float alt
set alt <div ls.Altitude scale>
float azim
set azim <DegToRad ls.Heading>
Sapphire.ShowWnd
Sapphire.SetPause true
Sapphire.Camera.SetElev 0
Sapphire.Camera.SetAzim azim
Sapphire.Camera.SetPos3d ls.PositionX ls.PositionY alt
// calculate angle step size
float dtheta
set dtheta <div <DegToRad 360> ls.nFrames>
// prepare progres box
progbox prog
progbox.SetTitle &prog "Recording movie"
progbox.ShowWnd &prog
// prepare some variables for the loop
int k kmax
set k 0
set kmax ls.nFrames
map Frame
// run a few frames to make Sapphire settle
do
Sapphire.RenderFrame 0
while <islt <incr k> 10>
// now run the panorama loop
set k 0
do
// update progress display
progbox.SetProgress &prog k kmax
Sapphire.Camera.SetAzim azim // set camera angle
Sapphire.RenderFrame 0 // render a frame
Sapphire.ScreenCap2 &Frame // capture frame to 'Frame' image
// if first frame, initialise AVI stream
if <iseq k 0>
assert <file.AVI_VFW.OpenStream FileName <map.GetWidth &Frame> <map.GetHeight &Frame> 25 "CVID"> "Error: cannot open file stream"
endif
file.AVI_VFW.AddFrame &Frame // add 'Frame' image to AVI stream
// increment azimuth
set azim <add azim dtheta>
while <islt <incr k> kmax>
// finalise AVI stream
file.AVI_VFW.CloseStream
// finish by setting Sapphire free
if <Sapphire.IsPaused>
Sapphire.SetPause false
endif