【虚幻5蓝图Editor Utility Widget:创建高效模型材质自动匹配和资产管理工具,从3DMax到Unreal和Unity引擎_系列第二篇】

虚幻5蓝图Editor Utility Widget

    • 一、基础框架搭建
      • 背景:
      • 1. 创建Editor Utility Widget
      • 2.根控件选择窗口
      • 3.界面功能定位与阶段
      • 4.查看继承树
      • 5.目标效果
    • 二、模块化设计流程
      • 1.材质替换核心流程:
      • 2.完整代码如下
    • 三、可视化界面UI布局
      • 1. 添加标题栏
      • 2. 构建滚动列表区域
      • 3. 构建Apply按钮
      • 4. Apply按钮点击功能添加
      • 5. 变量模块分组
      • 6. 新增变量`材质实例`
      • 7.定义Python参数输入元素
      • 8.整体展示:
    • 四、代码的详细解析
      • 1. 材质路径获取模块
      • 2. 材质优先级配置模块
      • 3. 静态网格材质处理模块
      • 4. 骨骼网格材质处理模块
      • 5. 批量处理主逻辑模块
    • 五、Unreal API 关键用途总结
    • 六、学习资源链接


一、基础框架搭建

背景:

在第一篇中【3DMax脚本MaxScript开发:创建高效模型虚拟体绑定和材质管理系统,从3DMax到Unreal和Unity引擎_系列第一篇】,设计了一个3Dmax模型虚拟体绑定和材质统一分配的插件,现在根据上一篇的工具设计,在UE5中用Editor Utility Widget来实现一个网格体材质自动匹配功能。

在UE5中,我将通过一个具体的逻辑结构和GUI设计示例,解决模型资产因多来源导致的材质命名混乱、手动分配效率低下等问题,对模型材质进行批量调控。
在UE5的Editor Utility Widget开发中设计一款网格体材质批量匹配工具
通过可视化界面实现材质名称与网格体逻辑的自动化映射,简化美术流程并提升资源管理一致性。

1. 创建Editor Utility Widget

启用必要插件

  • 打开 Edit > Plugins,搜索并启用 “Editor Scripting Utilities”(这是创建Editor Utility Widget的必要前提)。
    在这里插入图片描述

通过主工具栏的"Add"菜单创建

  • 选择 Editor Utilities > Editor Utility Widget
    在这里插入图片描述

右键创建

  • 在内容浏览器(Content Browser)中,右键点击目标文件夹的空白区域。
  • 选择 Editor Utilities > Editor Utility Widget
    这里我创建后命名为“BP_Widget_BatchAssignMaterials”,并将其保存至 /Game/BatchAssignMaterials 目录下。接下来,我们将逐步实现UI布局、数据绑定和核心逻辑。
    在这里插入图片描述

学习资源推荐

  1. Editor Utility Widgets 官方指南
  2. Editor Scripting 插件说明
  3. UMG UI设计教程

2.根控件选择窗口

  • 虚幻引擎创建Editor Utility Widget时的根控件选择窗口,创建后弹出这个窗口,选择一个根控件作为UI的基础。
  • 选择一个合适的根控件,这里我选择“Stack Box”,点击“Select”按钮。
    在这里插入图片描述
    控件分类系统
  • COMMON区:推荐布局容器(Stack Box/Grid Panel),适合快速构建基础界面框架
  • ALL CLASSES区:提供完整控件库(含20个可用项),支持EditorUtility系列专用组件
  • Stack Box:支持垂直/水平自动排列(Orientation参数可配置)
  • Grid Panel:表格布局容器(自动保持列宽一致性)


3.界面功能定位与阶段

下图里面展示了Unreal Engine的Editor Utility Widget设计界面。下图

  • 左侧红框内是UI设计时的控件列表,按钮和布局组件,“Tile Bar Area”等元素。
    其中“BP_Widget_BatchAssignMaterial”的继承关系如下:
    在这里插入图片描述
  • 中间是设计区域,显示了具体的控件和属性设置,可视化拖拽布局,属性调试。
  • 右侧红框则是“Batch Assign Materials”面板,列出了多种材质选项,这应该是运行时美术实际看到的界面。也是本次制作的目标效果。
区域功能定位对应阶段
左侧红框区域UI设计面板(Editor Utility Widget 的控件库与层级管理)设计阶段
中间主区域UI编辑区(可视化拖拽布局,属性调试)设计阶段
右侧红框区域运行时功能面板(用户实际操作的批量材质分配界面)运行阶段

