六六の魔法世界

注册

Maya常识 - Maya技能 - 技术分享 - 绑定技术贴 - 软件插件技术贴 - 2022年10月6日

能进UE的Maya履带绑定工具

工具使用教程视频

下载代码在文章底部


本工具核心逻辑与代码参考b站大佬李志的履带绑定教程。有需求的大佬可以跳转到李志大佬的b站细读,在此就不累述关于履带绑定逻辑的内容了。

履带数量重做效果:

通过提前声明变量来检查是否为第一次生成履带

如果是:则在预备的两根曲线上生成曲面与路径曲线。且另起一个函数来生成对应数量的点位,并放置复制的履带单片在点位上。复制出来的模型会统一放到一个组里,在需要重做履带时只需删除该组下的所有子级就可以。由于用于定位的motionPath节点是直接连接到模型上的,所以在删除模型时会自动将该节点删除。

如果不是:跳过生成曲面与路径曲线,直接生成motionPath节点对新复制的模型进行链接,而只要有生成这些。模型组下就会有对象,就又可以做重做效果。

模型轴向旋转效果:

由于我的思路是在路径曲线上生成对应定位器,定位器约束关节,关节带动模型。所以在做履带旋转时,应该将目标约束与定位器的链接进行操作,即在两个节点的旋转之间添加一个加减节点,每次添加会在原始数值上加90.但如何得到此时是否为第一次生成加减节点呢,用上面的提前声明布尔变量可以,但在小吉大佬的提示下,也可以使用hasattr方法:

class AA():
    def __init__(self):
        #self.a = 'sss'
        self.swich()

    def swich(self):
        if hasattr(self, 'a'):
            print True
        else:
            print False
AA()
>>>False
class AA():
    def __init__(self):
        self.a = 'sss'
        self.swich()

    def swich(self):
        if hasattr(self, 'a'):
            print True
        else:
            print False
AA()
>>>True

由此可以更便捷的判断某变量是否存在。与上一种方法不一样的是,hasattr只能判断变量是否存在,而不能判断变量类型、变量的值。在我这里更时候后一种方法,如果有第一次运行过旋转函数,就会生成一个储存相加节点的list变量。如果存在就直接使用,不存在就生成。另起一个变量会增加代码的重量(虽然并没有什么大影响)。

在z轴旋转时使用180度是应为这个轴向我没有使用添加节点来获得效果,而是直接将一开始生成的曲面做法线翻转。这个操作是世界的,它会将履带的排列方向翻转。如果这个需求不重要或者直接局部翻转z轴的需求更大,后期会考虑添加上局部z轴旋转。

其实不是~ 这确实是第一版绑定工具的思路,但后来在验证时发现每次生成的模型默认指向方向不对,因为aimConstraint节点的默认指向的轴是x轴,而当模型的前方向是z轴时,就会导致约束方向时把模型的z轴指向履带的生成方向,导致约束前后履带的前方向不同。而使用在aimConstraint节点后用addDoubleLinear来直接加旋转度数又会因为万向轴问题而导致旋转方向乱掉。所以在深刻研究aimConstraint节点后,我使用了新的方法来旋转模型。

新的模型轴向旋转方案:

先来了解一下aimConstraint。本工具使用aimConstraint节点是使用的类似普通约束操作中的object up约束类型。将目标对象的坐标连接到aimConstraint节点的target[0].targetTranslate属性上,将向上轴要指向的对象的位置连到aimConstraint节点的worldUpVector属性上。将aimConstraint节点的constraintRotate属性链接到被约束对象上。至此,就满足了手动使用目标约束的基础条件:被约束对象、指向对象、向上轴对象。还需要操作的就是很重要的轴向,现在只是拿到了这三个物体,但被约束对象的哪个轴去指向谁和向上轴是哪个轴还没搞清楚。我们先看一下aimConstraint节点的属性编辑器:

目标约束节点

AimConstraintAttributes菜单下有个AimVector属性,这就是被约束对象的指向轴,从图中得知该情况下是X轴指向目标对象。而UpVector属性则表示被约束对象的向上轴,图中显示为Y轴。由于大多情况下履带的向上轴都是Y轴,所以在本工具中的“履带正反翻转”只会切换向上轴的Y属性为1和-1,即向上轴指向曲面的法线方向或法线的反方向。而指向轴则会在XY上切换1和-1。当点击朝向翻转时,AimVector属性会将当前指向轴乘以-1来达到反转效果、当点击指向调整时,AimVector会在XY轴之间转换来达到切换指向轴的效果。

生成控制器:

由于条件限制,只有控制曲面点才能进而控制履带模型的效果。所以我直接将关节对曲面点进行蒙皮。

通过获取曲面的spansVspansU来得到曲面cv点的列数和行数。通过查询每行cv点的中心点得到蒙皮关节应该放置的位置。注意:在生成joint时,不能有选择对象,否则会在该选择对象的子级创建该关节。特别是在选择对象有缩放时,即便将关节再p出来,也会有一个抵消缩放的组在该关节的上层。

由于将曲面和关节同时蒙皮会导致关节的蒙皮范围不规整,而我的目的是每个关节只影响对应那一行的cv点。所以在蒙皮后需要将关节与对应cv点进行一次权重操作

mc.skinPercent(skinCluster, cv, tv=[(joint, 1)])
#skinCluster:蒙皮节点名,cv:需要操作的蒙皮点,joint:需要操作的关节,1:给到该关节的权重

在生成控制器形状时,可以通过在新场景中手动画出控制器形状。包括可以使用cube和line曲线合并后的曲线绘制。将场景保存为ma格式后用文本打开会看到该控制器的shape节点信息,将其与前面生成transform节点的代码一起复制下来单独运行可以得到一个与之前场景里控制器完全相同形状的曲线。所以,我们可以照猫画虎将shape节点信息保存下来,通过生成不同名称的shape节点来达到生成控制器的效果。


感谢大家的使用,如果对工具有其它需求和建议,请留言评论。此工具还在维护期间,尽力做到适合生产的级别。代码源文件请在下方github链接内下载。

    相关文件下载地址
    ©下载资源版权归作者所有;本站所有资源均来源于网络,仅供学习使用,请支持正版!