www.gusucode.com > sl3ddemos工具箱matlab源码程序 > sl3ddemos/vrterrain_simple.m

    %% Terrain Visualization
% This example illustrates the possibility to convert generally
% available Digital Elevation Models into VRML format for use in virtual 
% reality scenes.
%
% As a source of terrain data, South San Francisco DEM model included in
% the Mapping Toolbox(TM) has been used. A simple pre-created Boeing(R) 747(R) model 
% is included in the scene to show the technique of creating virtual scenes
% from several sources on-the-fly.
%
% This example requires Mapping Toolbox.

% Copyright 1998-2015 HUMUSOFT s.r.o. and The MathWorks, Inc.

%% Reading DEM Data

% gunzip the South San Francisco DEM file to a temporary directory
filenames = gunzip('sanfranciscos.dem.gz', tempdir);
demFilename = filenames{1};

% read every other point of the 1:24,000 DEM file
[~, ~, Z] = usgs24kdem(demFilename, 1);

% delete the temporary gunzipped file
delete(demFilename);

%% Data Preparation 
%
% Manipulation of the data to prepare it for creating virtual world
demdata=Z;
[xdim, zdim] = size(demdata);
xspace = 30; % scaling in meters for x dimension
zspace = 30; % scaling in meters for z dimension
% reshape the data into a one-dimensional array
demdata = demdata(:); 

%% Create a Virtual World from the Template

% bring up template
myworld = vrworld('vr_template_terrain.wrl'); 
% open the virtual world
open(myworld); 
% create a handle to a node VRTerrain, the node that will contain the DEM data
Terrain_node = vrnode(myworld,'VRTerrain'); 

%% Create Terrain Node Fields (Shape, Appearance, Material)

% create a child of VRTerrain - shape
newShape = vrnode(Terrain_node, 'children', 'Terrain_Shape', 'Shape');   
% create appearance field for the shape
newAppear = vrnode(newShape, 'appearance', 'Terrain_Appearance', 'Appearance'); 
% create material field for the appearance
newMat = vrnode(newAppear, 'material', 'Terrain_Material','Material'); 
% assign properties for the material field
newMat.ambientIntensity = 0.25;
newMat.diffuseColor = [0.9 0.6 0.6];
newMat.shininess = 0.078125;
newMat.specularColor = [0.0955906 0.0955906 0.0955906];            
% create geometry field for the shape
newEGrid = vrnode(newShape, 'geometry', 'DEM_EGrid','ElevationGrid');
% assign properties for the geometry field - use DEM data
newEGrid.creaseAngle = 3.14;
newEGrid.xDimension = xdim;
newEGrid.zDimension = zdim;
newEGrid.xSpacing = xspace;
newEGrid.zSpacing = zspace;
newEGrid.height = demdata;
newEGrid.ccw = 'TRUE';
% This setting will make the terrain surface visible from both sides
newEGrid.solid = 'FALSE';

%% Create the Terrain Texture
%
% For coloring the terrain texture we will use the DEMCMAP function 
% available in Mapping Toolbox.

% terrain elevation is used to color the image
cmap = demcmap(Z, 256);

% create texture subdirectory of the current directory
% output arguments used only to avoid warning message when the directory
% already exists
[~, ~] = mkdir('texture');

% scale the height values to use the full colormap range
% scaling relies on the fact that this terrain begins at zero height
Zscaled = Z .* (size(cmap,1)-1) ./ max(Z(:));

% save the texture into PNG image in the texture subdirectory 
% rotate the image left to match image orientation needed in VRML model
% elements of Zscaled represent indices into cmap
imwrite(rot90(Zscaled), cmap, 'texture/sanfrancisco_elev.png'); 

%% Assign Texture to the VRTerrain Appearance Field
%
% Texture image file is created by the code above, here it is included
% in the VRML scene, as a texture field of the terrain Appearance node:

newTexture = vrnode(newAppear, 'texture', 'Terrain_texture','ImageTexture'); 
newTexture.url = 'texture/sanfrancisco_elev.png';