在这里插入图片描述


Widget Blueprint学习资源推荐
在这里插入图片描述

Editor Utility Widgets 指南



4.查看继承树

创建完**Editor Utility Widget** 后,可以在Class Viewer中查看和搜索相关类。
在​Unreal Engine上方菜单栏的 Tools > Class Viewer 打开窗口。如下图所示:
在这里插入图片描述
开发中的典型应用场景
想了解某个类的属性,可以在Class Viewer来查找或确认。
在开发过程中需要确认某个Widget的继承关系或属性是否正确设置,或者在处理资源路径过长的问题。

比如这里我的命名是BP_Widget_BatchAssignMaterials,
那么可以在层级结构Widget继承体系找到:Visual → Widget → UserWidget → EditorUtilityWidget → 当前类
在这里插入图片描述

​继承关系节点用途说明
VisualUI元素的基类,提供渲染能力。
WidgetUMG控件的核心父类,包含布局、交互等通用功能。
UserWidget用户自定义控件的直接父类,支持蓝图逻辑绑定。
EditorUtilityWidget专用于编辑器工具的子类,提供与Unreal编辑器交互的API(如菜单扩展、资产操作等)。

如需进一步扩展功能,可参考Unreal官方文档中的Editor Scripting Utilities 。



5.目标效果

在这里插入图片描述

二、模块化设计流程

1.材质替换核心流程:

思路如下:

骨骼网格处理
静态网格处理
StaticMesh
SkeletalMesh
获取材质数组
调用process_skeletal_mesh
插槽名称是否匹配关键字?
创建SkeletalMaterial对象
保持原材质
更新材质接口
遍历材质插槽
调用process_static_mesh
插槽名称是否匹配关键字?
加载新材质
保持原材质
替换材质插槽
开始运行脚本
获取选中资产
是否包含 Static/Skeletal Mesh?
弹出警告并终止
创建进度条
遍历每个网格资产
资产类型判断
保存所有修改
弹出完成提示
结束

2.完整代码如下

