西昌.何雨锋
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,可见物理中几乎是不耗什么贞的,只要你的显卡能支持。