可匹配于任意骨骼模型的刚体与关节编辑系统

2017-10-23 06:25
福建质量管理 2017年17期
关键词:布娃娃刚体朝向

(苏州大学计算机科学与技术学院 江苏 苏州 215000)

可匹配于任意骨骼模型的刚体与关节编辑系统

徐大伟

(苏州大学计算机科学与技术学院江苏苏州215000)

一、背景技术

使用physX物理引擎模拟布娃娃效果时,需要使用Nvidia公司作为3D Max插件的布娃娃刚体与关节的编辑器。该编辑器生成的文件含有冗余数据,其生成的刚体间的关节数据格式与我们Flexi引擎的格式不兼容,也不利于与我们的Flexi引擎及相关工具的集成。

二、内容及优点

本方法提供一种高效的流畅的集成于图形引擎的编辑布娃娃刚体与关节的工具。通过直接使用physX库提供的API生成、编辑和保存布娃娃的刚体与关节数据,并与图形引擎有效集成,更符合图形引擎用户的使用习惯。并增加了根据当前游戏角色的骨骼与蒙皮信息,自动生成相应的刚体与关节,做到一键从无到有生成布娃娃对象,可以迅速看到角色的模拟效果。在生成布娃娃所需要的刚体与关节后,可根据当前场景中骨骼动画模型中的各骨骼数据自动修正关节所需要的旋转角度,从而解决关节数据难以编辑与调整的问题,提调高用户的工作效率。并结合了数据驱动与直观的所见既所得的两种布娃娃编辑方式。

三、附图说明

图1

四、具体实施方式

1.通过physX API实现相应版本的刚体与关节数据的保存与加载功能;刚体是对现实物体的抽象,它具有现实物体的绝大多数物理属性,如:质量、滚动时的滚动摩擦力、滑动时的滑动摩擦力及碰撞时反弹的性质,但不同于现实的物体属性,它在碰撞时,不会发生变形,这在现实中的物体是不存在的。关节是描述两个刚体间相互作用的一种约束,它对自己所关联的两个刚体的相对运动起约束作用,就像门与门框间的铰链使门仅能相对于铰链作旋转运动。

2.通过代码编写把physX库集成到图形引擎中,完成在加载模型时,加载对应的布娃娃的刚体与关节数据;

3.因为游戏角色的基础骨骼数与骨骼名及对应的关节是固定的,如任何一个人物或怪物都有头、四肢,所有可以预先配置好其具体的刚体与关节列表,角色模型加载时,根据该列表自动生成基本的刚体与关节。

4.刚体的大小与位置是根据角色的动作文件每一个骨骼的矩阵及不同骨骼矩阵间的关系计算出来:

[1]遍历每一个骨骼影响到的蒙皮顶点集合;根据该集合计算出包围合的大小,包围合足够大时,或者其子骨骼足够大时,才生成对应的骨骼刚体。

[2]为生成的刚体填充碰撞信息:

<1>计算碰撞单元的朝向信息;遍历骨骼子节点位置朝向数据,当前遍历到的子节点的位置距原点的向量,为当前要计算的骨骼的Z轴方向向量。

<2>当前骨骼的X,Y轴据随机算法,随机确定;

5.本发明包含另一种算法是直接根据蒙皮顶点集合生成指定大小的刚体:

<1>累加所有顶点的向量再求其平均值U

<2>记录骨骼的每一个顶点距该平均值U的差值(xi,yi,zi),i=0…N-1;

<3>生成协方差矩阵:

(∑(xi*xi))/N (∑(xi*yi))/N (∑(xi*zi))/N

(∑(yi*xi))/N (∑(yi*yi))/N (∑(yi*zi))/N

(∑(zi*xi))/N (∑(zi*yi))/N (∑(zi*zi))/N

<4>计算该协方差矩阵的特征向量,该向量为本刚体朝向的Z轴向量(计算方法为PowerIteration):

[1]取Z轴方向的单位向量vectorZ(0,0,1),且长度length=VectorZ.length( );

[2]进行最多32次的迭代;