import unrealdef print_material_path(material_asset):if material_asset is None:print("材质未找到!")returnreturn material_asset.get_outer().get_path_name()MATERIAL_PRIORITY_LIST = [("Interior_Other_FrostedPlastic", print_material_path(plastic)),("Wheel_FrostedMetal", print_material_path(plastic)),("DaytimeRunningLight", print_material_path(daytime_running_light)),("RearRunningLight", print_material_path(backup_light)),("DoorOuterMirror", print_material_path(door_outer_mirror)),("RearLightGlass", print_material_path(rear_light_glass)),("FrostedPlasticRed", print_material_path(frosted_plastic_red)),("FrostedPlastic", print_material_path(frosted_plastic)),("glass1", print_material_path(glass1)),("WheelDisc", print_material_path(wheel_disc)),("GlassSkylight", print_material_path(glass_skylight)),("FrostedMetal", print_material_path(frosted_metal)),("BrakeLight", print_material_path(backup_light)),("BackupLight", print_material_path(backup_light)),("ClothDown", print_material_path(cloth_down)),("TurnLight", print_material_path(turn_light)),("Leather", print_material_path(leather)),("ClothUp", print_material_path(cloth_up)),("Chrome", print_material_path(chrome)),("Mirror", print_material_path(mirror)),("Paint", print_material_path(paint)),("CCAScreen", print_material_path(cca_screen)),("Plate", print_material_path(plate)),("Black", print_material_path(black)),("Int", print_material_path(int)),("Plastic", print_material_path(plastic)),("Glass", print_material_path(glass)),("WheelTire", print_material_path(wheeltire)),
]def process_static_mesh(staticmesh_assets):modified = Falsematerial_slots = staticmesh_assets.static_materialsfor index, material_slot in enumerate(material_slots):slot_name = str(material_slot.material_slot_name)matched_material = Nonefor keyword, material_path in MATERIAL_PRIORITY_LIST:if keyword.lower() in slot_name.lower():material = unreal.load_asset(material_path)if material:matched_material = materialbreakif matched_material:current_material = material_slot.material_interfaceif current_material != matched_material:staticmesh_assets.set_material(index, matched_material)modified = Trueunreal.log(f"StaticMesh替换成功:{staticmesh_assets.get_name()} [{slot_name}] -> {matched_material.get_name()}")return modifieddef process_skeletal_mesh(skeletal_mesh):modified = Falsematerials = list(skeletal_mesh.get_editor_property('materials'))for mat_idx in range(len(materials)):original_slot = materials[mat_idx]slot_name = str(original_slot.material_slot_name)target_material = Nonefor keyword, material_path in MATERIAL_PRIORITY_LIST:if keyword.lower() in slot_name.lower():target_material = unreal.load_asset(material_path)if target_material:breakif target_material:new_slot = unreal.SkeletalMaterial()new_slot.material_slot_name = original_slot.material_slot_namenew_slot.material_interface = target_materialmaterials[mat_idx] = new_slotmodified = Trueunreal.log(f"SkeletalMesh替换成功:{slot_name} => {target_material.get_name()}")if modified:skeletal_mesh.set_editor_property('materials', materials)return modifieddef batch_assign_materials():# 获取所有选中资产并过滤selected_assets = unreal.EditorUtilityLibrary.get_selected_assets()mesh_assets = [asset for asset in selected_assets if isinstance(asset, (unreal.StaticMesh, unreal.SkeletalMesh))]if not mesh_assets:unreal.log_warning("未选中有效的网格资产!如果Mesh插槽内已有资产,请查找资产后重新载入。")returntotal_meshes = len(mesh_assets)processed_meshes = 0with unreal.ScopedSlowTask(total_meshes, "批量替换材质中...") as slow_task:slow_task.make_dialog(True)for mesh_idx, mesh in enumerate(mesh_assets):if slow_task.should_cancel():breakprogress_percent = (mesh_idx + 1) / total_meshes * 100slow_task.enter_progress_frame(1, f"处理 {mesh.get_name()} ({progress_percent:.1f}%)")modified = Falseif isinstance(mesh, unreal.StaticMesh):modified = process_static_mesh(mesh)elif isinstance(mesh, unreal.SkeletalMesh):modified = process_skeletal_mesh(mesh)if modified:unreal.EditorAssetLibrary.save_loaded_asset(mesh)processed_meshes += 1result_msg = f"批量材质替换完成!成功处理 {processed_meshes}/{total_meshes} 个网格"unreal.log(result_msg)unreal.EditorDialog.show_message("操作完成", result_msg, unreal.AppMsgType.OK)if __name__ == "__main__":batch_assign_materials()

三、可视化界面UI布局

1. 添加标题栏

创建Window Title Bar Area

  • 拖拽 Horizontal Box 到StackBox内,命名为 WindowTitleBarArea
  • 调整字体大小和颜色。具体的属性配置可以看着调整,不做详细的提示。

请添加图片描述

  1. 添加标题文本
  • Window Title Bar Area 内拖拽 Text,命名为 TitleText
    在这里插入图片描述

2. 构建滚动列表区域

静态网格列表(左侧)

  • 拖拽 ScrollBoxStackBox内 → 命名为 StaticMesh_ScrollBox
    在这里插入图片描述
  • ScrollBox 内添加 DetailsView 作为列表项容器。
    在这里插入图片描述
  • 添加滚动列表(ScrollBox),具体的属性配置可以看着调整,不做详细的提示。
    请添加图片描述
    骨骼网格列表(左侧)
    可以直接复制上述操作完的结构,主要放置在**StackBox**内。也可以直接重新拖入,更新命名 。
    请添加图片描述


3. 构建Apply按钮

  • 拖拽 Button 到StackBox内 → 命名为 Button_Apply;
    请添加图片描述
  • 拖拽 Text 到Button_Apply内 → 设置文本为 “Apply”,背景色为绿色。
    请添加图片描述


左侧为 蓝图逻辑编辑区(节点图表),右侧为 GUI设计界面(UMG可视化布局),中间红色箭头指示二者的 动态绑定关系
在这里插入图片描述

4. Apply按钮点击功能添加

进入蓝图逻辑编辑

  • 在UMG编辑器中,点击Button_Apply按钮,在Details面板中找到 Events 部分,点击On Clicked。这时界面自动跳转到 图表(Graph) 模式。
  • 如果没有跳转可以在UMG编辑器顶部切换至 图表(Graph) 模式(非设计模式)。
    在这里插入图片描述

