西昌.雨锋 本文谢绝转载
部分一:模型及其物理的坐标系统
1、maya中的原图,注意Z轴与X轴的走向.
2、使用物理中间件导出的物理图形,从形状上看,与原图没什么区别,从轴向上看,X与Z轴的方向完全与maya原图中吻合。
上图中,蓝色轴为Z,红轴为X,与maya中完全相同.
3、在程序中读入mesh,并在程序中画出3根轴向
红色为X正向,蓝色为Z轴正向
结果发现:X轴没问题,但Z轴方向反了,说明在maya到mesh的导出过程中,Z轴发生了反向。
换句话说:maya与物理中的Z轴,在mesh中为-Z轴。
解决方法:
1、首先想到的当然是修改导出mesh时的选项,使Z轴变成-Z轴,遗憾的是,在maya的插件导出选项中没能找到这一项。
2、如果修改mesh轴向无望,那么只能修改导出的物理轴向,所以在导出中间件中作了如下修改:
将Z轴作了镜向,那么导出的物理体用程序读出后的刚体轴向是什么样子呢?
蓝色Z轴指向了两面凸起的方向,看来与程序中的mesh的Z轴轴向是吻合了........但是整个刚体好象有点不对啊?
刚体也能法线反转?
好吧,再在maya中用nomals的reverse命令将可怜的模型法线反转,然后Z轴镜像后导出物理。
最后的结果:
虽然看上去整个刚体与mesh似乎方向相反,但仔细看两个Z轴的方向,都是指向双凸起的,看起来很不顺眼啊,不要紧,请在物理浏览器中使用Axis\use left handed system
使用左手系统来观察世界,就是下面这个样子:
哦哦,看起来终于跟程序中的mesh轴向和图象都完全一致了哦。
"物理导出时先将刚体的法线反转,然后Z轴镜像导出,这种方法的坏处是烦琐,好处是可以完全保持mesh的贴图不变。
"这种方法看起来既笨又烦琐,有没有什么办法可以直接将mesh的坐标系统改为跟maya完全一致呢?
这样就无需更改物理及刚体的导出了啊.
所以,第二套方案出来了,
步骤:
1 、物理导出该怎么导还怎么导,但无需要反转法线和镜向。
2、不要在maya中用插件导出mesh文件,而是导出成obj文件。
3、用独立的插件modelconveter导出mesh模型,你可以看到有一个保持坐标轴向的选项,而且不可更改
4、导出的模型完全没有贴图,你得在modelview里重新指定一次贴图,或者在程序中指定贴图。
5、在程序中调入mesh物体,你会发现贴图的左右反了,但形状和轴向与刚体完全一致。
部分二:车辆的坐标系统
已知在maya中制作出了一个比照车辆,车身纹理上已经标出了maya中的坐标轴向
使用部分一中的外插件转换方法将其导成mesh文件,发现除了纹理不对以外,模型与物理方向轴已完全相同了。
在程序中使用车辆组件,底盘的方向定义为:X(0, 1, 0),Y(0, 0, -1),Z(-1, 0, 0));
四个悬挂位置如图所示:
物理底盘及mesh均未作任何旋转,此时车辆的方向为正确的车头跑向,即向-Z轴跑动。
由此我们得出一个结论:maya模型制作时,如果要在程序中不作任何修改而保持车辆方向正确的话 ,车头方向应该指向-X。
综合上面的问题,
1、我们建立出了maya中的车头指向-X方向的2号小车作为渲染车体,车头指向+Z。先用maya中的obj导出插件导出为obj ,再用外部件转换出为mesh。
2、将上方渲染车体作旋转,车头指向-X,然后在maya中用中间件导出成物理车体。
3、在程序中使用这个底盘方向:(0, 1, 0), (0, 0, -1), (-1, 0, 0)
底盘使用这个坐标系统:
此时,物理车辆(使用左手模式观察)与渲染车辆完全吻合正确,奔跑方向也完全正确。
但这种作法有一个问题,即建立出的车辆在实际使用时,虽然可以正常跑动,但无法使用一些实时函数,比如实时计算轮胎位置的函数,因为车辆底盘的坐标方向发生了变化,故函数无法正确计算出来,所以在这时,我们可以用修改导出物理坐标系的方法来完成:
如图,在导出时用custom方法将X与Z轴进行调换:
用这种方法,可以调换各种物理模型的方向,否则无论在maya场景中如何旋转,导出的模型都只会死板的朝向某个方向.
关于物理与渲染模型的大小放缩问题:
1、如果物理与渲染使用的是同样的建模,或者大小一致的模型,那么通过导出成物理模型文件后,物理与渲染模型均不需要做任何比例放缩。
2、如果渲染的物体和物理物体是用命令建立出来的,那么命令建立出来的渲染物体应该放大2倍才能与物理物体匹配。
3、对于物理物体必须正确,而对于渲染物体的方向什么的有问题则不是大问题,直接在maya中旋转修改后重新导出即可。