【MAYA】 쉐이프에 머티리얼의 어사인이 있는지 여부를 판단한다(상세판

11299 단어 파이썬maya
마지막 기사 에서 머티리얼의 페이스 어사인이 있을지 어떨지를 판별하는 코드를 썼습니다만, 통상의 오브젝트 어사인이 있는지 어떤지의 판정도 맞추어, 상세한 판정을 할 수 있도록(듯이) 코드를 기술해 보겠습니다. .

빨리 만들어 보자.


def has_object_assign(shape):
    """
    シェイプにマテリアルのオブジェクトアサインがあるかどうか確認する

    :param shape: チェックするシェイプ
    :type shape: pymel.nodetypes.Shape
    :rtype: bool
    """
    instanceNumber = shape.instanceNumber()
    instObjGroup = shape.instObjGroups[instanceNumber]
    cons = pm.listConnections(instObjGroup, plugs=False)
    for con in cons:
        if con.type() == 'shadingEngine':
            return True
    return False

instObjGroup에 SG 연결이 있는지 확인하고 있습니다.

이와 마지막 has_face_assign 함수를 결합하면 모양에 어떤 머티리얼이 할당되었는지 알 수 있습니다.
def has_any_assign(shape):
    """
    シェイプに何らかのマテリアルのオブジェクトアサインがあるかどうか確認する

    :param shape: チェックするシェイプ
    :type shape: pymel.nodetypes.Shape
    :rtype: bool
    """
    return has_face_assign(shape) or has_object_assign(shape)

처리에 중복이 있는 것과, 원래 무거운 것 같은 처리 판정이므로, 현실적인 퍼포먼스가 나올까는 제대로 합니다만. .

그런데 shape에는 관련 sets를 반환하는 메서드가 있으므로,
def has_any_assign2(shape):
    set_list = shape.listSets()
    for s in set_list:
        if s.type() == 'shadingEngine':
            return True
    return False

어떠한 머티리얼 어사인이 있을지 어떨지의 판정은, 이런 느낌이라도 좋았습니다. 이 처리에서도 제대로 인스턴스를 구별했습니다.

페이스 어사인, 오브젝트 어사인의 판정도 이런 느낌으로 더 스마트하게 판정할 수 있는 방법이 있을 것 같은 생각도 듭니다만, 움직이는 것을 만들어 이해를 진행하고 있다고 하는 것으로. .

동작 검증




아래에서 pCube1,2,3,4,5,6
shape = pm.PyNode('pCube1|pCubeShape1')  # フェイスアサインのないインスタンスシェイプ
print(has_face_assign(shape)) # -> False
print(has_object_assign(shape)) # -> True
print(has_any_assign(shape)) # -> True
print(has_any_assign2(shape)) # -> True
print('')

shape = pm.PyNode('pCube2|pCubeShape1')  # フェイスアサインのあるインスタンスシェイプ
print(has_face_assign(shape)) # -> True
print(has_object_assign(shape)) # -> False
print(has_any_assign(shape)) # -> True
print(has_any_assign2(shape)) # -> True
print('')

shape = pm.PyNode('pCube3|pCubeShape3')  # インスタンスが存在しないフェイスアサインのないシェイプ
print(has_face_assign(shape)) # -> False
print(has_object_assign(shape)) # -> True
print(has_any_assign(shape)) # -> True
print(has_any_assign2(shape)) # -> True
print('')

shape = pm.PyNode('pCube4|pCubeShape4')  # インスタンスが存在しないフェイスアサインのあるシェイプ
print(has_face_assign(shape)) # -> True
print(has_object_assign(shape)) # -> False
print(has_any_assign(shape)) # -> True
print(has_any_assign2(shape)) # -> True
print('')

shape = pm.PyNode('pCube5|pCubeShape5')  # マテリアルが外れてしまったシェイプ
print(has_face_assign(shape)) # -> False
print(has_object_assign(shape)) # -> False
print(has_any_assign(shape)) # -> False
print(has_any_assign2(shape)) # -> False
print('')

shape = pm.PyNode('pCube6|pCubeShape6')  # 一部faceのマテリアルが外れてしまったシェイプ
print(has_face_assign(shape)) # -> True
print(has_object_assign(shape)) # -> False
print(has_any_assign(shape)) # -> True
print(has_any_assign2(shape)) # -> True

좋은 웹페이지 즐겨찾기