此时会自动在图表中生成 OnClicked 事件节点。
OnClicked 事件的输出引脚(白色箭头)连接到功能节点的输入引脚。
在这里插入图片描述

拖拽OnClicked(Button_Apply) 事件的执行Exec引脚(白色箭头),弹出检索窗口搜索**Execute Python Script**功能,并链接节点的输入引脚。 在这里插入图片描述

演示如下:
请添加图片描述



5. 变量模块分组

  • **VARIABLES ** 是蓝图编辑器中用于集中管理当前蓝图所有变量的区域。
    在蓝图中,Category 用于将变量、函数等元素按功能模块分组,提升可维护性。
    在这里插入图片描述
    Details 面板的 Category 字段输入分类名称(如 StaticMesh)。

分组如下图
在这里插入图片描述

变量模块分组演示如下:
请添加图片描述

6. 新增变量材质实例

点击加号,新增变量材质实例输入接口,Assign Materials: MaterialInterface 类型,存储待批量分配的材质实例。
请添加图片描述

材质实例的配置,根据项目需求,可能会有所不同。以下是我的材质实例命名和分类;
在这里插入图片描述

7.定义Python参数输入元素

请添加图片描述

8.整体展示:

黄颜色的表示:执行Python脚本节点(也就是**Execute Python Script**的蓝图节点),定义Python参数输入元素。
蓝色的表示:变量的节点展示。
整体展示如下:
在这里插入图片描述

四、代码的详细解析

1. 材质路径获取模块

def print_material_path(material_asset):if material_asset is None:print("材质未找到!")returnreturn material_asset.get_outer().get_path_name()
  • 功能:获取材质资源的完整路径。
  • 核心Unreal API
    • material_asset.get_outer(): 返回材质所属的外部对象(如Package)。
    • get_path_name(): 获取对象在Unreal中的完整路径(例如 /Game/Materials/MyMaterial)。
  • 问题说明
    • MATERIAL_PRIORITY_LISTprint_material_path(plastic) 存在未定义变量问题,需确保 plastic 等变量是已加载的材质实例。

2. 材质优先级配置模块

MATERIAL_PRIORITY_LIST = [("Interior_Other_FrostedPlastic", print_material_path(plastic)),# ... 其他条目
]
  • 功能:定义材质插槽名称与目标材质的映射关系,按优先级匹配。
  • 逻辑说明
    • 每个条目包含一个关键字(如 "FrostedPlastic")和材质路径。
    • 通过字符串匹配插槽名称(不区分大小写)来动态加载材质。

3. 静态网格材质处理模块

def process_static_mesh(staticmesh_assets):material_slots = staticmesh_assets.static_materialsstaticmesh_assets.set_material(index, matched_material)
  • 功能:遍历静态网格的材质插槽,按优先级列表替换材质。
  • 核心Unreal API
    • static_materials: 获取静态网格的所有材质插槽(StaticMaterial 列表)。
    • set_material(index, material): 替换指定索引的材质。
    • load_asset(material_path): 根据路径加载材质资源。
  • 关键操作
    • 通过插槽名称匹配关键字,动态加载并替换材质。

4. 骨骼网格材质处理模块

def process_skeletal_mesh(skeletal_mesh):materials = list(skeletal_mesh.get_editor_property('materials'))new_slot = unreal.SkeletalMaterial()skeletal_mesh.set_editor_property('materials', materials)
  • 功能:处理骨骼网格材质,逻辑类似静态网格。
  • 核心Unreal API
    • get_editor_property('materials'): 获取骨骼网格的材质列表。
    • unreal.SkeletalMaterial(): 创建新的骨骼网格材质插槽对象。
    • set_editor_property(): 修改骨骼网格的材质属性。
  • 差异点
    • 骨骼网格材质需通过 SkeletalMaterial 对象封装。

5. 批量处理主逻辑模块

def batch_assign_materials():selected_assets = unreal.EditorUtilityLibrary.get_selected_assets()with unreal.ScopedSlowTask(...):unreal.EditorAssetLibrary.save_loaded_asset(mesh)
  • 功能:批量处理选中的网格资产,支持进度条和撤销操作。
  • 核心Unreal API
    • EditorUtilityLibrary.get_selected_assets(): 获取用户在内容浏览器中选中的资产。
    • ScopedSlowTask: 显示进度条,防止编辑器卡死。
    • EditorAssetLibrary.save_loaded_asset(): 保存修改后的资产。
  • 流程控制
    • 过滤静态/骨骼网格 → 遍历处理 → 保存修改 → 反馈结果。