%% Copy Files Inlined in the Created File to the Current Directory
%
% Inlined models are in the sl3ddemos directory.
%
% Because files are inlined using relative path, we must copy them to the 
% same directory where the newly created scene file exists. 
%
% If you copy the terrain model to a different location, don't forget to
% copy also these files, as well as texture file(s) to be found in the
% texture subdirectory.

% copy b747.wrl from /sl3ddemos to the current directory
pt = fileparts(which('vrterrain_simple.m'));
copyfile(fullfile(pt, 'b747.wrl'), pwd, 'f');

%% Add the Airplane to the Virtual Scene

% create a new Transform node, called "Boeing"
plane = vrnode(myworld, 'Boeing', 'Transform');
plane_inline = vrnode(plane, 'children', 'Boeing_Inline', 'Inline');
% a simple model of Boeing is prepared in the /sl3ddemos directory
plane_inline.url='b747.wrl';

%% Determine the Highest Peak in the Terrain Data

ypeak = max(Z(:));
[xmax, zmax] = find(Z==ypeak);
% use the first peak, if more vertices have the same maximum height
% convert matrix indices to meters in x and z directions in VRML
xpeak=xspace*(xmax(1)-1);
zpeak=zspace*(zmax(1)-1);

%% Position the Airplane 200 Meters Above the Peak

plane.translation = [xpeak ypeak+200 zpeak];
% scale the size of the airplane by a factor of 20, so that it
% is visible in the virtual scene without any extra zooming
plane.scale = [20 20 20]; 

%% Add the Coordinate System Triad to the Virtual Scene
%
% It is sometimes useful to temporarily include in the scene a triad
% that can help with the orientation of objects added to the scene.
% Triad is simply created as an instance of Triad EXTERNPROTO which
% is located in "vrterrain_sanfrancisco.wrl" file.

% 
% The triad consists of 3 lines (1 meter long) running from one vertex 
% along the x, y and z directions. The lines are coloured as follows:
% +x - red
% +y - green
% +z - blue
% 
% If the triad is included in the scene at the top level of the scene
% hierarchy, it denotes the global scene coordinates. 
% If it is included as a child of a transform node, it denotes the local
% coordinate system (orientation) of that node in the scene.

% add the triad to the scene at the top level of the hierarchy
triad = vrnode(myworld, 'Triad1', 'Triad');
% scale the size of the triad so that it is visible 
% in the virtual scene without any extra zooming
triad.scale = [xdim*xspace/8 min(xdim*xspace/8, zdim*zspace/8) zdim*zspace/8]; 
% position the triad at the center of Boeing 747
triad.position=[xpeak ypeak+200 zpeak];

%% Change the Template File WorldInfo Information
%
% Change the title of the scene to reflect the changes we made

myworld.World_Info.title = 'B747 Flying over the San Francisco Area';

%% Save the Created World to a New WRL File
%
save(myworld, 'vrterrain_sanfrancisco.wrl');

%% Close and Delete the Virtual World Used to Create the Scene
%
close(myworld);
delete(myworld);

%% Open and View the Virtual World File We Have Just Created
%
% There are several alternatives how to open a virtual scene file:

% This is how to open a VRML file in the external viewer:
% vrview('terrain.wrl', '-web');

% This is how to open a VRML file in the internal viewer:
% vrview('terrain.wrl', '-internal');

% This is how to open the VRML file in the default viewer:
createdworld = vrview('vrterrain_sanfrancisco.wrl');
% Set Antialiasing on to smooth the terrain texture 
myfig = get(createdworld,'Figures');
set(myfig, 'Antialiasing', 'on');

%% Cleanup
%
% This example has created a new virtual model in the working directory. 
%
% The newly created virtual scene is left open so that you can explore it. 

% clear all used variables
clear Terrain_node Z Zscaled cmap createdworld demFilename demdata ex filenames ...
  id lat lon mess myfig myworld newAppear newEGrid ...
  newMat newShape newTexture nm ok plane plane_inline pt triad ...
  ve xdim xmax xpeak xspace ypeak zdim zmax zpeak zspace

displayEndOfDemoMessage(mfilename)