Files
CavinHuang-comfyui-nodes-docs/docs/CompositeMotionBrushWithoutModel.md
2024-05-26 20:35:16 +08:00

4.2 KiB

Documentation

该节点整合两层运动信息以产生复合运动刷效果。它基于定义的操作模式,优先考虑某些层的运动数据融合原则。节点的目的是通过对输入层的合理结合,增强运动表示,创造出连贯且视觉上吸引人的效果。

Input types

Required

  • motion_brush_layer0
    • 第一层运动信息,作为复合效果的基础层。它在建立将与第二层结合进一步细化的运动初始表示中至关重要。
    • Comfy dtype: MotionBrush
    • Python dtype: numpy.ndarray
  • motion_brush_layer1
    • 第二层运动信息,提供与基础层混合的额外运动线索。它的重要性在于能够引入新的运动元素并调整整体的复合效果。
    • Comfy dtype: MotionBrush
    • Python dtype: numpy.ndarray
  • mode
    • 模式参数决定了两层运动信息如何结合。它在控制最终输出中至关重要,因为它决定了哪些运动元素优先以及它们在复合中如何相互作用。
    • Comfy dtype: CompositeMotionBrushMode
    • Python dtype: CompositeMotionBrushMode

Output types

  • results
    • 输出代表最终的复合运动刷,它是根据指定模式对两个输入层的混合。它封装了集成的运动数据,准备进行进一步的处理或可视化。
    • Comfy dtype: MotionBrush
    • Python dtype: numpy.ndarray

Usage tips

  • Infra type: CPU

Source code

class CompositeMotionBrushWithoutModel:

    @classmethod
    def INPUT_TYPES(cls):
        return {'required': {'motion_brush_layer0': ('MotionBrush',), 'motion_brush_layer1': ('MotionBrush',), 'mode': (CompositeMotionBrushMode, {'default': 'override'})}}
    RETURN_TYPES = ('MotionBrush',)
    FUNCTION = 'run_inference'
    CATEGORY = 'DragNUWA'

    def run_inference(self, motion_brush_layer0, motion_brush_layer1, mode):
        model_length = motion_brush_layer0.shape[0]
        height = motion_brush_layer0.shape[1]
        width = motion_brush_layer0.shape[2]
        results = motion_brush_layer0
        for i in range(model_length):
            xmasked = False
            for x in range(0, width):
                xpremasked = xmasked
                xmasked = False
                masked = False
                for y in range(0, height):
                    premasked = masked
                    masked = False
                    if abs(float(motion_brush_layer1[i][y][x][0])) > 0.0001 or abs(float(motion_brush_layer1[i][y][x][1])) > 0.0001:
                        masked = True
                        xmasked = True
                    elif premasked and y + 1 < height:
                        y1max = height
                        if y + 50 < y1max:
                            y1max = y + 50
                        for y1 in range(y + 1, y1max):
                            if abs(float(motion_brush_layer1[i][y1][x][0])) > 0.0001 or abs(float(motion_brush_layer1[i][y1][x][1])) > 0.0001:
                                masked = True
                                xmasked = True
                    if masked:
                        results[i][y][x][0] = motion_brush_layer1[i][y][x][0]
                        results[i][y][x][1] = motion_brush_layer1[i][y][x][1]
                    else:
                        if xpremasked and x + 1 < width:
                            x1max = width
                            if x + 50 < x1max:
                                x1max = x + 50
                            for x1 in range(x + 1, x1max):
                                if abs(float(motion_brush_layer1[i][y][x1][0])) > 0.0001 or abs(float(motion_brush_layer1[i][y][x1][1])) > 0.0001:
                                    masked = True
                                    xmasked = True
                        if masked:
                            results[i][y][x][0] = motion_brush_layer1[i][y][x][0]
                            results[i][y][x][1] = motion_brush_layer1[i][y][x][1]
                        else:
                            results[i][y][x][0] = motion_brush_layer0[i][y][x][0]
                            results[i][y][x][1] = motion_brush_layer0[i][y][x][1]
        return (results,)