欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

在Maya中获取Isolate face group

程序员文章站 2022-03-19 15:00:04
...

问题描述:

Isolate face group 指的是,假设在网格中随机选择若干的面,如果有几个面是相邻的,并且不和其他面相邻,则把这几个面视作是一个isolate group.
在Maya中获取Isolate face group
例如上图的红色网格,品红色网格以及黄色网格就是三个独立的Isolate face group。
如果能够获取这个信息,我们就可以将每个Isolate face group视作为一个整体,来执行单独的操作。

解决方法:

Maya 中没有现成的命令来处理这个问题。
可以通过查询两个面是否存在共线来判断这两个面是否相邻,这样需要比较当前Isolate group里的每一个面,算法复杂度比较高。

我目前想到的另一个方法是使用UV Shell的ID来查询。如果是Isolate face group,他们的UV Shell也是不同的。这种做法的缺陷是,如果两个面没有共用的边,但有共用的顶点,他们也会共享一个UV Shell。
在Maya中获取Isolate face group

# 使用UV shell进行判断

import maya.cmds as mc

def get_isolate_face(all_face = None):
    '''
    :param selFace: 选择的面
    :return: [[isolat_faceGrp01], [isolate_faceGrp02]...]
    '''

    if not all_face:
        all_face = mc.ls(sl=True, fl=True)
    mc.polyProjection(all_face, type='planar')

    isolate_face = {}

    for face in all_face:
        mc.select(face, replace=True)
        uv_shell_name = mc.polyEvaluate(mc.ls(sl=True, fl=True), activeUVShells=True)[0]
        mc.select(clear=True)

        if not isolate_face:
            isolate_face[uv_shell_name] = []
            isolate_face[uv_shell_name].append(face)
            continue

        if uv_shell_name in isolate_face.keys():
            isolate_face[uv_shell_name].append(face)

        else:
            isolate_face[uv_shell_name] = []
            isolate_face[uv_shell_name].append(face)

    isolate_face_grp = [value for value in isolate_face.values()]
    return isolate_face_grp
相关标签: Maya