我正在寻找一种在Mel或Python中确定特定UV壳是否跨Maya中的多个纹理图块的方法。我知道Mudbox可以对此进行检查,但是我无法在Maya的界面或脚本中找到简单的命令。

我想到的一种方法是比较每个图块中的壳,然后查看是否有一个壳出现在多个图块中。

我在这里找到了一个页面,页面上有人想出了如何在给定的纹理拼贴集中选择每个UV的方法,但是它在UV而不是外壳上起作用。这是页面:
http://forums.cgsociety.org/showthread.php?t=1123235

谢谢,
麦克风

最佳答案

没有一种单一的方法可以做到这一点。

这是在Python中获取外壳的uv边界框的方法的示例。它使用API​​获取对象中所有uv壳的边界框(请注意-它应该是网格形状对象,我没有添加任何检查)。

import maya.api.OpenMaya as api
from math import floor

def get_shells(obj, uvset = ''):
    selected = api.MGlobal.getSelectionListByName(obj)
    node =  selected.getDependNode(0)

    mesh = api.MFnMesh(node)
    howmany, shell_ids = mesh.getUvShellsIds(uvset)
    u_list, v_list = mesh.getUVs()
    shells = []
    for shell_num in range(howmany):
        umin =  vmin = 9999999999999
        umax=  vmax = -9999999999999
        for idx, value in enumerate(shell_ids):
            if value == shell_num:
                umin = min(umin, u_list[idx])
                umax = max(umax, u_list[idx])
                vmin = min(vmin, v_list[idx])
                vmax = max(vmax, v_list[idx])

        shells.append ( (umin, vmin, umax, vmax) )

    return shells


print get_shells('pCylinderShape1')
# [(0.3437499701976776, -7.450580596923828e-08, 0.65625, 0.3125), (0.375, 0.3125, 0.6249997615814209, 0.6884398460388184), (0.3437499701976776, 0.6874999403953552, 0.65625, 1.0)]


结果是一个4项元组的列表,这些元组是对象中uv壳的边界框,存储为( u min, v min, u max, v max )。要捕获图块边界,只需检查的最小和最大角是相同的整数值即可:

 for shell in get_shells('pCylinderShape1'):
     mintile = int(shell[0]), int(shell[1])
     maxtile = int(shell[2]), int(shell[3])
     if mintile != maxtile:
        print "shell crosses UV boundary", shell

关于python - 在Maya中,如何在UV瓷砖中找到所有 shell ?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49932107/

10-11 20:30