五、Unreal API 关键用途总结

API/属性用途
load_asset()根据路径加载资源(材质、网格等)。
set_material()替换静态网格的材质插槽。
get_editor_property()获取资产的编辑器属性(如材质列表)。
EditorUtilityLibrary处理编辑器交互(选中资产、弹窗等)。
ScopedSlowTask执行长时间任务时显示进度条。

六、学习资源链接

  1. Unreal Python API 官方文档
    https://docs.unrealengine.com/5.0/en-US/PythonAPI/

  2. Editor Scripting 教程
    https://docs.unrealengine.com/5.0/en-US/editor-scripting-in-unreal-engine/

  3. StaticMesh API 参考
    StaticMesh Class

  4. 材质系统文档
    Material System Overview

最终效果展示

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/77635.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LabVIEW实现DMM与开关模块扫描测量

该程序基于 LabVIEW,用于控制数字万用表(DMM)与开关模块进行测量扫描。通过合理配置触发源、测量参数等,实现对多路信号的自动化测量与数据获取,在电子测试、工业测量等领域有广泛应用。 ​ 各步骤功能详解 开关模块…

OpenAvatarChat要解决UnicodeDecodeError

错误信息如下 ailed to import handler module client/h5_rendering_client/client_handler_lam Traceback (most recent call last):File "E:\Codes\Python\aigc\OpenAvatarChat\src\demo.py", line 82, in <module>main()File "E:\Codes\Python\aigc\O…

数据库中的主键(Primary Key)

数据库中的主键&#xff08;Primary Key&#xff09; 主键是数据库表中用于唯一标识每一行记录的一个或多个列的组合&#xff0c;是关系型数据库中的重要概念。 主键的核心特性 唯一性&#xff1a;主键值必须唯一&#xff0c;不能重复非空性&#xff1a;主键列不能包含NULL值…

MySQL 9.3 正式发布!备份、用户管理与开发支持迎来革命性升级

开源数据库领域的标杆产品MySQL迎来重大更新——MySQL 9.3正式发布&#xff01;作为企业级数据库的“扛把子”&#xff0c;此次版本更新聚焦备份效率、用户管理精细化、开发支持增强三大核心领域&#xff0c;同时在高可用性和性能优化上实现突破。以下为你逐一解读新版本的亮点…

Rmarkdown输出为pdf的方法与问题解决

R 是一种在数据分析与统计计算领域广泛使用的编程语言。其关键优势之一是能够生成高质量的报告和文档&#xff0c;这些报告和文档可以使用 RMarkdown 轻松定制和更新。在本文中&#xff0c;我们将探讨使用 R 从 RMarkdown 文件生成.pdf 文件 1.生成方法 新建Rmarkdown&#xf…

毕业设计-基于机器学习入侵检测系统

选题背景与意义 随着互联网技术的飞速发展&#xff0c;网络在人们的生活、工作各个领域都发挥着至关重要的作用。但与此同时&#xff0c;网络安全问题也日益严峻&#xff0c;各类网络攻击事件频发&#xff0c;给个人、企业乃至国家都带来了巨大的经济损失和安全威胁。入侵检测…

React 实现爱心花园动画

主页&#xff1a; import React, { useEffect, useRef, useState } from react; import /assets/css/Love.less; import { Garden } from /utils/GardenClasses;// 组件属性接口 interface LoveAnimationProps {startDate?: Date; // 可选的开始日期messages?: { // 可…

从零开始了解数据采集(二十一)——电子制造行业趋势分析案例

这次分享一个偏行业性的趋势分析案例,在项目中为企业实实在在的提高了良品率。不懂什么是趋势分析的同学,可以翻看前面的文章。 在广东某电子制造厂中,管理层发现最近几个月生产良品率有所波动,但无法明确波动原因,也无法预测未来的趋势。为了优化生产过程并稳定良品率,…

在 Git 中,撤销(回退)merge 操作有多种方法

在 Git 中&#xff0c;撤销&#xff08;回退&#xff09;merge 操作有多种方法&#xff0c;具体取决于是否已提交、是否已推送&#xff0c;以及是否需要保留历史记录。以下是几种常见的撤销 merge 的方法&#xff1a; 1. 未提交 merge&#xff08;未 commit&#xff09; 如果 …

