游戏开发论坛

 找回密码
 立即注册
搜索
楼主: tonykee

资料整理了一番:关于无限LOD地形的构想(原创)

[复制链接]

7

主题

74

帖子

74

积分

注册会员

Rank: 2

积分
74
发表于 2007-5-27 17:05:00 | 显示全部楼层

Re:资料整理了一番:关于无限LOD地形的构想(原创)

这两天利用程序把地图分割了,然后利用程序重新拼接,但是在拼接的时候出现了问题。
我查了几张地图连接的地方,原始点的高度都是一样的,但是在拼接的时候却出现错误。

还有两张图纸间的连接处,由于两张图的lod不是一起做的。所以会出现不协调。

比如,两张图的连接处具有不同的lod时,由于都是出于边界的,所以就不会再进行相关处理,如一方lod低时,对该边界就不会进行处理。

想了一个方法,使用一个高度图来保存当前读入的高度图的所有数据,当然是按照一定排列方式存储,就是说,当前读入的高度图拼接后,形成的就是前面所提到的高度图,然后对这个高度图进行处理。这样一来,边界问题就能够处理了。

不过这样一来,光想就感觉是一种效率比较低的方法,主要是对如何用新的高度图保存读入高度图的问题,每次的有新的高度图读入近来的时候,新高度图的重新排列将会相当麻烦(我只是在脑子里想了一下,就觉得有点难)。痛苦中~~~~~~~~~~~~~~~

119

主题

1367

帖子

1393

积分

金牌会员

Rank: 6Rank: 6

积分
1393
 楼主| 发表于 2007-5-27 17:43:00 | 显示全部楼层

Re:资料整理了一番:关于无限LOD地形的构想(原创)

我写了一个自动拆分Map成为一个个小的tile文件的方法,很easy,美工可以解放出来了

//sourceFile源文件 destFile目标文件前缀(自动加编号) sourceWidth源文件宽,
        //sourceHeight源文件高, splitsize分割尺寸
        static bool SplitTileByRawMap(char *sourceFile, char * destFilePrefix,
                      int sourceWidth, int sourceHeight, int splitsize)
        {
                BYTE *buf = new BYTE[splitsize]; //一次读一行
                ::ZeroMemory(buf, splitsize);
               
                FILE* pFIleDest;

                FILE* pFileSrc;
                pFileSrc=fopen(sourceFile, "rb"); //读取高度数据
               
                if(!pFileSrc){
                        MessageBox(NULL,"读取源图失败","提示",0);
                        return FALSE;
                }

                int row = (sourceHeight - 1) / (splitsize -1);
                int col = (sourceWidth - 1)/ (splitsize -1);



                for(int i = 0; i < row; i ++)
                {

          for(int j = 0; j < col; j++)
                  {
               
                          rewind(pFileSrc); //从头开始读,读取下一个Tile
                          char filename[50];
                          sprintf(filename, "%s_%d_%d.raw", destFilePrefix, i, j);
                          pFIleDest = fopen(filename, "wb");
                       
                          if(!pFIleDest){
                                  MessageBox(NULL,"创建目标图形失败","提示",0);
                                  return FALSE;
                          }

                          long pos = (i * (splitsize-1)) * sourceWidth + (splitsize -1) * j;
              fseek(pFileSrc, pos, 1);
              for(int k = 0; k < splitsize; k ++) //tile内的行计数
                          {
                                  
                                  fread(buf, 1, splitsize, pFileSrc);
                                  //printf("%d\t %d\t %d\t %d\t %d\t %d\t %d\t %d\t %d\t \r\n", buf[0],buf[1],buf[2],buf[3],buf[4],buf[5],buf[6],buf[7],buf[8],buf[9]);
                                  fwrite(buf, 1, splitsize, pFIleDest);
                                  fseek(pFileSrc , sourceWidth - splitsize, 1);
                  
                          }
                         // printf("\r\n");
                          fclose(pFIleDest);
                  }
                }
                fclose(pFileSrc);
                return TRUE;
        }

119

主题

1367

帖子

1393

积分

金牌会员

Rank: 6Rank: 6

积分
1393
 楼主| 发表于 2007-5-27 17:56:00 | 显示全部楼层

Re: 资料整理了一番:关于无限LOD地形的构想(原创)

用上面的程序拆分地图很方便,效果如下
sf_2007527175552.jpg

