---------------------------西昌.何雨锋 将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代表平移.