从WM2到Terrain

西昌.何雨锋

步骤:

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物体》中的做法为标准。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值