主要内容

地形可视化

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

作为地形数据的来源,南旧金山DEM模型已经被使用。一个简单的预先创建的波音®747®模型被包含在场景中,展示了从多个源上即时创建虚拟场景的技术。

此示例需要映射工具箱。

读取DEM数据

%GunZip旧金山南部DEM文件到临时目录filenames=gunzip(“sl3d_sanfranciscos.dem.gz”, tempdir);demFilename ={1}文件名;%读取1:24000 DEM文件将缺失值标准化到NaNdeminfo=georasterinfo(demFilename);Z=standarizemissing(readgeoraster(demFilename),deminfo.MissingDataIndicator);%删除临时gunzip文件删除(demFilename);

数据准备

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

demdata = Z;[xdim, zdim] = size(demdata); / /数据大小xspace = 30;%以米为单位缩放x尺寸zspace=30;%缩放米为z维%将数据重新格式化为一维数组demdata=demdata(:);

从模板创建虚拟世界

%带出模板myworld=vrworld(“vr_模板_地形.x3d”);%打开虚拟世界打开(myworld);%创建节点VRTerrain的控制柄,该节点将包含DEM数据Terrain_node = vrnode (myworld,“虚拟地形”);

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

创建一个VRTerrain - shape的子对象newShape=vrnode(地形节点,“儿童”,“地形形状”,“形状”);%为形状创建外观字段newAppear = vrnode (newShape,“外观”,“地形外观”,“外观”);%为外观创建材质字段newMat=vrnode(新出现,“材料”,“Terrain_Material”,“材料”);%为“材质”字段指定属性newMat.ambientIntensity=0.25;newMat.diffuseColor=[0.9 0.6 0.6];newMat.shininess=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 =“真正的”;%此设置将使地形曲面从两侧可见纽格里德固体=“假”;

创建地形纹理

为了给地形纹理着色,我们将使用Mapping Toolbox中的DEMCMAP函数。

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

将纹理分配给VRTerrain外观字段

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

newTexture=vrnode(新出现,“纹理”,“Terrain_texture”,“图像纹理”);newTexture。url =“纹理/sanfrancisco_elev.png”;

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

内联模型在sl3ddemo目录中。

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

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

%将b747.x3d从/sl3ddemos复制到当前目录pt=fileparts(其中(“Vru_simple.m”));拷贝文件(fullfile (pt,“b747.x3d”),pwd,“f”);

将飞机添加到虚拟场景中

创建一个新的Transform节点,称为“Boeing”平面=vrnode(myworld,“波音”,“转换”);plane_inline = vrnode(飞机,“儿童”,“波音在线”,“内联”);%波音公司的一个简单模型在/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米的地方

plane.translation=[xpeak ypeak+200 zpeak];把这架飞机的尺寸按原来的20倍放大,这样就可以把飞机的尺寸缩小到原来的20倍%在虚拟场景中是可见的,不需要任何额外的缩放平面比例=[20];

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

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

%三角形由3条线(1米长)从一个顶点开始沿着x, y, z方向。这些线的颜色如下:%+x-红色%+y-绿色% +z -蓝色%%如果空间坐标轴包含在场景的顶级场景中%层次结构,它表示全局场景坐标。%如果它作为转换节点的子节点包含,则表示本地场景中那个节点的坐标系统(方向)。%将空间坐标轴添加到层次顶层的场景中triad=vrnode(myworld,“Triad1”,“三合会”);%缩放三位一体的大小,使其可见%在虚拟场景中,没有任何额外的缩放三合会。规模= [xdim*xspace/8 min(xdim*xspace/8, zdim*zspace/8)];%将三元组放置在波音747的中心三合会。位置= [xpeak ypeak + 200 zpeak];

修改模板文件WorldInfo信息

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

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

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

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

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

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

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

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

%以下是如何在外部查看器中打开X3D文件:% vrview(“地形。x3d”、“网”);%以下是如何在内部查看器中打开X3D文件:%vrview('terrain.x3d','-internal');%这是如何在默认查看器中打开X3D文件:createdworld=vrview(“vrterrain_sanfrancisco.x3d”);%启用“抗锯齿”以平滑地形纹理myfig =得到(createdworld,“数据”);集(myfig,抗锯齿的,“开”);

清理

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

新创建的虚拟场景保持打开状态,以便您可以对其进行探索。

%清除所有使用的变量清晰的Terrain_nodeZZscaledcmap创建世界demFilenamedemdata前任文件名...身份证件纬度混乱密菲我的世界新出现纽格里德...纽马特新闻形态newTexture纳米好吧飞机plane_inlinept三合会...vexdimxmaxxpeakxspace伊佩克zdim求最大值zpeakzspace