主要内容

地形可视化

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

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

此示例需要“映射工具箱”。

读取DEM数据

将南旧金山DEM文件压缩到一个临时目录中文件名= gunzip(“sl3d_sanfranciscos.dem.gz”, tempdir);demFilename =文件名{1};%读取1:24 000 DEM文件将缺失的值标准化为NaNdeminfo = georasterinfo(demFilename);Z =标准化发射(readgeoraster(demFilename), deminfo. missingdatindicator);%删除临时gunzipped文件删除(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”);

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

创建VRTerrain - shape的子对象。newShape = vrnode(Terrain_node,“孩子”“Terrain_Shape”“形状”);%为形状创建外观字段newAppear = vrnode(newShape,“外观”“Terrain_Appearance”“外观”);%为外观创建材质场newMat = vrnode(“材料”“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];为形状创建几何字段newgrid = vrnode(“几何”“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函数。

%的地形高度被用来给图像上色cmap = demcmap(Z, 256);%创建纹理子目录的当前目录% output参数仅用于避免警告消息时的目录%已经存在[~, ~] = mkdir(“纹理”);%缩放高度值以使用完整的色彩图范围缩放依赖于这个地形从零高度开始的事实Zscaled = Z .* (size(cmap,1)-1) ./ max(Z(:));%将纹理保存为PNG图像在纹理子目录中将图像向左旋转以匹配X3D模型中所需的图像方向。% zscaling的元素表示cmap中的索引imwrite (rot90 (Zscaled),提出,“纹理/ sanfrancisco_elev.png”);

分配纹理到VRTerrain外观字段

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

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

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

内联模型在sl3ddemos目录中。

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

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

复制b747。X3d从/sl3ddemos到当前目录Pt = fileparts(“vrterrain_simple.m”));拷贝文件(fullfile (pt,“b747.x3d”pwd),“f”);

将飞机添加到虚拟场景中

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

在地形数据中确定最高点

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

将飞机置于海拔200米以上

飞机。翻译= [xpeak ypeak+200 zpeak];把飞机的尺寸扩大到原来的20倍,这样它就能飞行%在虚拟场景中是可见的,不需要任何额外的缩放飞机。Scale = [20 20 20];

在虚拟场景中添加坐标系三位一体

有时在场景中临时包含一个三元组是有用的,它可以帮助添加到场景中的对象的方向。Triad被简单地创建为Triad EXTERNPROTO的一个实例,它位于“vrterrain_sanfrancisco”中。x3d”文件。

三位一体由从一个顶点出发的3条线(1米长)组成%沿x, y和z方向。这些线的颜色如下:% +x -红色% +y -绿色% +z -蓝色如果三位一体被包含在场景的顶层。%层次结构,它表示全局场景坐标。%如果它被包含为转换节点的子节点,则表示本地场景中该节点的%坐标系(方向)。将三位一体添加到层次结构的顶层场景中。Triad = vrnode(myworld,“Triad1”“三位一体”);缩放三位一体的大小,使其可见。%在虚拟场景中不需要任何额外的缩放三合会。缩放= [xdim*xspace/8 min(xdim*xspace/8, zdim*zspace/8) zdim*zspace/8];将三位一体置于波音747的中心位置。三合会。位置=[xpeak ypeak+200 zpeak];

修改模板文件worlddinfo信息

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

myworld.World_Info。title =“B747飞越旧金山地区”;

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

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

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

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

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

有几种打开虚拟场景文件的方法:

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

清理

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

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

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