mcpField
M
morph-ppt-3d

morph-ppt-3d

github.com/iofficeai文档处理32.7k88 次安装今天更新
代码仓库

关于 morph-ppt-3d

morph-ppt-3d 扩展 morph-ppt,提供使用 .glb 模型和 Morph 转场制作 PowerPoint 演示文稿的指导,面向演示文稿创作者。它补充模型发现流程,以及视觉设计和版式检查规则。

主要功能

  1. 01.glb 兼容性指导
  2. 023D 模型发现流程
  3. 03模型许可提醒
  4. 04配色方案与字体组合
  5. 05文本、对比度与演讲者备注规则
  6. 06视觉元素检查点

适用场景

  1. 01围绕 3D 模型制作演示文稿
  2. 02为演示主题寻找合适模型
  3. 03应用一致的演示文稿样式

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/iofficeai/officecli --skill morph-ppt-3d

安装后在 Claude Code 中输入/morph-ppt-3d确认已加载。

详细介绍

Morph PPT — 3D 扩展

本技能扩展了 morph-ppt。morph-ppt 的所有规则(命名、重影、设计、验证)完全适用。 本文件涵盖3D 专属内容,以及一套增强的设计系统,将 morph-ppt 的美学与具体的配色方案、字体搭配和布局质量准则相结合。


环境准备

如果缺少 officecli:

  • macOS / Linux:curl -fsSL https://d.officecli.ai/install.sh | bash
  • Windows(PowerShell):irm https://d.officecli.ai/install.ps1 | iex

运行 officecli --version 进行验证(如果 PATH 尚未生效,请打开新的终端)。如果安装失败,请从 https://github.com/iOfficeAI/OfficeCLI/releases 下载二进制文件。

适用场景

  • 用户需要一个包含 .glb 3D 模型和 Morph 过渡效果的 .pptx。

3D 模型兼容性检查(生成前)

  1. 仅支持 .glb 格式。如果用户提供的是 .fbx / .obj / .blend / .usdz / .gltf,请让其先转换为 .glb(例如通过 Blender 导出)。
  2. 如果用户没有模型,请遵循下方的模型查找流程。
  3. 所有文件(.glb、.pptx、构建脚本)必须位于同一工作目录中。

模型查找流程(用户没有模型时)

当用户给出了主题但没有 .glb 文件时,应主动帮助其找到匹配的模型,而不只是列出网站。

第 1 步:理解主题并建议模型方向

根据用户的主题,建议适合的 3D 模型类型:

主题类型模型建议示例
产品/品牌实际产品或相似产品"咖啡品牌" → 咖啡杯、咖啡机、咖啡豆
动物/角色动物或吉祥物"狐狸吉祥物" → 狐狸 3D 模型
建筑/空间建筑、房间或结构"新办公室" → 办公楼、室内空间
交通工具交通工具本身"电动车发布" → 汽车、摩托车、自行车
食物/烹饪菜品或食材"日本料理" → 寿司拼盘、拉面碗
科技/电子设备设备本身"手机发布" → 手机、平板、笔记本电脑
自然/科学相关主体"太阳系" → 行星、太阳、地球
抽象概念象征性物体"团队合作" → 拼图、齿轮、桥梁

告诉用户:"您的主题是 [X]。我建议使用 [描述] 的 3D 模型。以下是一些可以找到此类模型的免费来源:"

第 2 步:搜索模型(由 Agent 驱动)

主动代表用户搜索模型。 不要只列出网站,而是真正找到候选模型。

