ORBITSP.sml

  Download

More scripts: Advanced

Syntax Highlighing:

comments, key words, predefined symbols, class members & methods, functions & classes
            
######################
#
# ORBITSP.SML
#
# Demonstration of movie generation from 3D display using spiral 
# orbit path. Both 2D and 3D views are copied into each movie frame.
#
# View center is fixed at center of group.  Viewer position is computed
# from size of group.  Two complete orbits are made.  The first starts
# beyond the edge of group and spirals inward and downward; the second
# spirals outward and upward.
#
# Script uses an input DEM for the surface layer, an input raster drape
# layer, and an input vector drape layer.
#
# Requires TNTmips Version 6.5
#
#####################
clear();
#### Set movie format, frame rate, and recording time
# Movie format (Possible values : "MPEG"(All platform) or "AVI"(Windows only) 
string format$;
format$ = "AVI";
# Frame rate 
# Possible values : 
#   "MOVIE_FRAMERATE_23_976"  23.976 (24000/1001) fps - NTSC encapsulated film rate
#   "MOVIE_FRAMERATE_24"		24 fps - Standard international cinema film rate
#   "MOVIE_FRAMERATE_25"   	25 fps - PAL (625/50) video frame rate
#   "MOVIE_FRAMERATE_29_970"  29.97 (30000/1001) fps - NTSC video frame rate
#   "MOVIE_FRAMERATE_30"   	30 fps - NTSC drop-frame (525/60) video frame rate
#   "MOVIE_FRAMERATE_50"   	50 fps - Double frame rate / progressive PAL
#   "MOVIE_FRAMERATE_59_940"  59.94 (60000/1001) fps - Double frame rate NTSC
#   "MOVIE_FRAMERATE_60"   	60 fps - Double frame rate drop-frame NTSC
string framerate$;
framerate$ = "MOVIE_FRAMERATE_24";
# Recording time
numeric time;
time = 60;
###### Get RVC objects to load
raster Surface, RastDrape;
vector VectDrape;
print("Select raster to use for surface");
GetInputRaster(Surface);
print("Select raster to use for first drape layer");
GetInputRaster(RastDrape);
print("Select vector to use for second drape layer");
GetInputVector(VectDrape);
###### RVC style object to draw center point and viewer point
string styleFilename$;
string styleObjectname$;
GetInputObject("Style","Select style object for center and viewer point symbols:", 
	styleFilename$, styleObjectname$);