[3]每次迭代执行vectorZ=covarianceMatrix*vectorZ/length

[4]返回最终的单位化的vectorZ.

<5>在Z轴向量的基础,随机建立正交的X,Y轴向量从而构成刚体的朝向向量,根据该三个正交向量初步建立本刚体变换矩阵;

<6>据本骨骼所有影响的蒙皮顶点位置的集合,统计出包围盒位置与大小(适时进行相应的空间变换)。

<7>统计出的包围盒位置数据添加到刚体的变换矩阵中。

<8>得到了包围盒的大小,刚体的变换矩阵,就可以生成出指定形状类型的匹配于原始模型的刚体。

6.布娃娃编辑器有两部分组成:第一部分是控制与参数面板,第二部分是在场景中布娃娃效果在角色模型上的表现。

7.编辑布娃娃时,可以在控制与参数面板中直接输入刚体或关节的参数数值,点击更新按纽后,可以在第二部分中看到布娃娃的编辑效果。

8.也可以在场景中,即布娃娃编辑器的第二部分,直接拖动刚体的位置、所处的空间朝向,来实时编辑刚体的相关属性;

9.关节的自动修正功能实现,角色模型的骨骼数据是在美术建模时就确定了。但当前所编辑的关节所连接的两个刚体间相对朝向,多数都不能使用当初美术建模时定下的数据。这类骨骼数据不符合当前关节所表达的两刚体的相互朝向(或相对旋转)。这两刚体存在着相对旋转角度的偏差。通过计算这种偏差,并把其记录到刚体的矩阵中,从而实现关节所关联的两刚体间旋转角度的修正。

10.具体的两刚体间旋转角度的修正过程:

<1>取两刚体处于符合原角色模型要求下的世界矩阵;

<2>从世界矩阵中取出两刚体的世界空间下的位置;

<3>A刚体的位置为两刚体间中间位置;计算出的位置放入A刚体的局部矩阵中。A刚体的矩阵再转到世界空间下;<4>B刚体的矩阵计算过程与A刚体相同;

<5>所得到的两刚体矩阵传给physX生成关节的API从而生成出修正后的关节。

<6>公式概括为:

[1]transformA.position=(positionA+positionB)/2;

[2]transformA.quaternion=inverseTransformA.quaternion*localTransformA.quaternion;

[3]transformB.position=(positionA+positionB)/2;

[4]transformB.quaternion=inverseTransformB.quaternion*localTransformB.quaternion;

11.另一种修正关节角度的方法(根据关节编辑的方式,适时选择一种关节旋转角度算法):

transformA=inverseCenterOfMassA*inverseTransformA*transformB*centerOfMassB;

transformB=Identity(单位阵);

得到的transformA、transformB给physX API使用即可。

12.增加通过鼠标拾取场景中布娃娃功能。鼠标可以选中布娃娃的任意刚体,并驱动整个布娃娃的运动。即把人捡起来,抛向空中,可以观察到近乎真实的模型的运动、碰撞、反弹的过程。

13.优化拾取过程的算法:

<1>记录选中刚体时,计算该刚体距当前摄像机的距离;

<2>在鼠标拖动过程中的RayTrace计算时,使用上一步中得到的距离作为被拖动刚体距离摄像机的距离从解决因二维的屏幕鼠标坐标转换到三维游戏空间时,Z轴坐标不确定而导致的被拾取物体在拖动过程中时而近,时而远的问题;算法如图1所示:

[1]Distance=A-C;

[2]B=C+D*Distance;

[1]http://en.wikipedia.org/wiki/Power_iteration

徐大伟(1988.03-),男,汉,江苏盱眙县,研究方向计算机及应用。

猜你喜欢
布娃娃刚体朝向
朝向马头的方向
朝向马头的方向
差值法巧求刚体转动惯量
乌龟快跑
布娃娃
车载冷发射系统多刚体动力学快速仿真研究
刚体定点转动的瞬轴、极面动态演示教具
布娃娃脏了
朝向坐标
地震作用下承台刚体假定的适用性分析