主要内容

地形可视化

此示例说明了将通常可用的数字高程模型转换为X3D格式以用于虚拟现实场景的可能性。

作为地形数据的来源,采用了南旧金山DEM模型。一个简单的预先创建的波音®747®模型包括在场景中,以显示创建虚拟场景的技术,从多个来源的飞行。

这个例子需要Mapping Toolbox。

读取DEM数据

% gunzip南旧金山DEM文件到一个临时目录文件名= gunzip (“sl3d_sanfranciscos.dem.gz”,tempdir);demFilename=文件名{1};%读取1:24 000 DEM文件%将缺少的值标准化为NaNdeminfo = georasterinfo (demFilename);Z = standzemissing (readgeoraster(demFilename), deminfo. missingdatindicator);%删除临时压缩文件删除(demFilename);

数据准备

操纵数据,为创建虚拟世界做准备

demdata=Z;[xdim,zdim]=size(demdata);xspace=30;x维度以米为单位缩放百分比zspace = 30;%z尺寸的换算单位(米)%将数据重塑为一维数组demdata = demdata (:);

从模板创建一个虚拟世界

打开模板myworld = vrworld (“vr_template_terrain.x3d”);打开虚拟世界开放(myworld);%创建一个节点VRTerrain的句柄,该节点将包含DEM数据地形节点=vrnode(myworld,“VRTerrain”);

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

%创建地形形状的子对象newShape = vrnode (Terrain_node,“孩子”“Terrain_Shape”“形状”);为形状创建外观字段新出现=vrnode(新形状,“外观”“Terrain_Appearance”“外观”);为外观创建材质字段newMat = vrnode (newAppear,“材料”“地形材料”“材料”);为材质字段分配属性newMat。ambientIntensity = 0.25;newMat。diffuseccolor = [0.9 0.6 0.6];newMat。亮度= 0.078125;newMat。speccolor = [0.0955906 0.0955906 0.0955906];%为形状创建几何体字段newEGrid = vrnode (newShape,“几何学”“DEM_EGrid”“升降网格”);%为几何域分配属性-使用DEM数据newEGrid.creaseAngle=3.14;newEGrid.xDimension=xdim;newEGrid.zDimension=zdim;newEGrid.xspace=xspace;newEGrid.zspace=zspace;newEGrid.height=demdata;newEGrid.ccw=“真的”这个设置将使地形表面从两边都可见newEGrid。固体=“假”

创建地形纹理

对于地形纹理的着色,我们将使用“贴图工具箱”中提供的DEMCMAP函数。

%地形高程用于为图像着色cmap=demcmap(Z,256);%创建当前目录的纹理子目录%输出参数仅用于在目录%已经存在[~,~]=mkdir(“纹理”);%缩放高度值以使用完整的颜色贴图范围%缩放依赖于此地形从零高度开始的事实Zscaled=Z.*(大小(cmap,1)-1)。/max(Z(:);%在纹理子目录中将纹理保存为PNG图像%向左旋转图像以匹配X3D模型中所需的图像方向Zscaled中的%元素表示cmap中的索引imwrite(rot90(Zscaled)、cmap、,“纹理/ sanfrancisco_elev.png”);

将纹理指定给“地形外观”字段

纹理图像文件是由上面的代码创建的,这里它包含在X3D场景中,作为地形外观节点的纹理字段:

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

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

内联模型位于sl3ddemos目录中。

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

如果将地形模型复制到其他位置,请不要忘记同时复制这些文件以及要在“纹理”子目录中找到的纹理文件。

%本架飞机。X3d从/sl3ddemos到当前目录pt = fileparts ((“vrterrain_simple.m”));复制文件(完整文件),“b747.x3d”pwd),“f”);

将飞机添加到虚拟场景中

%创建一个名为“Boeing”的新变换节点平面=vrnode(myworld,“波音”“转变”);平面_inline=vrnode(平面,“孩子”“Boeing_Inline”“内联”);在/sl3ddemos目录中准备了一个简单的Boeing模型plane_inline.url =“b747.x3d”

确定地形数据中的最高峰

ypeak=max(Z(:);[xmax,zmax]=find(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”文件中。

%三元组由从一个顶点开始的3条线(1米长)组成%沿x、y和z方向。线条的颜色如下:% +x -红色% +y -绿色%+z-蓝色%如果这个三元组被包含在场景的顶层%层次,它表示全局场景坐标。%如果它作为变换节点的子节点包含,则表示局部%场景中该节点的坐标系(方向)。%将三元组添加到场景的层次结构的顶层三和弦= vrnode (myworld,“Triad1”“三位一体”);%缩放空间坐标轴的大小,使其可见%在虚拟场景中,无需进行任何额外的缩放triad.scale=[xdim*xspace/8分钟(xdim*xspace/8,zdim*zspace/8)zdim*zspace/8];将三角放置在波音747的中心三元组位置=[xpeak ypeak+200 zpeak];

更改模板文件WorldInfo信息

改变场景的标题以反映我们所做的改变

myworld.World\u Info.title=“B747飞越旧金山地区”

保存创建的世界到一个新的WRL文件

拯救(我的世界),“Vrratrain_sanfrancisco.x3d”);

关闭并删除用于创建场景的虚拟世界

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

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

有几个选择如何打开虚拟场景文件:

%这是如何在外部查看器中打开X3D文件:%vrview('terrain.x3d','-web');%这是如何在内部查看器中打开X3D文件:% vrview(“地形。x3d”、“内部”);%以下是如何在默认查看器中打开X3D文件:createdworld = vrview (“Vrratrain_sanfrancisco.x3d”);设置反锯齿以平滑地形纹理myfig=get(createdworld,“数字”);设置(myfig,“抗锯齿”“上”);

清理

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

新创建的虚拟场景是开放的,以便您可以探索它。

清除所有已使用的变量清楚的地形节点ZZscaled提出创建世界demFilename德姆达塔前女友文件名...id拉特混乱myfigmyworldnewAppear纽格里德...newMatnewShape新织物纳米好啊飞机平面线pt三人一组...已经xdim最大值xpeakxspaceypeak兹迪姆zmaxzpeakzspace