gameassassin吧 关注:215贴子:406
  • 21回复贴,共1

GA骨骼动画VS Constant 定义的一点研究

只看楼主收藏回复

没想到还有这个吧
GA能截取模型的同时还能截取骨骼动画
不过貌似是完全没人讨论骨骼动画转换啊(这也难怪,这是收费功能,而且官网还挂了几年了.....还没办法破解.......)
当年官网还在的时候论坛还有一点点人在问....(虽然也是完全没有结果就是了.作者也几乎不会出来解答)
其实GA截取骨骼动画基本上没什么难度,能截取到模型的话骨骼方面基本也顺水推舟了,十有九八是能截到骨骼动画的
难的部分是截出来的骨骼不能直接导入3dsmax,需要先编写"VS Constant 定义"(官方说法)文件
LZ作为正版用户之一,当年也曾为这个功能苦恼过.(能截不能用是咋回事啊)
而且当时作者在论坛放出了街霸4等其他几个游戏的VS Constant 定义文件.LZ当年脑抽认为暂时不需要所以没下.等网站挂了才追悔莫及(其实当年网站挂过一次,不过很快就恢复了,但是论坛进不去了.那时候想下已经是没法下了)
希望当年有下的人能提供一下
过年这几天正好闲下来,也正好想起了GA,于是就继续折腾了一下,虽然最后还是没成功....
写这篇的目的一个是和大家分享一下成果,其次是备份成果,再次就是希望有能人异士帮忙完成这个VS Constant的编写方法.....
寒碜完了下面是正题:
2楼:Vertex Shader一些必要的简单的科普
3楼:我的研究部分
4楼:GA使用上的一些QA
PS:本人并不是专业人士,所以一些术语并不标准,包含了自己理解的部分.希望见谅


IP属地:广西1楼2016-02-18 02:49回复
    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


    IP属地:广西4楼2016-02-18 02:58
    回复
      Q:没有出现GA标志
      A:不是DX8和9的游戏,或者虽然带有DX9模式但是你用WIN7玩所以使用的并不是DX9模式
      A:GA设置的问题,DX8需要用正常模式,DX9一般要选外联模式,强制和安全模式没有必要不要随便乱开
      A:没有勾选显示GA标志
      A:可以尝试勾选强制每帧清除屏幕或者忽略全屏billboard
      A:可以尝试把D3D8.mod和D3D9.mod改名dll扔到游戏exe运行根目录下再运行
      A:GA没有激活
      A:尽量使用GA的运行按钮来运行游戏
      Q:GA弹出来的小窗口上面没有任何数据
      A:GA识别不到这个游戏,参考上一条,此外杀软什么的最好别开
      Q:有GA标志但是无法截取
      A:模式不对,比如你选了外联模式但又勾选了强制模式,选了普通模式又勾选了安全模式.强制只能配普通,安全只能配外联
      A:热键被占用,改
      A:看看能否开启线框模式,如果可以开启就是设置不对
      A:尽量用快捷键来截,GA上的截取按钮并不太好用
      A:勾选热键屏蔽和屏蔽输入hook
      Q:截取出来的没有模型/模型不全/丢失Z轴
      A:可以尝试勾选强制每帧清除屏幕或者忽略全屏billboard
      A:关闭雾化试试
      Q:截取的时候卡死,死机
      A:这个多半是游戏的设置问题,把特效关掉和降低质量
      Q:在GA的3DView浏览模型时卡死
      A:参考上一条
      A:模型的问题,重新截取
      Q:导入3dsmax的时候卡死
      A:参考上一条
      Q:导入3dsmax后模型全重叠到一起了
      A:你使用的是截取原始模型,所以所有模型位置都在原点0,0上.勾选截取游戏当前的模型(常见于截取背景)
      A:在3DView拼接好所要的模型后保存为lst再导入
      Q:模型很小
      A:如果你是和背景一起导入的话就是这样的,把背景全删掉导出来再导进去就正常了
      Q:模型不是立着的(躺着或者倒下)
      A:导入的时候选择右旋(clockwise)
      A:勾选使用位置补偿变换
      A:去掉勾选转换到3dsmax坐标系
      A:手动调整
      Q:模型有很多很杂乱的线条/模型变形
      A:这个多半是你导入的时候勾选骨骼或者动画了
      A:模型本身有问题,重新截取


      IP属地:广西5楼2016-02-18 02:58
      收起回复
        马一个


        来自iPhone客户端6楼2016-02-18 18:27
        回复
          此外谁有下论坛的VS定义文件的话希望能提供一下
          谢谢


          IP属地:广西7楼2016-02-19 21:55
          回复
            非常感谢楼主分享经验.
            不过我打开你截取的模型有点问题, 变形金刚没有加载贴图, 我用的是GA13010版.
            其他两个是有贴图的, MageKnight exe那个在GA里贴图和播放都正常, SoulGainer exe播放不正常.


            IP属地:广西8楼2017-04-26 22:13
            收起回复
              想问一下楼主关于VSConstantDefine目录里面的Transformer.ini, 例如:
              ----------------------分割线------------------------
              [Init]
              Name=Transformer1
              Count=4
              [0]
              StartRegister=0
              Type=ViewMultiplyProjectTranspose
              [1]
              StartRegister=16
              Size=64
              Type=Translate44Transpose
              [2]
              StartRegister=111
              Size=64
              Type=World44Transpose
              LoopCount=2
              ----------------------分割线------------------------
              这里面的[0][1][2], 是不是只要一个就可以了?
              是不是只有一个有效, 还是根据需要都得进行定义?
              好像都有StartRegister,Size,Type这几项.


              IP属地:广西9楼2017-04-26 22:20
              收起回复
                MA一下


                IP属地:山东10楼2017-06-21 08:13
                回复
                  当初我也想买会员来着,幸亏没买,居然要这么麻烦,有毛用


                  IP属地:立陶宛11楼2017-08-13 17:06
                  回复