基于 Python 的实现:居民用电量数据分析与可视化

基于 Python 的实现:居民用电量数据分析与可视化 本文将介绍如何利用 Python 技术栈(包括 pymysql、pandas、matplotlib 等库)对居民用电量数据进行分析和可视化,以帮助我们更好地理解用电行为模式。 数据准备 在MySQL数据库中创建数据,,数据库表结构如下: date:记录…

Flow原理

fun main() {runBlocking {launch {flow4.collect{println("---collect-4")}println("---flow4")}}val flow4 flow<Boolean>{delay(5000)emit(false) } 我们分析下整个流程 1.flow为什么之后在collect之后才会发送数据 2.collect的调用流程 我…

设备接入与APP(应用程序)接入华为云iotDA平台的路径元素有哪些不同?

目录 壹、设备接入华为云iotDA &#x1f3e2; 形象比喻&#xff1a;设备 员工&#xff0c;IoTDA 平台 安保森严的总部大楼 一、&#x1f4cd; 平台接入地址 总部大楼地址 二、&#x1f9fe; 接入凭证 出入证 / 门禁卡 / 工牌 1. 设备密钥或证书 2. 预置接入凭证密钥&a…

JavaScript基础知识合集笔记2——数组排序、数组转换字符串、迭代方法

文章目录 排序方法reverse()sort() 转换方法join() 迭代方法some()every()forEach()filter()map() 排序方法 组有两个方法可以用来对元素重新排序&#xff1a; reverse()sort() reverse() 顾名思义&#xff0c;将数组元素方向反转。会直接改变原数组&#xff0c;请谨慎使用…

Redis 笔记(三)-Redis 基本知识及五大数据类型

一、redis 基本知识 redis 默认有 16个 数据库&#xff0c;config get databases 查看数据库数量 127.0.0.1:6379> config get databases # 查看数据库数量 1) "databases" 2) "16"默认使用的是第 0个 16 个数据库为&#xff1a;DB 0 ~ DB 15&am…

springboot项目文件上传到服务器本机,返回访问地址

文件上传到服务器本机&#xff0c;然后给出访问地址&#xff1a; 具体如下&#xff1a; 1、添加必要的工具类依赖 <!-- 文件上传工具类 --><dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId>…

巧用 Element - UI 实现图片上传按钮的智能隐藏

引言 在前端开发中&#xff0c;使用 Element - UI 组件库来构建用户界面是非常常见的操作。其中图片上传功能更是在许多项目中频繁出现&#xff0c;比如用户头像上传、商品图片上传等场景。有时候&#xff0c;我们会有这样的需求&#xff1a;当上传图片达到一定数量后&#xf…

Golang|工厂模式

工厂模式是一种创建型设计模式&#xff0c;它的核心思想是&#xff1a;把对象的创建过程封装起来&#xff0c;不直接在代码中 new 一个对象&#xff0c;而是通过一个“工厂”来生成对象。这样做的好处是&#xff1a; 降低了代码之间的耦合&#xff08;依赖具体类减少&#xff0…

CentOS 使用国内镜像安装 nvm 和 Node.js 完整指南

前言‌&#xff1a; 本文是实践过程中的个人总结&#xff0c;介绍在 CentOS 系统上通过国内镜像快速安装 nvm&#xff08;Node Version Manager&#xff09;&#xff0c;并配置镜像源加速 Node.js 的下载和依赖管理&#xff0c;解决因网络问题导致的安装失败或速度缓慢。 一、…

ComfyUI 学习笔记:安装篇及模型下载

背景 去年在掘金看到一个博主使用 ComfyUI 进行 AI 绘画&#xff0c;并基于此工具展开个人业务。知道了这个东西&#xff0c;感觉很厉害的样子。 前段时间玩 DeepSeek 的时候&#xff0c;尝试用它写《历史是一群喵》的漫画&#xff0c;给出了 AI 作画的提示词&#xff0c;但是…

人脑、深思考大模型与其他大模型的区别科普

文章目录 大模型的基本概念与特点深思考大模型的独特之处深思考大模型与其他大模型的对比架构与技术训练数据应用场景提示词编写 大模型给出答案的方式&#xff1a;基于概率还是真的会分析问题&#xff1f;人脑的思考过程基本单位与网络大脑结构与功能分区信息处理流程思维模式…