Pano2VR - Flash API
From GardenGnomeSoftware
To embed the pano, please use the following code:
Contents |
[edit] Loading the Panorama
[edit] Actionscript 2.0
var vr:MovieClip = _root.createEmptyMovieClip("vr", 1); vr._lockroot=true; // move the upper left corner vr._x=100; vr._y=200; var myLoader = new MovieClipLoader(); var myListener = new Object(); myListener.onLoadStart = function () { // Set the dimensions and position of the pano vr.window_width=500; vr.window_height=380; vr.window_x=100; vr.window_y=10; }; myListener.onLoadInit = function () { // your initalisation of the pano, add Hotspots,... // You can also set the window size here but you need to use the API vr.pano.setWindowSize(500,380); }; myLoader.addListener(myListener); myLoader.loadClip("mypanorama.swf", vr);
I never managed to use loadMovie properly, so if you really want to use it you are on your own. The demo at http://gardengnomesoftware.com/samples/pano2qtvr/flashtour/ includes the .fla file with the complete source code.
[edit] Actionscript 3.0
import flash.display.*; import flash.net.URLRequest; import flash.events.Event; var loader:Loader; loader = new Loader(); var url:String = "park.swf"; var urlReq:URLRequest = new URLRequest(url); var vr:MovieClip; // This is done after the swf is loaded. function finished_loading (e:Event) { } function initHandler(event:Event):void { trace("initHandler: " + event); vr = MovieClip(loader.content); // cast 'DisplayObject' to 'MovieClip' vr.pano.setWindowSize(200,100); } // Tell the loader to call 'finished_loading' after the swf is loaded. loader.contentLoaderInfo.addEventListener(flash.events.Event.COMPLETE, finished_loading); loader.contentLoaderInfo.addEventListener(Event.INIT, initHandler); loader.load(urlReq); addChild(loader); // add your swf directly to the stage
If you like to remove the panorama use the following code:
vr.pano.cleanup(); removeChild(vr);
You need to call the cleanup method to avoid errors like "Cannot access a property or method of a null object reference" because ActionScript doesn't provide a destructor for objects.
[edit] Panorama API calls
After the panorama is initialized and loaded you can make the following API calls at runtime
[edit] Changing the view
<panoclip>.pano.getPan(); // returns the current pan angle <panoclip>.pano.setPan(angle_in_degrees:Number); // sets the current pan angle <panoclip>.pano.changePan(offset_in_degrees:Number); // change the current pan angle <panoclip>.pano.getTilt(); // returns the current tilt angle <panoclip>.pano.setTilt(angle_in_degrees:Number); // sets the current tilt angle <panoclip>.pano.changeTilt(offset_in_degrees:Number); // change the current tilt angle <panoclip>.pano.getFov(); // sets the current FoV <panoclip>.pano.setFov(angle_in_degrees:Number); // sets the current FoV <panoclip>.pano.changeFov(offset_in_degrees:Number); // change the current FoV <panoclip>.pano.moveTo(pan:Number, tilt:Number, fov:Number, speed:Number ); // move to position
[edit] Changing the panorama window
<panoclip>.pano.setWindowSize(<width>,<height>); - sets the current panorama window size <panoclip>.pano.setWindowPos(<x>,<y>); - sets the panorama window position
[edit] Hotspots
<panoclip>.pano.addHotspot(<id:String>,<pan:Number>,<tilt:Number>,<mc:MovieClip>); - Adds a Hotspot to the panorama
- <id> - This is just a string. No use for it now but maybe in the future.
- <pan>,<tilt> - define the position within the panorama.
- <mc> - this can be anything you created in the library or code.
Basically only the _x and _y are moved by the pano so the depth of your movieclip defines for example the visibility. Also you can let the movieclip do what ever you want for example open a URL, change the color on mouse over.... animations will always run with the speed of the pano so don't expect wonders. On a normal PC this would result in 10-20 fps.
<panoclip>.pano.unloadHotspots(); // Remove references for all Hotspots
[edit] Video
If you like to play panoramic videos you can directly access the video object. The variables are:
<panoclip>.pano.video.connection // NetConnection object <panoclip>.pano.video.stream // NetStream object <panoclip>.pano.video.video // Video object
You can also bind a video at runtime with
<panoclip>.attachVideo(videoXML:String);
The videoXML has to be the same form as for the HTML based binding.
Example:
vr.attachVideo('<video url="video.flv"/>');
[edit] Others
Some other API calls for special cases
<panoclip>.pano.setAutorotate(<speed:Number>,<delay:Number>,<return to horizon:Number>,<only in focus:Boolean>); <panoclip>.pano.setLocked(<value:Boolean>); // Allow interaction with the panorama (mouse/keyboard) <panoclip>.pano.setMeshDensity(<angular speed:Number>); // change the quality for the current speed (in scripted movement)
[edit] Change the default Hotspot handler
For panoramas with QuickTime like hotspots the following code allows to use your own handler.
[edit] Actionscript 2.0
var vr:MovieClip = _root.createEmptyMovieClip("vr", 1); vr._lockroot=true; var myLoader = new MovieClipLoader(); var myListener = new Object(); myListener.onLoadInit = function () { // callback after the pano is fully loaded vr.pano.onClickQtHotspot=function(id:Number,title:String,url:String,target:String) { // add your code here! trace(id + "," + title); } }; myLoader.addListener(myListener); myLoader.loadClip("mypanorama.swf", vr);
[edit] Actionscript 3.0
import flash.display.*; import flash.net.URLRequest; import flash.events.Event; var loader:Loader; loader = new Loader(); var url:String = "park.swf"; var urlReq:URLRequest = new URLRequest(url); var vr:MovieClip; // This is done after the swf is loaded. function finished_loading (e:Event) { vr.pano.onClickQtHotspot=function(id:Number,title:String,url:String,target:String) { // add your code here! trace(id + "," + title); } } function initHandler(event:Event):void { trace("initHandler"); vr = MovieClip(loader.content); // cast 'DisplayObject' to 'MovieClip' } // Tell the loader to call 'finished_loading' after the swf is loaded. loader.contentLoaderInfo.addEventListener(flash.events.Event.COMPLETE, finished_loading); loader.contentLoaderInfo.addEventListener(Event.INIT, initHandler); loader.load(urlReq); addChild(loader); // add your swf directly to the stage
Since Pano2VR beta 3 there are also 2 new handles onRollOverQtHotspot and onRollOutQtHotspot that can be assigned in the finished_loading callback function:
vr.pano.onRollOverQtHotspot=function(id:Number,title:String,url:String,target:String) { trace("QtRollOver " + id + "," + title); } vr.pano.onRollOutQtHotspot=function(id:Number,title:String,url:String,target:String) { trace("QtRollOut " + id + "," + title); }
