六六の魔法世界

注册

Maya技能 - 技术分享 - 软件插件技术贴 - 2022年3月7日

Maya物体排布工具

本文分为使用方法、代码学习工具下载


获取物体:

在窗口打开后,点击“获取物体”会将当前被选择的物体加载到要被排布的物体列表中

排布方向:

选择单选框来确定物体排布的面。已有预设均为世界坐标的正轴方向,按一条轴为行另一条轴为列。

每行个数:

设置排列出来的物体按每行多少个物体排列,即每行最多有多少列。不足一行的会自动从前往后排。且每行个数不能超过已选择物体的最大值。

竖向间隔和横向间隔:

物体排列默认是紧凑的 左右之间无空隙,上下之间以最高物体之间零空隙。在这里设置间隔距离会使您的物体之间产生空余的间隔距离,更方便观察。

排布:

当获取的物体列表有值时,“排布”按钮处于可点击状态,点击按钮即可将获取的物体列表按设置进行排布。注意,物体排布顺序是按排布方向的正交视图上每个物体的横截面大小进行从小到大排布,浙江不能保证他们在其它方向上看是否还能保持此大小顺序。

返回:

在排布后窗口未关闭时,可以点击返回图标的按钮将排布出来的物体回归到原始位置,而不用一直按撤销键。但如果窗口有关闭,将无法一键还原。

注意:经过测试,一些比较复杂的场景里排布似乎在某些行会出现问题,而在大多数行里没有问题。测试简单的小场景时没有问题,这可能意为着有些模型有一些特殊操作导致不能排布成功。但即便被冻结变换后的物体也能被排布成功。如果您打算排布,请将物体与物体的父子关系、移动属性等链接打断再进行排布,因为这将使得工具在排布一些物体时将其他物体改变它正确的排布位置。


下面是代码学习区


这个工具真的是十分的丑陋,毫无可读性。如果你去看源码会发现到处都是变量和引用,说实话我自己现在去看都看不懂很多位置的逻辑,太繁琐了。某些地方的嵌套深度甚至有六七层,真是不堪入目。但我还是将思路分享一下。

首先获取每个物体的bounding box在各个轴上最大值和最小值之差,将他们用以物体名为键,差值为值做成字典。用sorted方法将其排列:

a = {'sa' : 32,
     'ba' : 3,
     'be' : 44,
     'er' : 53}

for inf in sorted(a, key=a.__getitem__):
    print inf
--------------------------------------------------
>>ba
>>sa
>>be
>>er

你可以看到,它会把字典里的值按大小顺序将字典的键返回出来。然后再通过这些键来将他们对应的值和键依次放入一个列表,使其呈大小顺序排列。

然后就可以设置物体位置,这里毫无技术可言,只是按每行每列算该物体应该放的位置,再把物体setAttr过去,但这样无法对已经冻结变换的物体有效,因为它的坐标已经被绝对覆盖了。我们可以使用move命令来相对移动物体,但这就需要算出物体位置和物体位置到应该被放置的位置,再反向move它。被冻结变换的物体怎么算他的世界空间位置呢?还是可以用bounding box,用每条轴的最高值加最低值除以2就得到物体在这个轴上的位置,由此可以得到物体在世界上的绝对位置。

在计算物体应该被放置的位置时,有一些特殊位置是分开思考的:第一行第一列、第一行非第一列、非第一行的第一列、非第一行的非第一列,如果物体数量多余每行铺满,也就是说最后一行不能满足设置的每行个数时,还要单独写这一行的第一行第一列、第一行的非第一列。这个计算同样使用一些无脑傻瓜算法,通过不断判断来一点点的蹭出需要的结果。这也是我测试大场景时出现排布问题时不是很怀疑代码问题的原因。因为如果代码有问题,那么在这些分开书写位置的模型应该都有问题,而不是在某几行的某几个物体有问题。因为每一个类型的计算结果都是一样的,只要每个类型的排布中大多数模型都是正确的,或某行某列都是正确的, 那就不应该是代码问题。


因为这个代码是我自己硬想出来的逻辑,所以比起之前的代码都要逊色很多。谢谢大家的支持与使用,由于代码的恶心,我已经放弃对它的继续更新。所以如果不好用的话欢迎介绍更好用的排布工具。

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