西昌.何雨锋
步骤:
1、在WM2中建立一个陆地,导出为obj。
WM2中建立一个mesh output节点。然后从Terrace中导出mesh和高度图,高度图负责在图形引擎中进行陆地的建立,而mesh则可以导入到3DSMAX中作为物体渲染。
当然有人会问,为什么不用高度图在物理中进行物理陆地的建立呢?当然也可以,但是精度很难控制,特别是在放大了多倍之后,物理陆地将变成卡斯特地形。
2、将导出的obj文件导入到max中。
需要注意以下几点:
a.没必要导入材质,因为物理引擎根本就不会在图形中渲染,所以没必要导这个。
b.作为单个网格导入且允许重新划分三角形
c.单位和比例导入比例应该自己输入而不要用系统自带的那些比例,比如要生成一个512x512的地形,则填写512倍.
d.必须选中翻转xz轴,否则导入max的地形将会是水平的,再导到物理中时就变垂直了,但没有要中心轴,怕到了物理里时以陆地的中间为00点.(结果物理陆地的00点位置在角上而没在中间,同TV同)
e.导入的地形是竖着的,没必要去将它旋转90度平放,否则转换出的hkt在运行时仍然会是竖着的,没必要到程序里又去给做旋转。相反,在max里将其左右旋转180度,则在物理中被读出时,才能使正面朝上,应在导入max时、导入hct时,导入物理时分别检查地形形状,应当完全相同才对。
f.无论在WM2中地图的宽和高设置得再大,产生的obj文件大小都是19M,面数都是52万个,导入MAX后的尺寸大小不会有任何变化。
3、将mesh导出到hct
将导入的地形mesh给加形状和刚体,形状类型为mesh,重力为0
然后导出到HCT
保存为hkt文件(注意hct的版本不能比sdk还高)
4、在程序中读出hct文件,并以刚体形式加入到场景中。
5、渲染引擎中的高度图
如图所示,在TV渲染中,00点是高度图的左上角,(0,x)在左下角.
实际上与WM2导出的地图上下、左右刚好颠倒,此时,生成的高度地形严格与物理地形匹配。
以生成物理与渲染均为512的地形为例,物理采用直接读取刚体地形,位置偏移:m_terrainBody->setPosition(hkVector4(512,0,0,0));
而TV渲染地形为:
land1->GenerateTerrain("map\\heightmap\\output2.bmp",cTV_PRECISION_LOW,8,8,512,512,true);
land1->SetScale(0.25,0.65,0.25); //注意该放缩值
land1->SetPosition(0,2,0);
此时,渲染地形虽未必同物理地形方向相同,但形状已完全相同,且其中物体(物体坐标及旋转均无需做xz变换)严格遵守地形物理法则。
当然,地形的高度图方向变化之后,其贴图方向也应做相应方向变换,否则渲染出的地形贴图无法与地形匹配。
6、4096地图的建立
一定要注意,前面WM2中的地形最好是512而不是513的,以免渲染地形时产生变形与物理地形不一致。
渲染地图的生成为:
land1->GenerateTerrain("map\\heightmap\\output.bmp",cTV_PRECISION_LOW,8,8,512,512,true);
land1->SetScale(2,5.54,2);
land1->SetPosition(0,-1074,0);
注意高度。
物理地形的位置为:
setPosition(hkVector4(0,-1024,4096,0));
其中物理地形在max中只有旋转,没有移动的。
7、16384地图的建立
注意:setBroadPhaseWorldSize(50000.0f),否则地形过了界就会消失。
地形生成为
land1->GenerateTerrain("map\\heightmap\\output.bmp",cTV_PRECISION_HIGH,8,8,512,512,true); //这里地形变大了,所以要用精度要高
land1->SetScale(8,21.09,8); //这个Y值为物理最高最低点之差/渲染最高最低点之差*原放缩值
land1->SetPosition(0,-4038,0);
物理地形的位置为:
hkVector4(0,-4048,16384,0));
关于mesh物体物理与渲染之大小、零点位置对齐等问题,以《从WM2到mesh物体》中的做法为标准。