string viewer$;
viewer$ = "VIEWER";
string center$;
center$ = "CENTER";
######## Create display group with 2d and 3d views
print("START");
# Size of squared 2D view and 3D view
# Should be evenly divisible by 8
numeric size;
size = 400;
# Zoom out factor for 2D view
numeric zoomfactor;
zoomfactor = 1.8;
# Create group
print("Creating Group");
class GRE_GROUP group;
group = GroupCreate();
# Create flags to create view without iconbar, scrollbars, status line and scale/position line
# This is important to maintain fixed window size for movie generation
string flags$;
flags$ = "NoScalePosLine,NoIconBar,NoScrollbars,NoStatusLine";
# Create dialog and 2D view
print("Creating dialog and 2D view");
class XmForm dialog2d;
class GRE_VIEW view2d;
dialog2d = CreateFormDialog("VIEW 2D");
view2d = GroupCreateView(group,dialog2d,"",size,size,flags$);
view2d.BackgroundColor.red = 67;
view2d.BackgroundColor.green = 100;
view2d.BackgroundColor.blue = 100;
# Create dialog and 3D view
print("Creating dialog and 3D view");
class XmForm dialog3d;
class GRE_VIEW3D view3d;
dialog3d = CreateFormDialog("VIEW 3D");
view3d = GroupCreate3DView(group,dialog3d,"",size,size,flags$);
view3d.BackgroundColor.red = 67;
view3d.BackgroundColor.green = 100;
view3d.BackgroundColor.blue = 100;
# Add layers to group
GroupQuickAddRasterVar(group,Surface,1);
GroupQuickAddRasterVar(group,RastDrape,0);
GroupQuickAddVectorVar(group,VectDrape);
# Open both views
DialogOpen(dialog2d);
DialogOpen(dialog3d);
# Full redraw of both views
ViewRedrawFull(view2d);
ViewRedrawFull(view3d);
ViewZoomOut(view2d,zoomfactor,1);
####### Set up parameters for movie frame
# Destination of each view in final frame for movie
numeric x2d, y2d, x3d, y3d, w, h;
x2d = 0;
y2d = 0;
x3d = size;
y3d = 0;
w = 2 * size;
h = size;
# Create text strings for annotation in frame
string frameTitle$;
string frameTitle2$;
frameTitle$ = "Mount St. Helens Flow Hazard Zonation";
frameTitle2$ = "and Survey Station Locations";
# Font size
numeric fontsize;
fontsize = 16;
# Define color for text annotation in frame
class Color black;
black.red = 0;
black.green = 0;
black.blue = 0;
# Creating frame
print("Creating frame for movie");
class Frame frame;
frame = FrameCreate(w,h);
# Create graphics context (GC) for frame
numeric fontsize;
print("Creating GC from frame and activate it");
ActivateGC(FrameCreateGC(frame));
DrawTextSetHeightPixels(fontsize);
DrawUseStyleObject(styleFilename$,styleObjectname$);
######## Set some more movie parameters
# Initiale Movie
print("Initializing Movie");
class Movie movie;
movie = MovieInit();
# Check framerate and force it to "MOVIE_FRAMERATE_24" if it is invalid
numeric rate;
rate = 24;
if (framerate$ == "MOVIE_FRAMERATE_23_976") rate = 23.976;
if (framerate$ == "MOVIE_FRAMERATE_25") rate = 25.0;
if (framerate$ == "MOVIE_FRAMERATE_29_970") rate = 29.970;
if (framerate$ == "MOVIE_FRAMERATE_30") rate = 30.0;
if (framerate$ == "MOVIE_FRAMERATE_50") rate = 50.0; 
if (framerate$ == "MOVIE_FRAMERATE_59_940") rate = 59.940; 
if (framerate$ == "MOVIE_FRAMERATE_60") rate = 60.0;
if (rate == 24.0) framerate$ = "MOVIE_FRAMERATE_24";
# Set Movie Parameters
print("Setting Movie Parameters");
MovieSetFormat(movie,format$);
MovieSetFrameRate(movie,framerate$);
MovieSetFrameWidth(movie,w);
MovieSetFrameHeight(movie,h);
# Make Output File
string ext$;
ext$ = MovieGetFileExt(movie);
string filename$;
filename$ = GetOutputFileName("","Make filename for movie",ext$);
printf("Filename = %s\n",filename$);
# Check recording time
if (time <= 1.0) time = 1.0;
##### Get georeference for surface layer and reset to group projection
class Georef georef;
georef = GetLastUsedGeorefObject(Surface);
GeorefSetProjection(georef,group.Projection);
# Find map coordinates and surface elevation at center of group
# and define as view point (center)
class POINT3D center;
center.x = group.Center.x;
center.y = group.Center.y;
numeric objx;
numeric objy;
MapToObject(georef,center.x,center.y,Surface,objx,objy);
center.z = Surface[objy,objx];
##### Set up viewpoint and viewer position parameters
class VIEWPOINT3D vp;
vp = view3d.ViewPoint;
vp.SetCenter(center);
class POINT3D pt;			# viewer position
class POINT2D point;		# 2D point for location symbols
# Set initial viewer position north of center just beyond group extents
# and 10000 m higher than center point 
pt.x = group.Center.x;
pt.y = group.Extents.y2 + 0.6 * (group.Extents.y2 - group.Center.y);
pt.z = center.z + 10000;
vp.SetViewerPosition(pt);
# Calculate spiral orbit parameters
numeric numFrames = time * rate;
numeric deltaAngle = -360.0 / numFrames * 2;
numeric tx = vp.ViewPos.x - vp.CenterPoint.x;
numeric ty = vp.ViewPos.y - vp.CenterPoint.y;
numeric distance = 4 * sqrt(tx * tx + ty * ty) / 5 / numFrames * 2;
numeric height = (vp.ViewPos.z - vp.CenterPoint.z) / numFrames * 2;
###### Start recording movie to file
MovieStart(movie,filename$);
# Loop for each frame
numeric i, azimuth;
for i = 1 to numFrames {
	SetStatusMessage(sprintf("Processing frame %d of %d",i,numFrames));
	# Rotate viewer position around center with deltaAngle increment
	vp.RotateViewerPosition(deltaAngle);
	if (i <= numFrames / 2) {
	# Move viewer position closer and higher to center point
		azimuth = vp.AzimAngle * 180 / PI; # make it in degrees
		vp.MoveViewerPosition(azimuth,0,distance,"m");
		vp.MoveViewerPosition(0,90,height,"m");
		}
	else {
	# Move viewer position farther and lower from center point
		azimuth = vp.AzimAngle * 180 / PI + 180; # make it in degrees
		vp.MoveViewerPosition(azimuth,0,distance,"m");
		vp.MoveViewerPosition(0,-90,height,"m");
		}
	# ViewRedrawDirect(view3d,"NoBlankScreen");
	# This new function	added after release of TNTmips 6.5
	# can redraw the view without blanking it first.  Use of
	# this function eliminates "flashing" of the view as the
	# movie is initially rendered.  It has no effect on the
	# output movie file.  For 6.5 release version, use the
	# function in the next statement.
	ViewRedraw(view3d);
	# Copy 2d view and 3d view to destination frame
	FrameCopyFromView(frame,view2d,0,0,size,size,x2d,y2d);
	FrameCopyFromView(frame,view3d,0,0,size,size,x3d,y3d);
	# Draw center point in 2d view
	point.x = vp.CenterPoint.x;
	point.y = vp.CenterPoint.y;
	point = TransPoint2D(point,ViewGetTransMapToView(view2d,group.Projection));
	point = TransPoint2D(point,ViewGetTransViewToScreen(view2d));
	DrawSetPointStyle(center$);
	DrawPoint(point.x,point.y);
	# Draw viewer position point in 2d view
	point.x = vp.ViewPos.x;
	point.y = vp.ViewPos.y;
	point = TransPoint2D(point,ViewGetTransMapToView(view2d,group.Projection));
	point = TransPoint2D(point,ViewGetTransViewToScreen(view2d));
	DrawSetPointStyle(viewer$);
	DrawPoint(point.x,point.y);
	# Draw text to top of frame
	DrawTextSetColors(black);
	DrawTextSimple(frameTitle$,5,fontsize);
	DrawTextSimple(frameTitle2$,5,2.2*fontsize);
	# Add frame to movie
	MovieAddFrame(movie,frame);
}											# Emd of main processing loop
# Stop and Exit movie
MovieStop(movie);
MovieExit(movie);
# Close dialogs
DialogClose(dialog2d);
DialogClose(dialog3d);
print("END");