OpenGL渲染与几何内核那点事-项目实践理论补充(二-1-(2):当你的CAD学会“听话”:从鼠标点击到自然语言命令)
TOC代码仓库入口github源码地址。gitee源码地址。系列文章规划(OpenGL渲染与几何内核那点事-项目实践理论补充一-1-1从开发的视角看下CAD画出那些好看的图形们))OpenGL渲染与几何内核那点事-项目实践理论补充一-1-2看似“老派”的 C 底层优化恰恰是这些前沿领域最需要的基础设施OpenGL渲染与几何内核那点事-项目实践理论补充一-1-3你的 CAD 终于能画标准零件了但用户想要“弧面”、“流线型”怎么办OpenGL渲染与几何内核那点事-项目实践理论补充一-1-4GstarCAD / AutoCAD 客户端相关产品 —— 深入骨髓的数据库哲学OpenGL渲染与几何内核那点事-项目实践理论补充(一-1-(5)番外篇给 CAD 加上“控制台”——让用户能实时“调参数、看性能”)OpenGL渲染与几何内核那点事-项目实践理论补充(一-1-(6)番外篇让视图“活”起来——鼠标拖拽、缩放背后的数学魔法OpenGL渲染与几何内核那点事-项目实践理论补充(一-1-(7)-番外篇点击的瞬间发生了什么OpenGL渲染与几何内核那点事-项目实践理论补充(一-1-(8)-番外篇当你的 CAD 遇上“活”的零件)OpenGL渲染与几何内核那点事-项目实践理论补充(一-2-(1)-当你的CAD想“联网”时从单机绘图到多人实时协作)OpenGL渲染与几何内核那点事-项目实践理论补充(一-2-(2)-当你的CAD需要处理“百万个螺栓”时从内存爆炸到丝般顺滑)OpenGL渲染与几何内核那点事-项目实践理论补充(一-2-(3)-当你的协同CAD服务器面临“千人同屏”时从单机优化到分布式高并发)巨人的肩膀deepseekgemini当你的CAD学会“听话”从鼠标点击到自然语言命令故事续章你的CAD已经能处理千人协同了但用户说“能不能直接跟我说把螺栓加粗”你作为辣个蓝人【那个男人】刚刚看了并发和内存那点事又搞了搞CAD和图形渲染的小九九正准备庆祝。产品经理又来了“小C现在AI这么火我们的CAD能不能加个‘语音助手’用户说一句‘帮我把所有螺栓加粗2mm’软件就自动执行。”你愣了一下“这……不就是自然语言转成API调用吗”但仔细一想问题远比想象中复杂。用户说的“螺栓”在图纸里可能是一堆三角形的集合STL文件或者是一个块引用DWG或者是一个参数化特征SolidWorks。计算机不认识“螺栓”这个词。你开始意识到你需要一个Agentic CAD Workflow智能代理CAD工作流——让AI当“翻译官”把人类的自然语言翻译成CAD能执行的指令。第一步最原始的方式——硬编码命令用户得像机器人一样说话最早的CAD当然没有AI。用户想“加粗螺栓”得手动操作点击“选择工具”框选所有螺栓可能得一个个点点击“偏移面”命令输入“2mm”点击“确定”你作为开发者觉得这太繁琐了。你尝试做了一个命令行输入框支持一些“宏命令”SELECT ALL BOLTS OFFSET 2.0你在代码里写了一个词法解析器遇到SELECT就进入选择模式ALL表示全选BOLTS是一个预定义的关键词你得提前把图纸里的物体打上标签。遇到OFFSET就调用offsetEntity(2.0)。但问题是用户必须记住精确的命令词说“加粗”不行得说OFFSET。你无法处理模糊语义“把螺栓弄粗一点”——“一点”是多大每个新命令都要你写解析逻辑累死。你意识到这不是真正的“自然语言”只是换了个马甲的命令行。第二步引入大语言模型——让AI“猜”用户意图2023年ChatGPT火了。你想能不能让LLM大语言模型来解析用户的话你设计了一个最简单的架构用户输入“帮我把所有螺栓加粗2mm”→发送给LLM调用OpenAI API→LLM返回{action: offset, target: bolt, value: 2.0, unit: mm}→你的CAD程序解析这个JSON调用对应的C函数。你发现LLM真的能理解“加粗”就是“沿法线向外偏移”“螺栓”就是图纸中标记为bolt的物体。你不需要再写死关键词了。但问题来了每次调用都走云端API延迟高几秒钟用户体验差。敏感图纸不能上传到第三方服务器。LLM有时候“幻觉”用户说“把螺栓变胖”它可能返回{action: scale, factor: 1.5}但“变胖”是径向缩放不是沿法线偏移——你需要在提示词里做大量工程。你开始研究LangChain和Coze。第三步Agentic CAD Workflow——把“大脑”和“躯干”分开你意识到一个完整的自然语言控制CAD系统应该分成四个层次就像人的神经系统1. 感知层 (NLP) —— 耳朵和嘴巴接收用户的自然语言指令转换成结构化的“意图”。你用了Coze国内字节跳动的AI Agent平台或者LangChain开源框架。Coze提供了拖拽式的Bot搭建你可以快速做一个“CAD助手”原型不需要自己写LLM调用代码。在Coze里你设计了一个工作流输入“帮我把所有螺栓加粗2mm”插件调用一个你自己写的“CAD控制”插件暴露为HTTP接口输出执行结果2. 决策层 (LLM) —— 大脑LLM负责理解意图并拆解成可执行的步骤。你发现对于“加粗2mm”LLM需要推理出“螺栓”是哪些物体 → 需要查找图纸中所有“螺栓”标签的物体。“加粗”是什么几何操作 → 沿每个面的法线方向向外偏移2mm。偏移后会不会自交 → 需要调用布尔运算检查。你写了一个提示词模板告诉LLM你的CAD支持哪些原子操作find_objects_by_label、offset_faces、check_intersection等。LLM会生成一个计划Plan例如{plan:[{step:1,action:find_objects,args:{label:bolt}},{step:2,action:offset_faces,args:{distance:2.0,direction:normal}},{step:3,action:check_collision,args:{}}]}3. 接口层 (Control API) —— 神经你的CAD项目需要暴露一个本地控制接口。你选择了WebSocket或HTTPRESTful因为Coze/LangChain都支持。你在CAD程序里启动一个后台线程监听localhost:8765。接口设计POST /find→ 根据标签查找物体ID列表POST /offset→ 对指定物体ID执行偏移操作POST /undo→ 撤销Coze的插件会调用这些接口。这样你的CAD项目不需要改造成“AI原生”只需要加上一层薄薄的API外壳。4. 执行层 (Renderer) —— 肌肉你的CAD程序收到指令后调用现有的渲染管理器和几何内核在render_manager.cpp中你遍历所有顶点沿法线方向移动2mm。如果用的是精确几何如Open CASCADE的B-Rep你调用BRepOffsetAPI_MakeOffset。修改完成后触发重绘。你终于实现了用户说一句话屏幕上所有螺栓真的变粗了。第四步混合架构——“大脑”与“躯干”分离你决定不要另起炉灶重写整个CAD。而是保持原来的C核心不变用LangChain/Coze搭建一个“控制端Controller”你的CAD项目作为“执行端Executor”。两者通过本地网络通信。为什么这样做解耦AI技术迭代快今天LangChain明天可能又有新框架你的CAD核心不需要跟着改。安全图纸数据可以只留在本地只把必要的文本信息如物体标签发给云端LLM或者干脆用本地小模型如Ollama Llama 3。复用你可以把同样的API暴露给其他客户端比如手机App、命令行脚本。你画了一个架构图[用户] - [Coze/LangChain] - [本地WebSocket/HTTP] - [你的CAD C程序] | - [修改顶点数据/Model矩阵] - [重渲染]第五步技术挑战——STL文件不认识“螺栓”你很快遇到了最棘手的问题STL文件只是一堆三角形没有语义。它不知道哪堆三角形属于“螺栓”哪堆属于“齿轮”。你的CAD项目原本支持导入STL但用户说“把螺栓加粗”时程序根本不知道哪些三角形是螺栓。你需要零件语义化。你开始研究几种方案方案A人工打标签最原始用户导入STL后手动框选螺栓部分的三角形然后右键“标记为螺栓”。你在代码里记录一个maptriangleId, string。这是最可靠的但费时。方案B基于几何特征自动识别进阶螺栓有特征圆柱面螺纹六角头。你可以写一个识别算法遍历所有三角形计算曲率、法线分布找出符合螺栓几何特征的区域。这需要你懂计算机图形学和机器学习。方案C从STEP文件中读取语义工业标准STEP文件本身就带有“产品结构”每个零件有名称、ID。你之前已经集成了Open CASCADE可以读取STEP文件中的标签。例如Handle(TDataStd_Name)nameAttr;if(shape.FindAttribute(TDataStd_Name::GetID(),nameAttr)){TCollection_ExtendedString namenameAttr-Get();// name 可能是 Bolt_M12}这样你不需要自己识别用户直接导入带语义的STEP文件即可。你决定在项目中同时支持三种方案用户手动标记、几何特征识别简单版本、STEP语义读取。这样无论用户上传什么格式都能理解“螺栓”。几何变换逻辑从“加粗”到“顶点位移”当LLM决定“加粗2mm”后你需要修改几何。对于网格模型STL做法是找出所有属于“螺栓”的三角形。对每个三角形计算法线方向归一化。将三个顶点沿法线方向移动2mm。注意相邻三角形共享顶点你不能重复移动。你需要先收集所有受影响顶点去重再统一移动。对于精确模型B-Rep调用OCCT的偏移APIBRepOffsetAPI_MakeOffsetoffset(face);offset.SetOffsetValue(2.0);TopoDS_Shape newFaceoffset.Shape();你把这些逻辑封装成offsetEntityById(entityId, distance)函数供接口层调用。第六步进阶挑战——让你的CAD助手“惊艳”全场你完成了基础版用户说“加粗螺栓2mm”程序执行。但产品经理说“能不能更智能比如用户指着屏幕说‘加粗这颗’或者写一段Python脚本自动生成齿轮”你开始研究2026年的高阶路径。挑战一多模态交互——让AI“看”屏幕用户不仅说话还能用鼠标指向屏幕上的螺栓然后说“加粗这颗”。你的助手需要“看懂”截图。你集成了GPT-4o支持图像输入或类似的视觉语言模型。流程用户说“加粗这颗”同时鼠标在屏幕上点击。你的CAD程序截取当前渲染画面并记录鼠标坐标。将截图鼠标坐标用户语音转文字一起发给多模态LLM。LLM理解“这颗”指的是截图里鼠标位置附近的物体返回该物体的ID。然后执行加粗操作。你需要在渲染器中给每个物体分配唯一颜色ID Render Pass这样鼠标点击时你读取该像素的颜色就能反查出物体ID。这是图形学里的经典技巧。挑战二Code Interpreter模式——让AI写代码改模型用户说“我想生成一个渐开线齿轮模数2齿数20。” 这不是简单的“偏移”而是参数化建模。你的方案不让LLM直接调用你的C API太复杂而是让LLM生成一小段Python脚本然后由你的CAD程序内置的Python解释器执行。你在项目中嵌入了Python.hCPython的C API或者用pybind11暴露一些几何操作给Python。然后LLM生成脚本例如fromcad_apiimportcreate_gear gearcreate_gear(module2,teeth20)add_to_scene(gear)你的C程序调用PyRun_SimpleString执行这段脚本。脚本通过pybind11调回C的几何内核生成齿轮的B-Rep。这就是Code Interpreter模式 —— 让AI编程而不是发JSON。好处是你可以复用已有的Python生态如numpy、scipy而且用户也可以自己写脚本扩展功能。第七步你的“CAD助手”诞生了经过几个月的开发你终于拿出了原型感知层用Coze搭建的Bot支持语音输入用户对着麦克风说话。决策层接入GPT-4o能理解模糊指令拆解成计划。接口层你的CAD程序暴露了WebSocket API支持find_by_label、offset_faces、run_python等操作。执行层支持网格和B-Rep的几何变换支持Code Interpreter。语义化自动从STEP文件读取零件名称也支持用户手动标记STL的三角形组。多模态用户鼠标指向语音AI能定位物体。产品经理演示给老板看他打开一个复杂的齿轮箱装配图说“把所有的M6螺栓加粗1mm然后把输出轴的长度缩短5mm”。几秒钟后图纸自动更新。老板惊呼“这就像钢铁侠的贾维斯”你笑了你知道这背后是无数个日夜的工程LLM的提示词调优、WebSocket的稳定性、法线计算的数值精度、Python解释器的隔离……但这一切都值得。深度解析Agentic CAD Workflow 从入门到精通通过上面的故事你已经对“CAD助手”的构建有了直观理解。下面我们来系统地、由浅入深地剖析每一个技术点确保你从零基础到能够自己动手实现。1. 自然语言控制CAD从硬编码到Agentic Workflow阶段一关键词匹配远古时代实现if (cmd.find(加粗) ! string::npos) { offset(2.0); }缺点无法处理同义词、无法理解复杂语义、扩展性差。阶段二正则表达式 模板填充实现正则/(加粗|变粗|放大) (\d)mm/提取数值。缺点用户必须按固定模板说话。阶段三传统NLP词性标注、句法分析实现用Stanford CoreNLP提取“动作-对象-参数”三元组。缺点需要大量标注数据难以处理“所有螺栓”这种集合。阶段四大语言模型 函数调用Function Calling实现OpenAI的tools参数让模型返回结构化JSON。优点零样本泛化理解自然语言。缺点依赖云端延迟高幻觉风险。阶段五Agentic Workflow代理工作流实现LLM作为“大脑”调用多个原子工具查找、偏移、检查自主规划步骤。代表框架LangChain、Coze、AutoGen。关键组件ReAct模式Reason Act模型先推理再行动。2. LangChain vs Coze选哪个维度LangChainCoze性质开源Python框架字节跳动云端平台免费适用场景需要深度定制、自托管、本地模型快速原型、国内网络友好、拖拽式开发核心概念Chain, Agent, Tool, MemoryBot, Plugin, Workflow, Knowledge代码示例agent.run(加粗螺栓)画布上拖拽“大模型节点”“代码节点”本地部署支持Ollama等不支持必须走云端多模态需自行集成内置图像理解需申请建议初学者用Coze快速跑通原型生产环境自托管LangChain以保护图纸数据。3. 感知层如何让CAD“听”懂指令语音转文字本地方案Vosk、Whisper.cpp离线、隐私安全云端方案讯飞、阿里云、Azure Speech-to-Text文字到意图用LLM的函数调用Function Calling定义你的CAD工具集{name:offset_faces,description:沿法线方向偏移指定物体的表面,parameters:{object_ids:[string],distance_mm:number}}提示词工程告诉LLM“加粗”等价于offset_faces距离为正表示向外。4. 决策层LLM如何拆解复杂指令ReAct模式原理Thought: 用户要求“加粗螺栓2mm”。我需要先找到所有螺栓。 Action: find_objects(labelbolt) Observation: 返回了 [id1, id2, id3] Thought: 找到了3个螺栓现在执行偏移。 Action: offset_faces(object_ids[id1,id2,id3], distance2.0) Observation: 偏移成功无自交。 Thought: 任务完成回复用户。 Answer: 已成功加粗3个螺栓。LangChain实现fromlangchain.agentsimportinitialize_agent,Toolfromlangchain_openaiimportChatOpenAI tools[Tool(namefind_objects,funccall_cad_find,description根据标签查找物体),Tool(nameoffset_faces,funccall_cad_offset,description偏移物体表面)]agentinitialize_agent(tools,ChatOpenAI(),agentzero-shot-react-description)agent.run(帮我把所有螺栓加粗2mm)Coze实现在Bot的工作流中添加“大模型节点”配置提示词和输出格式然后接“代码节点”调用HTTP插件。防止幻觉给LLM提供“原子操作列表”禁止它发明新操作。要求LLM输出JSON Schema并做校验。让LLM在行动前先“反思”Self-ask。5. 接口层如何安全地暴露CAD控制API技术选型WebSocket双向通信适合长连接可推送进度HTTP REST简单适合单次调用gRPC高性能适合内部微服务本地WebSocket示例C使用websocketpp库classCADWebSocketServer{public:voidon_message(websocketpp::connection_hdl hdl,message_ptr msg){autojsonnlohmann::json::parse(msg-get_payload());if(json[action]find){autoidsfindObjectsByLabel(json[label]);send(ids.dump());}elseif(json[action]offset){offsetFaces(json[object_ids],json[distance]);send({\status\:\ok\});}}};安全考虑只监听127.0.0.1不暴露到公网。加上简单的Token验证防止本地其他恶意程序调用。限制请求频率避免恶意循环。6. 执行层几何变换的细节网格STL的偏移算法遍历每个三角形计算单位法线归一化后的叉积。三个顶点分别沿法线移动v v normal * distance。注意相邻三角形共享顶点需要合并移动。做法先收集所有受影响顶点的偏移量再平均或按面积加权。重新计算法线用于光照。更新VBO触发重绘。精确几何B-Rep的偏移Open CASCADEBRepOffsetAPI_MakeOffset内部算法沿法线方向偏移曲面再裁剪、缝合。注意偏移量过大会导致自交需要检测并报错。参数化建模Code Interpreter模式嵌入Python用pybind11暴露C类。安全沙箱限制Python脚本的访问权限文件、网络、CPU时间。示例暴露函数PYBIND11_MODULE(cad_api,m){m.def(create_cylinder,createCylinder,半径,高度);m.def(boolean_union,booleanUnion,两个形状);}用户脚本import cad_api; bolt cad_api.create_cylinder(5, 20); ...7. 零件语义化让计算机认识“螺栓”方案对比方法原理优点缺点人工打标签用户手动框选三角形100%准确费时文件名/图层约定按规则命名如bolt_*简单依赖用户习惯STEP语义读取标准格式中的产品结构工业标准需要用户提供STEP而非STL几何特征识别基于曲率、厚度、螺纹特征自动化算法复杂可能误判深度学习分割PointNet等直接识别点云前沿需要训练数据推理慢你的项目实现混合策略。优先用STEP语义如果没有尝试基于文件名如bolt.stl再不行让用户手动标记一次保存标记结果到附属文件。8. 进阶挑战深度解析多模态交互视觉定位实现“点击屏幕识别物体”的技术ID Render Pass。正常渲染前额外渲染一次“ID Pass”每个物体用唯一颜色如物体索引映射为RGB。鼠标点击时读取该像素的颜色解码回物体ID。将物体ID和截图一起发给多模态LLMLLM就能理解“这颗”指的是ID。GPT-4o的输入[图像] [鼠标坐标] [文字]模型输出物体ID。Code Interpreter的安全沙箱限制内存setrlimit(RLIMIT_AS, ...)限制CPU时间alarm()或sandbox2限制模块导入重写__import__只允许白名单模块隔离文件系统用chroot或Docker容器执行脚本参考Google的Sandboxed API、Python的RestrictedPython性能优化LLM推理延迟用本地小模型如Phi-3、Llama 3 8B量化后可在CPU上实时运行。WebSocket消息批量传输减少往返。几何变换对于大量物体用OpenMP并行处理每个三角形的偏移。9. 完整项目架构图┌─────────────────────────────────────────────────────────────┐ │ 用户界面 (语音/文字) │ └─────────────────────────────────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────────────────┐ │ Coze / LangChain (控制端) │ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────────────┐ │ │ │ 感知层(NLP) │→│ 决策层(LLM) │→│ 规划与工具调用 │ │ │ └─────────────┘ └─────────────┘ └─────────────────────┘ │ └─────────────────────────────────────────────────────────────┘ │ WebSocket / HTTP ▼ ┌─────────────────────────────────────────────────────────────┐ │ 你的 CAD C 程序 (执行端) │ │ ┌─────────────────────────────────────────────────────────┐│ │ │ 接口层: WebSocket Server, 解析JSON, 调用核心函数 ││ │ └─────────────────────────────────────────────────────────┘│ │ ┌──────────────┐ ┌──────────────┐ ┌──────────────────┐ │ │ │ 几何内核 │ │ 渲染管理器 │ │ Python解释器 │ │ │ │ (OCCT/自研) │ │ (OpenGL) │ │ (Code Interpreter)│ │ │ └──────────────┘ └──────────────┘ └──────────────────┘ │ └─────────────────────────────────────────────────────────────┘10. 学习路线总结入门用Coze拖拽一个Bot调用公开API如天气查询理解Agent概念。进阶用LangChain OpenAI搭建本地Agent实现“查找偏移”两个工具。实践给你的CAD项目加上WebSocket接口用Python脚本调用实现“语音控制”。深入研究ReAct论文自己实现一个简单的Agent循环不用LangChain。精通集成多模态模型、Code Interpreter沙箱优化延迟和安全性。你现在已经掌握了从零构建“CAD助手”的全部知识。剩下的就是动手写代码了。记住AI不会取代CAD开发者但会用AI的CAD开发者会取代不用AI的。如果想了解一些成像系统、图像、人眼、颜色等等的小知识快去看看视频吧 抖音数字图像哪些好玩的事咱就不照课本念轻轻松松谝闲传快手数字图像哪些好玩的事咱就不照课本念轻轻松松谝闲传B站数字图像哪些好玩的事咱就不照课本念轻轻松松谝闲传认准一个头像保你不迷路您要是也想站在文章开头的巨人的肩膀啦可以动动您发财的小指头然后把您的想要展现的名称和公开信息发我这些信息会跟随每篇文章屹立在文章的顶部哦