主要内容

地形可视化

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

作为地形数据来源,已使用南旧金山DEM模型。场景中包含一个简单的预先创建的Boeing®747®型号,以显示从一瞬间从多个来源创建虚拟场景的技术。

此示例需要映射工具箱。

阅读DEM数据

%GUNZIP South San Francisco DEM文件到临时目录filenames = gunzip('sl3d_sanfranciscos.dem.gz',Tempdir);demfilename = filenames {1};%读取1:24,000 dem文件%标准化缺失值到南部deminfo = georasterinfo(demfilename);z =标准引出(ReadgeOraster(Demfilename),Deminfo.missingDataindicator);%删除临时枪支文件删除(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,'vrterain');

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

%创建一个vrterrain的孩子newshape = vrnode(terrain_node,'孩子们''terrain_shape''形状');%为形状创建外观字段newappear = vrnode(newshape,'外貌''terrain_appearance''外貌');%为外观创建材料字段newmat = vrnode(newappear,'材料''terrain_material''材料');%分配了材料字段的属性newmat.ambientIntensite = 0.25;newmat.diffusecolor = [0.9 0.6 0.6];Newmat.shininess = 0.078125;newmat.pecularcolor = [0.0955906 0.0955906 0.0955906];%为形状创建几何字段newegrid = vrnode(newshape,'几何学''dem_egrid''EXPITIONGRID');%分配几何字段的属性 - 使用DEM数据newegrid.creaseangle = 3.14;newegrid.xdimension = xdim;newegrid.zdimension = zdim;newegrid.xspacing = xspace;newegrid.zspacing = zspace;newegrid.height = demdata;nemegrid.ccw ='真的';%此设置将使地形表面从两侧可见newegrid.solid ='错误的';

创造地形纹理

用于着色地形纹理,我们将使用映射工具箱中提供的DEMCMAP功能。

%地形高程用于彩色图像CMAP = DEMCMAP(Z,256);%创建当前目录的纹理子目录%输出参数仅用于避免当目录时的警告消息% 已经存在[〜,〜] = mkdir('质地');%缩放高度值以使用完整的Colormap范围%缩放依赖于该地形从零高度开始的事实zscaled = z。*(大小(cmap,1)-1)./ max(z(:));%将纹理保存到纹理子目录中的PNG图像中%旋转左侧的图像匹配X3D模型中所需的图像方向Zscaled的%元素表示CMAP的指数IMWRITE(ROT90(ZSCALED),CMAP,'纹理/ sanfrancisco_elev.png');

将纹理分配给vrterrain外观字段

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

newtexture = vrnode(newappear,'质地''terrain_texture''imagetexture');newtexture.url =.'纹理/ sanfrancisco_elev.png';

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

内联模型位于SL3DDEMOS目录中。

由于文件使用相对路径输入文件,因此必须将它们复制到新创建的场景文件存在的同一目录中。

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

%将b747.x3d从/ sl3ddemos复制到当前目录pt = fileparts(哪个('vrterrain_simple.m'));Copyfile(FullFile(PT,'b747.x3d'),PWD,'F');

将飞机添加到虚拟场景

%创建一个名为“波音”的新变换节点平面= vrnode(MyWorld,'波音''转变');plane_inline = vrnode(平面,'孩子们''boeing_inline''排队');%在/ sl3ddemos目录中准备了一个简单的波音模型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米处

Plane.Ranslation = [Xpeak Ypeak + 200 Zpeak];%将飞机的大小缩放到20倍,使其%在虚拟场景中可见,而无需任何额外的缩放plane.scale = [20 20 20];

将坐标系三合会添加到虚拟场景

它有时有助于临时包括在场景中的三合一可以帮助添加到场景的对象的方向。简单地创建了TrIAD作为Triad ExternProto的实例,它位于“vrterrain_sanfrancisco.x3d”文件中。

TRIAD的%由3行(1米长)组成,从一个顶点运行沿x,y和z方向的百分比。这些线条彩色如下:%+ x  - 红色%+ y  - 绿色%+ z  - 蓝色如果TRIAD包含在场景顶部的场景中%层次结构,它表示全局场景坐标。%如果包含为变换节点的子项,则它表示本地场景中该节点的%坐标系(方向)。%在层次结构的顶级添加三合会到场景triad = vrnode(myWorld,'triad1''triad');%缩放三合会的大小,以便它是可见的虚拟场景中的%没有任何额外的缩放triad.scale = [xdim * xspace / 8 min(xdim * xspace / 8,zdim * zspace / 8)zdim * zspace / 8];%将三合会定位在波音747的中心triad.position = [xpeak ypeak + 200 zpeak];

更改模板文件WorldInfo信息

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

myworld.world_info.title ='B747飞越旧金山地区';

将创建的世界保存到新的WLL文件

保存(MyWorld,'vrterrain_sanfrancisco.x3d');

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

关闭(MyWorld);删除(MyWorld);

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

有几个替代方法如何打开虚拟场景文件:

%这是如何在外部查看器中打开X3D文件:%vriveve('terrain.x3d','-web');%这是如何在内部查看器中打开X3D文件:%VRVIEW('terrain.x3d','-internal');%这是如何在默认查看器中打开X3D文件:createdworld = vRView('vrterrain_sanfrancisco.x3d');%设置抗锯齿,以平滑地形纹理myfig = get(createdworld,'图');set(myfig,'抗锯齿''在');

清理

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

新创建的虚拟场景左侧打开,以便您可以探索它。

%清除所有使用的变量清除terrain_node.Z.ZScaled.CMAP.createdworld.Demfilename.demdata.前任文件名......ID拉特lon混乱myfig我的世界新插图新聚宝......纽卡新兴newtexture.纳米飞机plane_inline.Pt.三合一......veXDIM.Xmax.Xpeak.Xspace.ypeak.ZDIMZmax.Zpeak.Zspace.