119

主题

1367

帖子

1393

积分

金牌会员

Rank: 6Rank: 6

积分
1393
 楼主| 发表于 2007-5-27 18:02:00 | 显示全部楼层

Re:资料整理了一番:关于无限LOD地形的构想(原创)

对了tile与tile之间还存在Lod接缝问题,这个问题应该可以解决,我想想看....

119

主题

1367

帖子

1393

积分

金牌会员

Rank: 6Rank: 6

积分
1393
 楼主| 发表于 2007-5-27 18:06:00 | 显示全部楼层

Re:资料整理了一番:关于无限LOD地形的构想(原创)

tile接缝处,关键就是能有一个方法快速找到相邻的Tile里面的Block然后再比较两个block Lod等级是否出现差别再去补缝,会有些复杂,但实现起来应该没多大问题

7

主题

74

帖子

74

积分

注册会员

Rank: 2

积分
74
发表于 2007-5-27 20:50:00 | 显示全部楼层

Re:资料整理了一番:关于无限LOD地形的构想(原创)

还有一个问题.很诡异问题.

我将高度图分割后,一个高度图是宽度0--512,高度0--512,另外一个高度图是宽度512--1024,高度是0--512,
等于这两个高度图应该是紧邻得,然后我将第一个高度图放置在x=00,z=0.0处,然后将第2个 高度图放置在x=512.0,z=0.0.
理论上这两个地形应该是紧挨着得,但是却发现两块地形之间没有紧邻,反而出现了一条很宽得裂痕.
怎么也想不通,郁闷.

119

主题

1367

帖子

1393

积分

金牌会员

Rank: 6Rank: 6

积分
1393
 楼主| 发表于 2007-5-27 20:58:00 | 显示全部楼层

Re:资料整理了一番:关于无限LOD地形的构想(原创)

我想有可能是你的高度图本身拆分的有问题。我发的拆分出来的四个tile的边线是共用的。这一点相当重要,否则肯定出现断裂的情况。

7

主题

74

帖子

74

积分

注册会员

Rank: 2

积分
74
发表于 2007-5-27 21:16:00 | 显示全部楼层

Re:资料整理了一番:关于无限LOD地形的构想(原创)

这点我考虑到得.
一个高度图是宽度0--512,高度0--512,另外一个高度图是宽度512--1024,高度是0--512,
这两个高度图在z轴上是一样得,在x轴上第一个高度图得最右边是512,第二个高度图得最左边是512.

现在我都想根据视点位置直接从高度图读取1024*1024得数据直接显示算了.不过这样一来数据交换就太频繁了.

119

主题

1367

帖子

1393

积分

金牌会员

Rank: 6Rank: 6

积分
1393
 楼主| 发表于 2007-5-27 22:01:00 | 显示全部楼层

Re:资料整理了一番:关于无限LOD地形的构想(原创)

一个象素代表一个顶点的话,高度图的长宽一定是2n+1,也就是1025x1025,我不知道你为什么是1024,0的位置并没有象素啊?我的图形都是2n+1的长宽。

7

主题

74

帖子

74

积分

注册会员

Rank: 2

积分
74
发表于 2007-5-28 22:14:00 | 显示全部楼层

Re:资料整理了一番:关于无限LOD地形的构想(原创)

我的想法太幼稚了。

每次都更新1025*1025的图,太变态了。(上面的帖子手误了)

今天忙活一天了。现在才能松口气了。

裂痕的问题找到了。无语。
尽信书,不如无书。
原来裂痕的造成是由于参照的资料的问题。
我参照focus.on.3D.terrain做的地形。

不过我没有使用四叉数细分得那个(就是书上第6章的方法,要是使用那个方法的话就好了,其实那个方法我也懵懵懂懂,不敢用,后面还要做随即河流,没那么多时间了)。

我是使用第5张的方法,patch处理,结果他的那个方法在某些细节的地方除了点问题,主要是patch数目,以及三角形扇中心点选取。结果,给定一个1025*1025的高度图,其实绘制出来的图形少了一些。而且在点上面也存在着误差,结果使得分割后的地图无法完整拼接。郁闷死了。

不过总算得到点教训,下次一定要仔细,再仔细的,认真,在认真。以防止出现错误。尤其是那些结果能够出来,但是却隐藏问题的错误。


您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-26 06:56

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表