主要内容

地形可视化

这个例子说明了可能性一般可用数字高程模型转换成X3D格式在虚拟现实场景中使用。

的地形数据,旧金山南部民主党模型被使用。预先创建一个简单的波音747®®模型是包含在现场展示的技术动态创建虚拟场景从几个来源。

这个例子需要映射的工具箱。

读取DEM数据

% gunzip旧金山南部民主党文件到一个临时目录中文件名= gunzip (“sl3d_sanfranciscos.dem.gz”,tempdir);demFilename ={1}文件名;% 1:24,000民主党文件读取%标准化缺失值NaNdeminfo = georasterinfo (demFilename);Z = standardizeMissing (readgeoraster (demFilename) deminfo.MissingDataIndicator);%删除临时gunzipped文件删除(demFilename);

数据准备

操纵数据的创建虚拟世界做好准备

demdata = Z;[xdim, zdim] =大小(demdata);xspace = 30;%比例在米x维度zspace = 30;%比例米为z维度%重塑为一个一维数组的数据demdata = demdata (:);

从模板创建一个虚拟世界

%打开模板myworld = vrworld (“vr_template_terrain.x3d”);%打开虚拟世界打开(myworld);% VRTerrain创建一个处理一个节点,该节点包含DEM数据Terrain_node = vrnode (myworld,“VRTerrain”);

创建地形节点字段(形状、外观、材料)

% VRTerrain创建一个孩子——形状newShape = vrnode (Terrain_node,“孩子”,“Terrain_Shape”,“形状”);%创建外观字段的形状newAppear = vrnode (newShape,“外观”,“Terrain_Appearance”,“外观”);%为外观创建材料领域newMat = vrnode (newAppear,“材料”,“Terrain_Material”,“材料”);%分配属性材料领域newMat。ambientIntensity = 0.25;newMat。diffuseColor = (0.9 0.6 0.6);newMat。亮度= 0.078125;newMat。specularColor = (0.0955906 0.0955906 0.0955906);%为形状创建几何领域newEGrid = vrnode (newShape,“几何”,“DEM_EGrid”,“ElevationGrid”);%为几何领域分配属性,利用DEM数据newEGrid。creaseAngle = 3.14;newEGrid。xDimension = xdim;newEGrid。zDimension = zdim;newEGrid。xSpacing = xspace;newEGrid。zSpacing = zspace; newEGrid.height = demdata; newEGrid.ccw =“真正的”;%这个设置将使地形表面可见的两边newEGrid。固体=“假”;

创建地形纹理

着色的地形纹理映射中我们将使用DEMCMAP函数可用工具。

%的地形高程用于彩色图像提出= demcmap (Z, 256);%创建纹理的当前目录的子目录%输出参数目录时只用于避免警告消息%已经存在(~。~)= mkdir (“纹理”);%的比例高度值完全使用colormap范围%比例依赖这个地形始于零高度Zscaled = Z。*(大小(提出,1)1)。/ max (Z (:));%保存纹理为PNG图像的纹理子目录%旋转X3D所需的图像左匹配图像定位模型%的元素Zscaled代表指标提出imwrite (rot90 (Zscaled),提出,“纹理/ sanfrancisco_elev.png”);

分配纹理VRTerrain外观

纹理图像文件是由上面的代码中,这是包括在X3D场景,地形纹理的外观节点:

newTexture = vrnode (newAppear,“纹理”,“Terrain_texture”,“ImageTexture”);newTexture。url =“纹理/ sanfrancisco_elev.png”;

复制文件内联在当前目录中创建的文件

内联模型在sl3ddemos目录中。

因为文件是内联使用相对路径,我们必须将其复制到新创建的场景相同目录文件存在。

如果你将地形模型复制到不同的位置,别忘了也复制这些文件,以及纹理文件(s)纹理子目录中找到。

%本架飞机。x3d / sl3ddemos当前目录pt = fileparts ((“vrterrain_simple.m”));拷贝文件(fullfile (pt,“b747.x3d”pwd),“f”);

飞机添加到虚拟场景

%创建一个新的转换节点,称为“波音”飞机= vrnode (myworld,“波音”,“转换”);plane_inline = vrnode(飞机,“孩子”,“Boeing_Inline”,“内联”);%的波音公司准备一个简单的模型/ sl3ddemos目录中plane_inline.url =“b747.x3d”;

确定地形数据的最高峰

ypeak = max (Z (:));[xmax, zmax] =找到(Z = = ypeak);%使用第一高峰,如果更多的顶点有相同的最大高度%转换矩阵指标在X3D米x和z方向xpeak = xspace * (xmax (1) 1);zpeak = zspace * (zmax (1) 1);

飞机200米以上高峰

飞机。翻译= [xpeak ypeak + 200 zpeak];%规模大小的飞机20倍,所以它%是可见的在虚拟场景中没有任何额外的缩放飞机。规模= (20 20 20);

坐标系三元组添加到虚拟场景

有时有用暂时包括在现场的三合会,可以帮助定位对象添加到场景中。三只是创建一个实例的三和弦EXTERNPROTO位于“vrterrain_sanfrancisco。x3d”文件。

%%的三合会由三行(1米长)从一个顶点%沿着x, y, z方向。线条颜色如下:% + x -红色% + y -绿色% + z -蓝色%%如果三合会包括在现场的场景在顶层%的层次结构,它表示全球场景坐标。%如果是包括作为一个孩子的转换节点,它表示当地%这个节点的坐标系统(方向)的场景。%三元组添加到场景在层次结构的顶层三和弦= vrnode (myworld,“Triad1”,“三位一体”);%规模的大小三和弦是可见的%在虚拟场景中没有任何额外的缩放三合会。规模= [xdim * xspace / 8分钟(xdim * xspace / 8, zdim * zspace / 8) zdim * zspace / 8];%三位一体在波音747的中心位置三合会。位置= [xpeak ypeak + 200 zpeak];

修改模板文件WorldInfo信息

改变现场的标题,以反映变化

myworld.World_Info。title =架飞机飞过旧金山地区的;

保存创建的世界新WRL文件

保存(myworld,“vrterrain_sanfrancisco.x3d”);

关闭和删除虚拟世界用来创建场景

关闭(myworld);删除(myworld);

打开并查看文件我们刚刚创建的虚拟世界

有几个备选方案如何打开一个虚拟场景文件:

%这是如何在外部查看器打开一个X3D文件:% vrview(“地形。x3d”、“网”);%这是如何在内部查看器打开一个X3D文件:% vrview(“地形。x3d”、“内部”);%这是如何在默认浏览器打开X3D文件:createdworld = vrview (“vrterrain_sanfrancisco.x3d”);%设置抗锯齿平滑地形纹理myfig =得到(createdworld,“数据”);集(myfig,抗锯齿的,“上”);

清理

这个示例创建了一个新的虚拟模型在工作目录中。

新创建的虚拟场景是敞开,这样您就可以探索它。

%清除所有使用变量清晰的Terrain_nodeZZscaled提出createdworlddemFilenamedemdata前女友文件名id纬度混乱myfigmyworldnewAppearnewEGridnewMatnewShapenewTexture纳米好吧飞机plane_inlinept三合会已经xdimxmaxxpeakxspaceypeakzdimzmaxzpeakzspace