matlab如何画地形图,python绘制地形高度图

  matlab如何画地形图,python绘制地形高度图

  在游戏中,我们将使用高度图来模拟现实生活中的山丘和山谷。高度图实际上是一个数组,数组的每个元素指定地形dddjz中一个顶点的高度值。线框模式

  普通地形模式

  在高度图中,通常只为每个元素分配一个字节的存储空间,因此高度可以取区间[0,255]中的值。但在实际应用中,为了匹配3D世界的比例,可能要对高度值进行缩放,很可能超出了上述范围。因此,您可以分配一个整数或浮点数组来存储这些高度值,它可以很好地匹配任何比例。

  高度图有很多种形式,其中一种是最常见的:灰度图。在这张地图中,地形中一个点的海拔越高,地图中对应点的亮度就越大。反之,海拔越低,亮度越暗。

  用灰度图表示的高度图

  制作高度图可以通过纯代码编程实现,但是对代码的要求有点高,不太容易实现;其次,可以使用PhotoShop等绘图软件制作高度图。由于这类软件提供了可视化的交互环境,只要你会美术设计,难度就会降低很多。

  完成后,只需将文件保存为8位原始文件。(RAW文件以字节为单位存储图像中每个像素的灰度值)。

  (1)加载原始文件

  因为原始文件本质上是一个连续的字节存储块。

  STD:vector unsigned char in(m * n);STD:if stream inFile;inFile.open(filename.c_str()、IOs _ base:binary);如果(!inFile)HR(E _ FAIL);inFile.read((char*)in[0],(streamsize)in . size());infile . close();mHeightMap.resize(m,n,0);for(int I=0;我是m;I){ for(int j=0;j n;j){ int k=I * n j;mHeightMap(i,j)=(float)in[k]* height scale height offset;} } filter 3x 3();将RAW文件中的值复制到浮点向量中,然后过滤浮点向量中的值,以便按比例变换高度值,突破0~255的限制。

  地形平面图

  一个地形平面图,其中纵轴是Z轴,横轴是X轴。至于Y轴,可以通过查询加载的海拔高度图的数据结构中的对应项得到。创建地形几何信息,该信息可以通过指定每行和每列中的顶点数和单元间距来定义地形的大小。

  (2)顶点计算

  只需从顶点起点开始,逐行生成每个顶点,保持相邻顶点的行列间距为单位间距,直到顶点终点。

  地形与纹理顶点对应关系

  图中的x轴对应于纹理图中的u轴,而y轴对应于纹理图中的v轴。

  设置:

  u rd=1/横坐标间距;

  Vcoord=1/纵坐标间距;

  然后就可以得到地形中顶点(I,j)对应的纹理坐标(u,v)。

  u=jUcoord

  v=iVcoord

  (3)指数dddjz的顶点的计算

  计算每个顶点的索引,从左上角(0,0)到右下角,依次遍历每个dddjz,计算构成每个dddjz的三角形面片的顶点索引。

  从图中可以看出,对于位置(I,j)的dddjz,有:

  g1wp 1={ ivertsPerRow jivertsPerRow j vertsPerRow j }

  wv1 P1={(I ^ 2)vertsPerRow jivertsPerRow j vertsPerRow j ^ 2 }

  其中vertsPerRow是行距。

  (4)纹理映射

  将纹理图片映射到地形网格上,使其生动具体。

  场景——地址中“行走”

  在局部形状创建完成后,我还想移动摄像机来模拟现实生活中行走的过程。比如走在山脚下和走在山坡上是不一样的,感觉就像颠簸的银河倾斜。

  要模拟这种现象,需要不断调整摄像头的高度,也就是Y坐标。

  平移前

  平移后

  执行平移变换以将顶点起点平移到坐标原点,然后通过比例变换将坐标dddjz的单位区间归一化,缩放因子为单位区间的负倒数。

  float col=floorf(x);

  float row=floorf(z);

  列索引等于x坐标的整数部分,行索引等于z坐标的整数部分。

  其中,floor (t)函数是指求不小于t的最大整数。

  因此可以得到dddjz中四个顶点的高度。

  现在,当摄像机位于任意位置(x,z)时,需要坐标dddjz单位的高度。

  对应的y坐标

  由于dddjz单元可能会向多个方向倾斜,因此为了获得高度,需要确定摄像机当前所在的坐标dddjz。

  让col和row描述当前坐标dddjz左上角顶点的位置,然后平移。

  float dx=x-col;

  float dy=z行;

  如果dz1.0-dx,则当前处于上三角v4v1v2,否则为下三角v4v2v3。

  然后用前面的方法得到该点的高度。

  线性插值也可用于计算。上图中,v1v2作为U轴,v1v4作为V轴,对U轴取微分dx进行线性插值。类似地,差分dy针对V轴进行线性插值。

  那么指定点的高度可以如下获得:

  y=A dxuy dzvy

  其中uy代表Y轴在U轴方向的分量;Vy代表Y轴在V轴方向的分量。

  源代码细节github

  在CSDN下载

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: