GA截出的骨骼想要被正确的导进3dsmax就必须要编写VS Constant 定义让导入插件知道准确的数据格式(说白了就是找到顶点的转换方式,还记得前面的world,view,projection么?)
引用官方的教程:
VS Constanttant主要是解决模型的变换矩阵保存在VertexShader的Constant数据中,在转换为标准模型或者导入到3DSMAX时,造成模型推挤在一起,失去它原有的位置。使用VSConstant定义就是告诉GA哪个Constant数据是包含了变换矩阵。
编写VSConstant定义可以参看游戏模型Shader目录下的shader文件,但这个一般是编译好的二进制文件,可以通过反编译来查看其中的指令,在GA的3DView中可以通过查看模型的属性,然后在属性界面上双击模型的VertexShader文件,来查看shader文件的反编译指令。
根据这些shader指令,分辨出哪些Constant是骨骼运算所使用的,把它们编写到VSConsant定义中。(见图)

如图所示,这个游戏的每个顶点受到两个骨骼的影响,从c6寄存器开始为骨骼数据,StartRegister=6,
并且使用了m4x3,那么为矩阵4*3矩阵,数据类型为World43Transpose。
VS Constant自定义文件放在GA目录下的plugin\VSConstantDefine目录下。定义文件格式如下:
[Init]
Name=XXX ;显示名称
Count=101 ;总共的定义数量
[0]
StartRegister=0
Size=64
Type=ProjectMatrixTranspose
[1]
StartRegister=6 ;在GA 3DView中的模型属性窗口中的VS Constant中的一项定义的StartRegister,这个StartRegister就是shader使用的寄存器c#。
Size=48 ;这个定义的字节大小,如果是4*4矩阵,那么这个值为64,如果是4*3矩阵,那么就是48
Type=World43Transpose ;这个定义的类型
LoopCount=100 ;这个定义包含多少个相同的定义
--------------------------------------------------------------------------
在这份教程中可以看出每个VS Constant都有4个重要的参数:
StartRegister官方解释很绕口,用图来解析吧

但是要注意,这里的StartRegister并不一定准确,而且多数时候不止1个Constant
从上面的例子来看StartRegister我们其实是需要找到作为模型坐标使用的寄存器c(原始模型坐标都是存在c里面,上面的是c6)并进行坐标矩阵运算的指令(还记得矩阵运算的指令么?)
所以实际顶点运算是这两句指令:
m4x3 r5.xyz, v0 , c6[a0.x]
m4x3 r5.xyz, v0 , c6[a0.y]
咦?看不懂?那xyz总能看懂了吧?
M*x*+xyz或者连续几条dp3/4指令+xyz就十有九八是顶点运算了
所以StartRegister = 6
Size 这个不懂4x4和4x3矩阵的64和48大小是如何计算出来的,但是同样在模型属性下的Constant数据下可以看出一些信息(不确定是否正确).
如图:

Type 这个就是转换类型了.还记得v0代表什么么?这是世界坐标.所以这两条指令就是世界转换(world transformation)
LoopCount 字面解释是循环指令,说明这个Constant循环了100次,但是为什么循环了100次?数学学渣表示完全看不懂运算算法(2楼的地址有详细指令的计算算法),所以这个只能等高人来解答了
同样在模型属性下的Constant也有一样的字符
如图:

官方的教程解读完毕.然后GA也有自带几个VS定义,同样有带教程中的pal4(仙剑4)文件
我用来对比了一下,我去,完全不对啊!!!!
[1]
StartRegister=6
Size=1329
Type=Constant43Transpose
LoopCount=1
除了地址寄存器之外全部都不一样好么!!!!
lz表示手上也没有pal4这个游戏,所以暂时没法验证了
然后发现上面有变形金刚的图

而且也刚好有带vs定义
百度了一下这游戏并不大,所以就下载了测试了一下那个vs定义
截下来是这样的:

导进去是这样的:

这都什么鬼啊,为什么只剩下腰啊???作者大人你的vs定义到底对不对的啊!!!!!!
不甘心就随便拿了个游戏进行实际操作
其实有一些游戏的文件头会给你写了用了哪种类变换和C的用途

