TV陆地与HeightField的转换探讨

西昌.何雨锋

1、步骤1,在WM2中建立出地形,并用height output节点进行导出高度图。

2、在L3DT中导入高度图,注意在WM2中与L3DT中都应该使用512x512的规格(WM2中要加1)

3、依次生成attributes map、Terrain normals、light map最后用Texture map生成真正的Texture map,然后导出Texture map.

4 、TV中用height map生成地形,并贴上texture map导出的贴图。

5、Hvk中用height field系统读取高度图生物理地形。

6、修改TV与HVK中的地形比例,使之达到完全匹配的程度 

7、在TV中SAVE地形数据,并将其与HVK的比例写到存档文件中。

8、在程序运行时候,用HVK的HF系统将高度图的数据读新建物理地形,并将比例调整至存档文件的放缩程度。

 

首先,TV5中的的land1建立过程是:

land1=scene1->CreateLandscape("land1"); 
 land1->LoadTerrainData("map\\heightmap\\3.map");
 land1->SetPosition(0,-1000,0);
 land1->SetScale(1,8,1);
 land1->ExpandTexture(global1->GetTex("map_tex"),0,0,32,32,false);

由于TerrainData是从已存的地图文件中读取的,如果scale设置为1,1,1,则出来的陆地扁平,高度明显不够,只有设置为1,8,1时,才显其巍峨。

这时候land1->getLandWidth()与land1->getLandHeight()的值为32x32。

 

此时,将SetScale改为(2,8,2),则陆地面积变大,高度不变,但得到的getLandWidth等仍为32x32,由此可见,无论放缩如何,getLandHight等都不会有任何变化,只与陆地建立时给的尺寸有关。

下面看看GetLandRealHight()与GetLandReawidth()的值:

当 land1->SetScale(1,4,1)的时候,为8192x8192

当 land1->SetScale(1,4,1)的时候,为16384x16384;

由此可见,当陆地被放缩的时候,GetLandRealHight()等是要发生变化的。

很明显,如果这个Real值放到hvk的HeightField的xRes和yRes中去非死机不可。

但如果以32x32的形式放到HF中去,建立出来的物理陆地肯定小得可怜。

 

我们来看下面的例子:
 land1->GenerateTerrain("map\\heightmap\\output.bmp",cTV_PRECISION_LOW,8,8,512,512,true);
 land1->SetScale(1,4,1);

这里可以看到,Tvland在建立时的比例为1:4:1.

land1->SetPosition(-30,-750,-30);

位置之所以放那么低,这个高度数值也必须自己调整至与物理地形高度相匹配的程度。

 land1->ExpandTexture(global1->GetTex("map_tex"),0,0,8,8,false);
请注意上面的8,8与land1的8,8必须完全相同,否则会出错。

如果不是8,8而是32,32,则地形将会大很多,但整体形状不会发生变化。

 

物理地形上:

hkpSampledHeightFieldBaseCinfo ci;
ci.m_scale.set(0.5*land1->GetLandRealWidth()/xRes,128.0f,0.5*land1->GetLandRealHeight()/zRes);
 高度是128,水平缩放比例=0.5x陆地实际大小/建立物理地形的大小

物理地形位置:

cTV_3DVECTOR vv1;
vv1=land1->GetPosition();        //得到渲染地形的位置,然后物理地形位置的X与Z都不变,y+400
rci.m_position.set(vv1.x,vv1.y+400,vv1.z);

 

这样,渲染地形与物理地形位置总算匹配了,但是两者的高度确实是一点一点试出来的,与高度放缩比例的关系公式也不知道是什么样的,整个地形面积还是显得过小,需要进一步的试验才能得到更大的地形图。

 

 更大的地形图

首先试验了一下在建立地图时地形的变化:

将land1->GenerateTerrain("map\\heightmap\\output.bmp",cTV_PRECISION_LOW,8,8,512,512,true);

改成land1->GenerateTerrain("map\\heightmap\\output.bmp",cTV_PRECISION_LOW,32,32,512,512,true);

渲染地形是变大了,但物理地形.........直接消失了,说明这行不通。

看来只能在放缩上下功夫了。

将 land1->SetScale(1,4,1);

改成 land1->SetScale(2,4,2);

渲染地形变大了4倍,物理地形也变化了,因为物理地形的放缩值是用渲染地形的实际大小套公式算出来的,所以物理地形严格匹配了渲染地形。

 

那么将land1-<SetScale(4,4,4)怎么样呢?

结果物理地形仍然溢出消失了,说明这个不能无限放大的。

 

再来修改一下:

land1->GenerateTerrain("map\\heightmap\\output.bmp",cTV_PRECISION_LOW,16,16,512,512,true);

land1->SetScale(1,4,1);

地形依然变大,物理地形严格匹配。

但在此时如果将land1->SetScale(2,4,2);物理地形将溢出消失。

说明最大物理地图面积=1x16x512 x 1x16x512=8192x8192的大小,此时VDB运行卡贞达30FPS左右,但在TV渲染运行达60FPS,可见物理中几乎是不耗什么贞的,只要你的显卡能支持。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值