将x文件绑在mdl手上

来源:互联网 发布:有魅力的女人 知乎 编辑:程序博客网 时间:2024/04/19 13:26

---------------------------西昌.何雨锋 将x文件绑在mdl手上

有一个函数是attach,但是实际上不用这个来绑定,因为这是骨骼之间做绑定的。
这里用的是矩阵绑定法,被绑定的物体的位置、动作、大小决定了绑定的东西的这些。
所以连大小设定都没必要了。

***************
首先在h文件中找到d3dvector定义的位置(实际这个结构在DX中是有的,但是由于这些结构都
比较简单,完全没必要再去包括d8d.h文件),所以再参考了VB中的D3DMATRIX结构后,就直接在
vector的定义附近自己写一个D3DMATRIX结构就可以了,结构定义如下:
#ifndef D3DMATRIX_DEFINED
typedef struct D3DMATRIX
{
 float m11;
 float m12;
 float m13;
 float m14;
 float m21;
 float m22;
 float m23;
 float m24;
 float m31;
 float m32;
 float m33;
 float m34;
 float m41;
 float m42;
 float m43;
 float m44;
} D3DMATRIX;

定义好以后,就可以在CPP文件中定义matrix了。

ITVMesh mesh1;                 //用来读取武器
D3DVECTOR vector1;             //用来得到手的位置,这个位置是用不上的,而且也是错误的
D3DMATRIX matrix1;             //用来得到手的矩阵

mesh1=scene1->CreateMeshBuilder("sword");
mesh1->LoadXFile("..//..//..//Media//sword.x",tvtrue,tvtrue);
//注意,这个x文件必须要能在程序中正常显示出来,而且最好是自带纹理的。(即x文件中已指明了纹理位置)
mesh1->SetMaterial(0,-1);   //这好象是默认值。

//在渲染循环中不断得到actor2的某个骨骼矩阵给矩阵变量,然后把这个矩阵设给mesh.
man2->GetBoneMatrix(man2->GetBoneID("Bip01 R Hand"),&vector1,&matrix1);
//man2是个actor2或actor.
mesh1->SetMatrix(&matrix1);
mesh1->Render();

********************
这样就可以了,这个x文件形成的mesh将随着actor2的动作而动作,大小而大小。
以下是要点:
1、先要定义D3DMATRIX;
2、怎样得到骨骼呢?用ID的话恐怕记不住,用actor2->GetBoneID("名称")当然好,
   但是怎么知道骨骼的名称呢?简单,用MilkShape3D将MDL文件反编译后再打开身体的MDS文件,然后找到
   骨骼的名称就可以了,一般用手掌。
3、这里的那个vector好象返回值是错的,但是不用担心,反正这里用不着。
4、mesh1->rotateX(...),这样的函数可以保证mesh先旋转一定的度数再跟着matrix转,如果用setrotate(...),那么渲染出的mesh就会方向始终不变。
5、mesh1->MoveRelative(up,left,straf)是用来进行绑定位移的,即绑定后的物体会动作仍然跟随,而位置不再固定于被绑物上面了,front代表前后,up代表上下,straf代表平移.