Files
2024-05-26 20:35:16 +08:00

68 lines
3.6 KiB
Markdown

# Documentation
- Class name: MultivalDynamicNode
- Category: Animate Diff 🎭🅐🅓/multival
- Output node: False
- Repo Ref: https://github.com/Kosinkadink/ComfyUI-AnimateDiff-Evolved.git
MultivalDynamicNode 类旨在动画框架中动态生成和操作多值数据。它是创建复杂动画的关键组件,允许用户指定一系列值,这些值可以应用于动画的不同方面,如角色运动或场景转换。该节点的功能围绕 'create_multival' 方法展开,该方法智能处理单个和可迭代输入值,并确保输出格式适合下游处理。
# Input types
## Required
- float_val
- 参数 'float_val' 对于定义节点将用于创建多值数据的基值或值序列至关重要。它既可以接受单个浮点数,也可以接受浮点数的可迭代对象,这在动画场景的不同方面提供了高度的灵活性。该参数对节点执行的影响很大,因为它直接影响输出值的范围和性质。
- Comfy dtype: FLOAT
- Python dtype: Union[float, List[float]]
## Optional
- mask_optional
- 参数 'mask_optional' 用于将掩码应用于节点生成的多值数据。这是一个可选的张量,当提供时,允许在动画的不同元素上选择性地应用 'float_val'。这个参数通过启用条件或部分动画效果来增强节点的功能,为最终动画增添了深度。
- Comfy dtype: MASK
- Python dtype: Optional[torch.Tensor]
# Output types
- multival
- 输出 'multival' 表示已处理的多值数据,可供动画流水线使用。它是一个张量,包含了由 'float_val' 参数指定的动态值范围,可能会被 'mask_optional' 参数修改。这个输出很重要,因为它构成了进一步动画开发的基础,并且可以直接集成到渲染过程中。
- Comfy dtype: MULTIVAL
- Python dtype: torch.Tensor
# Usage tips
- Infra type: CPU
# Source code
```
class MultivalDynamicNode:
@classmethod
def INPUT_TYPES(s):
return {'required': {'float_val': ('FLOAT', {'default': 1.0, 'min': 0.0, 'step': 0.001})}, 'optional': {'mask_optional': ('MASK',)}}
RETURN_TYPES = ('MULTIVAL',)
CATEGORY = 'Animate Diff 🎭🅐🅓/multival'
FUNCTION = 'create_multival'
def create_multival(self, float_val: Union[float, list[float]]=1.0, mask_optional: Tensor=None):
float_is_iterable = False
if isinstance(float_val, Iterable):
float_is_iterable = True
float_val = list(float_val)
if mask_optional is not None:
if len(float_val) < mask_optional.shape[0]:
float_val = float_val + float_val[-1] * (mask_optional.shape[0] - len(float_val))
if mask_optional.shape[0] < len(float_val):
mask_optional = extend_to_batch_size(mask_optional, len(float_val))
float_val = float_val[:mask_optional.shape[0]]
float_val: Tensor = torch.tensor(float_val).unsqueeze(-1).unsqueeze(-1)
if mask_optional is not None:
mask_optional = mask_optional.clone()
if float_is_iterable:
mask_optional = mask_optional[:] * float_val.to(mask_optional.dtype).to(mask_optional.device)
else:
mask_optional = mask_optional * float_val
return (mask_optional,)
else:
if not float_is_iterable:
return (float_val,)
float_len = float_val.shape[0] if float_is_iterable else 1
shape = (float_len, 1, 1)
mask_optional = torch.ones(shape)
mask_optional = mask_optional[:] * float_val.to(mask_optional.dtype).to(mask_optional.device)
return (mask_optional,)
```