这是代码部分:
vs_1_1
def c102, 765.005859, 1, 0, 0.5
dcl_position v0
dcl_blendweight v1
dcl_blendindices v2
dcl_normal v3
dcl_color v4
dcl_texcoord v5
mul r3.xy, v4.xwzw, v4.xwzw
add r0.w, v1.y, v1.x
mul r0.xyz, v2.zyxw, c102.x
add r1.w, -r0.w, c102.y
mov a0.x, r0.y
dp3 r1.x, v3, c0[a0.x]
dp3 r1.y, v3, c1[a0.x]
dp3 r1.z, v3, c2[a0.x]
mul r2.xyz, r1, v1.y
mov a0.x, r0.x
dp3 r1.x, v3, c0[a0.x]
dp3 r1.y, v3, c1[a0.x]
dp3 r1.z, v3, c2[a0.x]
mad r2.xyz, r1, v1.x, r2
mov a0.x, r0.z
dp3 r1.x, v3, c0[a0.x]
dp3 r1.y, v3, c1[a0.x]
dp3 r1.z, v3, c2[a0.x]
sge r3.xy, -r3, r3
mad r2.xyz, r1, r1.w, r2
mul r0.w, r3.y, r3.x
dp3 r1.x, r2, r2
rsq r2.w, r1.x
mov a0.x, r0.y
dp4 r1.x, v0, c0[a0.x]
dp4 r1.y, v0, c1[a0.x]
dp4 r1.z, v0, c2[a0.x]
mul r3.xyz, r1, v1.y
mov a0.x, r0.x
dp4 r1.x, v0, c0[a0.x]
dp4 r1.y, v0, c1[a0.x]
dp4 r1.z, v0, c2[a0.x]
mad r1.xyz, r1, v1.x, r3
mov a0.x, r0.z
dp4 r0.x, v0, c0[a0.x]
dp4 r0.y, v0, c1[a0.x]
dp4 r0.z, v0, c2[a0.x]
mul r2.xyz, r2, r2.w
mad r1.xyz, r0, r1.w, r1
dp3 r3.x, r2, c92
add r0.xyz, r1, -c101
max r1.w, r3.x, c102.z
dp3 r4.x, r0, r0
mul r3.xyz, r1.w, c95
rsq r2.w, r4.x
mul r4.xyz, r3, v4
mul r0.xyz, r0, r2.w
mad r3.xyz, c95, r1.w, -r4
dp3 r5.x, -r0, r2
mad r3.xyz, r0.w, r3, r4
add r0.w, r5.x, r5.x
add r4.xyz, r3, c94
mad r3.xyz, r2, -r0.w, -r0
dp3 r6.x, r2, -c89
dp3 r5.x, r3, r3
add r0.w, r6.x, c102.y
rsq r1.w, r5.x
mul r0.w, r0.w, c102.w
mul r5.xyz, r3, r1.w
mov r3.xyz, c78
mad r3.xyz, r0.w, r3, c90
dp3 r5.x, r5, -c92
mul r3.xyz, r3, c91.w
max r0.w, r5.x, c102.z
mad oD0.xyz, c79.x, r3, r4
log r0.w, r0.w
add r3.xyz, r0, r0
mul r0.w, r0.w, c96.w
exp r0.w, r0.w
dp3 r4.x, r3, r2
mul r0, r0.w, c96
add r1.w, r4.x, r4.x
mul oD1, r0, c81.x
mad r0.xyz, r2, -r1.w, r3
mad oT2.xyz, r2, c102.w, c102.w
mul oT1.xyz, r0, c83.x
add oT0.x, v5.x, c97.x
mov r1.w, c102.y
dp4 r0.x, r1, c85
dp4 r0.y, r1, c86
dp4 r0.z, r1, c87
dp4 r0.w, r1, c88
add oT0.y, v5.y, c98.x
dp4 r1.w, r0, c93
mov oPos, r0
add r0.w, -r1.w, c99.x
mul oFog, r0.w, c84.x
mov oD0.w, c100.x
一共有3个dp3(3*3)矩阵和3个dp4(4*3)矩阵和1个dp4(4*4)矩阵
前3个dp3矩阵是法线运算(v3),无视掉
后面3个才是顶点运算(v0)
所以
[Init]
Name=SoulGainer
Count=4
[0]
StartRegister=0
Size=48
Type=World43Transpose
LoopCount=3
[1]
StartRegister=85
Size=64
Type=ViewMultiplyProjectTranspose 由文件头可知用了mViewProj矩阵
但是截取的:

导进去的:

以失败告终了..........
最后上传我把这几个带骨骼动画的模型给上传了,有兴趣的话就看看吧
pan.baidu.com/s/1pKivhrl