搜索策略(按顺序尝试):

  1. 网络搜索与主题匹配的免费 GLB 模型:

    Search: "[topic keyword] 3d model glb free download"
    Example: "fox 3d model glb free download"
    
  2. Sketchfab API(搜索无需认证):

    curl -s "https://api.sketchfab.com/v3/search?type=models&q=[keyword]&downloadable=true&archives_flavours=glb" \
      | python3 -c "
    import json, sys
    data = json.load(sys.stdin)
    for m in data.get('results', [])[:5]:
        print(f\"Name: {m['name']}\")
        print(f\"URL: https://sketchfab.com/3d-models/{m['slug']}-{m['uid']}\")
        print(f\"Likes: {m.get('likeCount', 0)}, License: {m.get('license', {}).get('label', 'unknown')}\")
        print()
    "
    
  3. Poly Pizza(可直接下载 GLB,全部免费):

    # Search results page — parse for download links
    curl -s "https://poly.pizza/api/search/[keyword]" 2>/dev/null
    
  4. Khronos glTF-Sample-Assets(保证可用,始终可获取):

    # Direct download — no auth, no API, always works
    curl -L -o model.glb "https://raw.githubusercontent.com/KhronosGroup/glTF-Sample-Assets/main/Models/[ModelName]/glTF-Binary/[ModelName].glb"
    

    可用模型:Duck、Fox、Avocado、BrainStem、CesiumMan、DamagedHelmet、FlightHelmet、Lantern、Suzanne、WaterBottle 等。

第 3 步:向用户展示候选模型并请求确认

向用户展示 2–3 个模型选项,包括:

  • 模型名称和来源
  • 预览链接(Sketchfab URL 或说明)
  • 许可证信息
  • 该模型为何适合其主题

示例回复:

Based on your topic "fox mascot", here are some models I found:

1. Fox (Khronos sample)
   Direct download, guaranteed compatible
   Why: clean fox model, good for mascot/character decks

2. Low Poly Fox (Poly Pizza)
   URL: https://poly.pizza/m/xxx
   License: CC0 (completely free)
   Why: low-poly style, good fit for clean minimal design

3. Cartoon Fox (Sketchfab)
   URL: https://sketchfab.com/3d-models/fox-xxx
   License: CC BY 4.0 (free, commercial use ok)
   Why: expressive face, high detail

Which one do you want? I'll download it and start building.

在下载前等待用户确认。 未经询问不得下载。

第 4 步:下载已确认的模型

用户确认后,直接下载:

# For Sketchfab (if user has the download URL)
curl -L -o model.glb "[download_url]"

# For Khronos samples (always works)
curl -L -o model.glb "https://raw.githubusercontent.com/KhronosGroup/glTF-Sample-Assets/main/Models/Fox/glTF-Binary/Fox.glb"

下载完成后,进行验证:

  • 文件存在且不为空
  • 文件扩展名为 .glb
  • 文件大小小于 50MB

如果 Sketchfab 要求登录才能下载,请告诉用户:

"下载此模型需要登录 Sketchfab。你可以从页面获取 .glb 文件并分享给我。或者我可以先用 Khronos 示例模型做一个演示版本?"

第 5 步:当用户说“随便”/“你决定”/“做个演示就行”时

不要随便抓取一个模型。 首先引导用户明确 PPT 主题:

好的!模型由我来处理,但先确认一下主题方向,好让模型与内容匹配:

  1. 科技/产品:耳机、手机、机器人……
  2. 动物/角色:可爱宠物、卡通角色……
  3. 建筑/空间:建筑、室内、城市……
  4. 食物/生活方式:菜肴、日常物品……
  5. 其他:直接告诉我你的想法

请选择一个方向,或直接给我一个主题关键词。

用户确认方向后,再搜索并推荐模型。

第 6 步:当用户想自己查找模型时

提供具体的网站链接,并附上逐步指引:

推荐的 3D 模型网站:

  1. Sketchfab(最大的 3D 模型平台)
  2. Poly Pizza(全部为免费低多边形模型)
    • 链接:https://poly.pizza/
    • 全部采用 CC0 许可 — 点击 Download 即可直接获得 .glb 文件
    • 最适合:极简或卡通风格的演示
  3. Sketchfab 热门分类
  4. Free3D(通用免费模型网站)
  5. TurboSquid Free(专业模型网站的免费板块)

下载完成后,请将 .glb 文件分享给我。如果下载的是 .gltf 文件夹,请使用 Blender 将其转换为 .glb。

第 7 步:当用户提供关键词并要求 Agent 搜索时

搜索前先提醒 token 成本:

我可以帮你搜索,但网络搜索会消耗额外的 token。你希望选择哪种方式:

A. 由我搜索 — 我使用 Sketchfab API 并推荐 2-3 个选项(会消耗少量 token) B. 自助查找 — 我提供搜索链接和筛选步骤,你自行挑选后分享给我(不消耗额外 token)

选 A 还是 B?

如果用户选择 A,则继续执行第 2 步(由 Agent 驱动的搜索)。 如果用户选择 B,则继续执行第 6 步(自助指引)。

许可提醒

在确认下载前,务必提醒:“下载前请检查模型许可。CC0 / CC BY = 可免费使用;CC BY-NC = 仅限非商业用途。”


视觉设计系统(4.0 增强)

morph-ppt 提供基础设计规则。本节从 PPT Creator 中补充具体的配色方案、字体搭配和版式质量规则,为 AI 提供更丰富的变化与更可靠的约束。

配色方案(每份演示文稿选一种,或混合使用)

选择与主题氛围相匹配的配色,不要默认使用通用蓝色。

配色方案主色辅色强调色正文颜色次要/说明文字
Coral EnergyF96167(珊瑚色)F9E795(金色)2F3C7E(藏青)3333338B7E6A
Midnight Executive1E2761(藏青)CADCFC(冰蓝)FFFFFF3333338899BB
Forest & Moss2C5F2D(森林绿)97BC62(苔绿)F5F5F5(奶油色)2D2D2D6B8E6B
Charcoal Minimal36454F(炭灰)F2F2F2(米白)2121213333337A8A94
Warm TerracottaB85042(赤陶色)E7E8D1(沙色)A7BEAE(鼠尾草绿)3D2B2B8C7B75
Berry & Cream6D2E46(莓红)A26769(灰玫瑰)ECE2D0(奶油色)3D22338C6B7A
Ocean Gradient065A82(深蓝)1C7293(青蓝)21295C2B3A4E6B8FAA
Teal Trust028090(青色)00A896(海沫绿)02C39A(薄荷绿)2D3B3B5E8C8C
Sage Calm84B59F(鼠尾草绿)69A297(桉树绿)50808E2D3D357A9488
Cherry Bold990011(樱桃红)FCF6F5(米白)2F3C7E(藏青)3333338B6B6B

规则:

  • 一种颜色占主导(视觉权重 60-70%),1-2 种辅助色调,一种强调色
  • 浅色背景:正文使用正文颜色,说明文字使用次要颜色
  • 深色背景:正文使用辅色或 FFFFFF,说明文字使用次要颜色
  • 如需更多灵感,可浏览 ../morph-ppt/reference/styles/INDEX.md,其中有 50 多种视觉风格,按氛围分类(深色、浅色、暖色、鲜艳、黑白)。阅读 style.md 了解设计理念,参考 build.sh 了解实现方式。学习其思路,不要照搬坐标
字体搭配(每份演示文稿选一种)
标题字体正文字体适用场景
GeorgiaCalibri正式商务、金融
Arial BlackArial醒目营销、产品发布
CalibriCalibri Light简洁企业风、极简风
CambriaCalibri传统专业风
Trebuchet MSCalibri亲和科技风、初创企业
ImpactArial醒目标题、主题演讲
PalatinoGaramond优雅编辑风、奢侈品
ConsolasCalibri开发者工具、技术文档
硬性规则(强制执行,无例外)

H4:正文最小 16pt: 所有正文、卡片内容和项目符号文字必须 >= 16pt。"内容放不下"不是理由——应减少文字、拆分幻灯片或减少卡片数量。例外:图表坐标轴标签(<=12pt)、简短副标签(<=14pt,最多 5 个词)、脚注。

H6:深色背景对比度: 当幻灯片背景亮度 < 30%(例如 1E2761、36454F、000000)时,所有正文、卡片内容、图表标签和图标填充都必须使用白色(FFFFFF)或近白色(亮度 > 80%)。深色背景上绝不能将中灰色或暗淡色用作正文。

H7:必须包含演讲者备注: 每张内容幻灯片(非标题页或结束页)都必须包含演讲者备注。使用:

officecli add deck.pptx '/slide[N]' --type notes --prop text="..."
视觉元素检查点

每 3 张内容幻灯片,至少有 1 张必须包含非文本视觉元素:

视觉类型实现方式
彩色圆形中的图标ellipse 形状 + 居中的文字/数字叠加
彩色色块带填充的 preset=roundRect
大号统计数字size=64, bold=true,下方配小号标签
图表--type chart(柱状图/饼图/折线图)
渐变背景background=COLOR1-COLOR2-180
形状组合圆形 + 连接线构成的图示

纯文字幻灯片仅适用于:引语、代码示例、纯表格。


3D 模型插入规则

每张幻灯片都要重新添加模型,切勿克隆

morph_clone_slide 会将模型复制为冻结的 XML。被克隆的模型无法参与 Morph。 每张幻灯片都必须独立调用 add --type 3dmodel,并使用相同的 name 属性。

⚠️ 关键:如果克隆了一张已包含 3D 模型的幻灯片,旧模型的 XML 也会被一并复制。这会在新幻灯片上产生两个同名的 model3d 元素。PowerPoint 无法处理这种冲突,并会在修复过程中删除模型内容。

如果必须为场景角色克隆幻灯片,在添加新模型之前,请先立即移除克隆出的模型:

# After cloning slide 1 to slide 2:
officecli remove deck.pptx '/slide[2]/model3d[1]'  # remove the frozen clone
officecli add deck.pptx '/slide[2]' --type 3dmodel ...  # add fresh model

推荐做法:完全不要克隆包含 3D 模型的幻灯片。 先创建所有空白幻灯片,然后在每张上重新添加模型。

# Slide 1
officecli add deck.pptx '/slide[1]' --type 3dmodel \
  --prop path=model.glb --prop 'name=!!model-hero' \
  --prop x=16cm --prop y=1cm --prop width=16cm --prop height=16cm \
  --prop roty=0

# Slide 2
officecli add deck.pptx '/slide[2]' --type 3dmodel \
  --prop path=model.glb --prop 'name=!!model-hero' \
  --prop x=0.5cm --prop y=1cm --prop width=18cm --prop height=17cm \
  --prop roty=50
可控属性
属性作用说明
x, y幻灯片上的位置标准幻灯片坐标
width, height框架尺寸模型在此框架内渲染
name形状名称各幻灯片之间必须保持一致,才能实现 Morph
rotyY 轴旋转(度)主要叙事轴
rotxX 轴倾斜(度)范围 -25 到 +40。参见“镜头语言”一节
rotzZ 轴翻滚(度)很少需要
请勿手动设置
  • meterPerModelUnit — 根据 GLB 包围盒自动计算
  • preTrans — 为模型居中自动计算
  • camera 的深度/位置 — 自动计算以适配模型
  • 切勿对任何 3D 变换参数使用 raw-set

模型与内容的布局

核心原则:模型就是主角

模型应当像演示文稿的主角,而不是侧边栏装饰。 文字为模型服务;模型不应只是装饰文字。

尺寸对比规则(强制)

相邻幻灯片的模型区域面积比必须 >= 1.5 倍或 <= 0.67 倍。 面积按 width × height 计算。如果第 N 张的模型为 16×15=240 cm²,则第 N+1 张必须 >= 360 或 <= 160。

切勿在连续幻灯片上使用相近的尺寸。 这是提升视觉张力的最重要规则。

尺寸等级宽度高度面积(约)适用场景
XL(出血)28-36cm22-28cm600-1000特写,模型超出幻灯片边缘
L(主视觉)18-24cm15-19cm270-456标题页、结束页、戏剧性时刻
M(分栏)13-17cm12-16cm156-272带文字的标准内容页
S(点缀)5-10cm5-10cm25-100数据密集页,模型作为图标
版式模式(6 种)

A — 模型在右,内容在左(内容页) 内容位于 x=1-14cm。模型位于 x=15-20cm,宽度 14-18cm。

B — 模型在左,内容在右(与 A 交替使用) 模型位于 x=0-2cm,宽度 14-18cm。内容位于 x=18-32cm。

C — 模型居中,文字叠加(标题页/结束页) 模型居中且尺寸较大(18-24cm)。文字位于幻灯片顶部或底部。

D — 模型位于角落小图,内容为主(数据页) 模型为 5-10cm,位于任意角落。内容占据其余空间。

E — 模型作为背景(冲击/引语页) 模型为 XL(28-36cm),居中,并被幻灯片边缘部分裁切。 文字直接叠加在模型区域上,使用高对比度颜色。 模型成为“画布”,文字位于模型所占空间之内。

# Pattern E: model fills slide as backdrop
officecli add deck.pptx '/slide[N]' --type 3dmodel \
  --prop path=model.glb --prop 'name=!!model-hero' \
  --prop x=-2cm --prop y=-2cm --prop width=38cm --prop height=24cm \
  --prop roty=45 --prop rotx=10

# Text overlaid on model
officecli add deck.pptx '/slide[N]' --type shape \
  --prop 'name=#sN-quote' --prop text="Key insight here" \
  --prop x=3cm --prop y=7cm --prop width=28cm --prop height=5cm \
  --prop size=44 --prop bold=true --prop color=FFFFFF --prop fill=none

F — 模型出血边缘(过渡/预告页) 模型部分移出屏幕之外(x 或 y 为负值,或 x+width > 33.87cm)。 只可见模型的一部分,暗示画面之外还有更多内容。

# Pattern F: model bleeds off right edge
officecli add deck.pptx '/slide[N]' --type 3dmodel \
  --prop path=model.glb --prop 'name=!!model-hero' \
  --prop x=20cm --prop y=-1cm --prop width=24cm --prop height=22cm \
  --prop roty=70
版式递进

同一版式不得在连续幻灯片上重复使用。示例:

Slide 1: C (centered hero, L)
Slide 2: E (backdrop close-up, XL)   ← 1.5x+ area jump
Slide 3: A (model right, M)          ← pull back
Slide 4: F (bleed edge, L)           ← push in
Slide 5: D (small corner, S)         ← dramatic pull back
Slide 6: B (model left, M)           ← grow
Slide 7: C (centered closing, L)     ← push in
文本版式安全(必须遵守)

文本框不得相互重叠,也不得与模型框重叠。

规则:

  1. 标题与正文不得冲突。 如果标题换行为 2 行,正文的 y 值必须考虑标题的实际高度,而非计划高度。安全公式:body_y = title_y + title_height + 0.5cm
  2. 固定高度的文本框具有风险。 如果文本内容超出预期长度,将会不可见地溢出。请使用充足的高度:标题 3-4cm,正文 6-8cm,项目符号 8-10cm。
  3. 模型框与文本框之间的间距 >= 1cm。 计算方式:若模型位于 x=15cm,则文本的 x + width 必须 <= 14cm。
  4. 在 C 版式(模型居中 + 文字叠加)中: 文字应放在幻灯片顶部(y=0.5-2cm)或底部(y=14-17cm),而不要放在模型所在的垂直中部(y=3-13cm)。
  5. 每张幻灯片制作完成后,核对坐标:
    officecli get deck.pptx '/slide[N]' --depth 1
    # Check: no two shapes share overlapping x/y/width/height ranges
    
模型出血指南

并非每个模型被裁切后都好看。 出血(E/F 版式)最适合以下情况:

  • ✅ 对称物体(球体、头盔、瓶子)——任何裁切方式看起来都很有意图
  • ✅ 大型平面物体(汽车、建筑)——局部视图暗示尺度
  • ✅ 裁切的是非关键部分(背景、底座、支架)

出血不适合以下情况:

  • ❌ 角色/动物模型——裁掉耳朵、尾巴或四肢会显得残缺
  • ❌ 小型精细模型——裁切会丢失想要展示的细节
  • ❌ 被裁切的部分恰恰是最具辨识度的特征

对于角色/动物模型(如狐狸、鸭子、牛油果): 在所有幻灯片上保持模型完整可见。使用尺寸变化(L→M→S)来营造节奏,而不是出血裁切。改用 rotx 来获得角度变化。


镜头语言

三种工具协同工作:roty(环绕)、rotx(俯仰)、width/height(缩放)。

镜头类型(每套演示文稿需使用 >= 3 种不同类型)
镜头尺寸rotx适用场景
建立镜头L(18-24cm)0-5标题、引言、结束页
四分之三侧面展示L(16-20cm)5-10主视觉、第一印象
特写XL(28-36cm),裁切0-10功能重点、细节
俯视M(13-17cm)25-40结构、概览
仰视L(16-20cm)-15 至 -25力量感、戏剧性
侧面轮廓M(13-16cm)0外形、剪影
过肩镜头S(5-10cm)10-15数据密集型,模型作为点缀
Content-Driven Camera

让镜头与幻灯片内容相匹配:

  • "Front design" → 特写,roty=0,XL 裁切
  • "Side profile" → 侧面,roty=90,M
  • "Internal structure" → 俯视,roty=30, rotx=35,M
  • "Power/authority" → 仰视,roty=20, rotx=-20,L
  • "Data & specs" → 过肩视角,roty=60,S 置于角落
Rotation Rules
  1. 相邻 roty 差值:30-90°(< 30 会抖动,> 90 会让人迷失方向)
  2. 整体 roty 方向必须保持一致(不要来回切换)
  3. rotx 范围:-25 至 +40。相邻 rotx 差值 <= 20
  4. 全部幻灯片的总环绕角度:180-360°(从各个方向展示模型)
Example Shot Plan
SlideShotrotyrotxSizePattern
1三四分之一正面主视图308L 20×17C
2特写05XL 30×24E
3侧面800M 15×14A
4俯视12035M 14×13B
5仰视170-20L 20×18F
6过肩视角22010S 8×7D
7全景建立镜头3205L 20×17C

Workflow Integration with morph-ppt

Phase 2 additions (Planning)

在 brief.md 中添加一个 Model Choreography Table:

SlidePatternSize TierModel x,y,w,hrotyrotx
1CL7,0.5,20,17308
2EXL-2,-2,38,2405
..................

进入构建阶段前,验证面积比规则(相邻行之间 >= 1.5 倍)。

Phase 3 additions (Build)

由于模型无法克隆,构建脚本与标准 morph-ppt 有所不同:

  1. 先创建所有幻灯片(设置背景并添加 morph 过渡)
  2. 在第 1 张幻灯片上添加场景演员(!!scene-*),然后克隆幻灯片以保持 morph 连续性
  3. 在每张幻灯片上重新添加 3D 模型(名称相同,roty/位置不同)
  4. 为每张幻灯片添加内容形状,并让前一张的内容以幽灵形式保留
model_positions = [
    {"slide": 1, "x": "7cm",  "y": "0.5cm", "w": "20cm", "h": "17cm", "roty": 30},
    {"slide": 2, "x": "-2cm", "y": "-2cm",  "w": "38cm", "h": "24cm", "roty": 0},
    {"slide": 3, "x": "16cm", "y": "1cm",   "w": "15cm", "h": "14cm", "roty": 80},
    # ...
]
for pos in model_positions:
    run("officecli", "add", OUTPUT, f"/slide[{pos['slide']}]", "--type", "3dmodel",
        "--prop", f"path={MODEL}", "--prop", "name=!!model-hero",
        "--prop", f"x={pos['x']}", "--prop", f"y={pos['y']}",
        "--prop", f"width={pos['w']}", "--prop", f"height={pos['h']}",
        "--prop", f"roty={pos['roty']}")
Phase 4 additions (Verification)

完成标准 morph 验证后,还需额外检查:

  • 每张幻灯片恰好包含一个 model3d 元素
  • 所有模型的 name 属性相同
  • 相邻幻灯片的模型面积比 >= 1.5 或 <= 0.67
  • 没有两张连续的幻灯片使用相同的布局模式

File Placement Rule

所有文件必须位于同一工作目录中。

交付物(恰好 4 个文件,不多不少):

  • .glb 模型文件(deck 中使用的 3D 模型)
  • 输出的 .pptx
  • 构建脚本(可重复运行)
  • brief.md

不要创建额外文件,例如 outline.md、quality-report.md、test-report.md 等。所有规划内容写入 brief.md,所有验证输出打印到标准输出。多余文件会让用户困惑。

不要把模型文件分散放到无关的路径中。

评论

支持 Markdown