- name
- morph-ppt-3d
- display_name
- 3D Morph 动效 PPT
- description
- **做带 3D 模型的 Morph 动效 PPT**:插入 .glb 三维模型、电影级镜头运动、模型与内容混排。纯 2D 的 Morph 动效请用 `morph-ppt`。 3D Morph PPT — extends morph-ppt with GLB model insertion, cinematographic camera, model-content layout, and enriched visual design system.
- tags
- pptx, presentation, morph, 3d, glb, officecli
# Morph PPT — 3D Extension
This skill **extends** `morph-ppt`. All morph-ppt rules (naming, ghosting, design, verification) apply in full.
This file covers **3D-specific additions** and an **enriched design system** combining morph-ppt aesthetics with concrete color palettes, font pairings, and layout quality guardrails.
---
## 运行环境与交付链(本系统专用,先读这一段)
**`officecli` 已经预装在运行环境的 PATH 中,不要联网安装、不要 curl。**
`Bash` 工具直接调用即可,自检用 `officecli --version`。
所有命令在当前会话工作目录执行,输入输出使用相对路径或用户指定的真实路径。一次完整作业 = 3 步 + 1 步交付:
```
# Step 1(仅当用户上传过原始文件)把 artifact 送进沙盒
sandbox_put_artifact(artifact_id="<用户文件的 file_id>", dest_path="./in.docx")
# Step 2 用 Bash 跑 officecli —— 本文件下面讲的全部命令都在这一步里
Bash("officecli create ./out.docx")
# Step 3 把成稿从沙盒取出、登记成 artifact,拿到新的 file_id
sandbox_get_artifact(src_path="./out.docx", name="终稿.docx")
# Step 4(必做)交付给用户
pin_to_workspace(file_ids=["<新 file_id>"])
```
**铁律**:
- `sandbox_put_artifact` = 放**进**沙盒,`sandbox_get_artifact` = 从沙盒**取出**,别搞反;两个路径参数使用当前工作目录内的相对路径或真实绝对路径。
- 拿到 `file_id` 却不 `pin_to_workspace` 就等于没交付,用户看不到文件。多个产物一次性放进同一个列表,别分多次调用。
- 下文示例里的 `$FILE` 指实际文件;相对路径按当前会话工作目录解析。
- 下文的可视化质检(`view <file> screenshot` / `view <file> html`)依赖沙盒内的 Chromium,镜像已预装;截图失败就按下文 fallback 走 `view html`,并如实标注「未做视觉验证」,不要谎报 PASS。
- **导出 PDF 不要用 `officecli view <file> pdf`** —— 那个模式依赖本系统没有安装的 exporter 插件,必然失败。改用沙盒里的 LibreOffice:
`soffice --headless --convert-to pdf --outdir . ./out.docx`。.xlsx / .pptx 换掉扩展名同理,但要沙盒里装了 LibreOffice Calc / Impress 才转得动;转换报错就如实告诉用户 PDF 没导出成功、主产物仍是原文件,不要谎报已导出。
## Use when
- User wants a `.pptx` with a `.glb` 3D model and Morph transitions.
---
## 3D Model Compatibility Gate (before generation)
1. Only `.glb` is supported. If user provides `.fbx` / `.obj` / `.blend` / `.usdz` / `.gltf`, ask them to convert to `.glb` first (e.g. via Blender export).
2. If user has no model, follow the **Model Discovery Flow** below.
3. All files (`.glb`, `.pptx`, build script) must be in the same working directory.
---
## Model Discovery Flow (when user has no model)
When the user gives a topic but no `.glb` file, **proactively help them find a matching model** instead of just listing websites.
### Step 1: Understand the topic and suggest model direction
Based on the user's topic, suggest what kind of 3D model would work:
| Topic type | Model suggestion | Example |
| ------------------ | ----------------------------------- | ----------------------------------------------------- |
| Product/brand | The actual product or a similar one | "coffee brand" → coffee cup, coffee machine, bean |
| Animal/character | The animal or mascot | "fox mascot" → fox 3D model |
| Architecture/space | Building, room, or structure | "new office" → office building, interior |
| Vehicle/transport | The vehicle itself | "EV launch" → car, motorcycle, bicycle |
| Food/cooking | The dish or ingredient | "Japanese food" → sushi platter, ramen bowl |
| Tech/gadget | The device | "phone launch" → phone, tablet, laptop |
| Nature/science | The subject | "solar system" → planet, sun, earth |
| Abstract concept | A symbolic object | "teamwork" → puzzle pieces, gears, bridge |
Tell the user: "Your topic is [X]. I suggest using a 3D model of [description]. Here are some free sources to find one:"
### Step 2: Search for models (agent-driven)
**Proactively search for models on behalf of the user.** Don't just list websites — actually find candidates.
**Search strategy (try in order):**
1. **Web search** for free GLB models matching the topic:
```
Search: "[topic keyword] 3d model glb free download"
Example: "fox 3d model glb free download"
```
2. **Sketchfab API** (no auth needed for search):
```bash
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** (direct GLB download, all free):
```bash
# Search results page — parse for download links
curl -s "https://poly.pizza/api/search/[keyword]" 2>/dev/null
```
4. **Khronos glTF-Sample-Assets** (guaranteed to work, always available):
```bash
# 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"
```
Available models: Duck, Fox, Avocado, BrainStem, CesiumMan, DamagedHelmet, FlightHelmet, Lantern, Suzanne, WaterBottle, etc.
### Step 3: Present candidates to user for confirmation
Show the user 2-3 model options with:
- Model name and source
- Preview link (Sketchfab URL or description)
- License info
- Why this model fits their topic
Example response:
```
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.
```
**Wait for user confirmation before downloading.** Do not download without asking.
### Step 4: Download the confirmed model
After user confirms, download directly:
```bash
# 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"
```
After download, verify:
- File exists and is not empty
- File extension is `.glb`
- File size is under 50MB
If Sketchfab requires login to download, tell the user:
> "This model requires a Sketchfab login to download. You can grab the .glb file from the page and share it with me. Or I can use a Khronos sample model for a demo version first?"
### Step 5: When user says "anything" / "you decide" / "just make a demo"
**Don't just grab a random model.** First guide the user to clarify their PPT topic:
> Sure! I'll handle the model — but let me confirm the topic direction first so the model matches the content:
>
> 1. Tech/Product — headphones, phone, robot...
> 2. Animal/Character — cute pet, cartoon character...
> 3. Architecture/Space — building, interior, city...
> 4. Food/Lifestyle — dishes, everyday objects...
> 5. Other — just tell me your idea
>
> Pick a direction, or just give me a topic keyword.
After user confirms a direction, THEN search and recommend models.
### Step 6: When user wants to find models themselves
Give specific website links with step-by-step guidance:
> **Recommended 3D model websites:**
>
> 1. **Sketchfab** (largest 3D model platform)
> - Link: https://sketchfab.com/search?q=[keyword]&type=models&downloadable=true
> - Filter steps: search keyword → check "Downloadable" → format "glTF" → sort by "Likes"
> - When downloading, select **glTF (.glb)** format
> - Note: some models require free registration to download
> 2. **Poly Pizza** (all free low-poly)
> - Link: https://poly.pizza/
> - All CC0 licensed — click Download to get .glb directly
> - Best for: minimalist or cartoon-style presentations
> 3. **Sketchfab popular categories**
> - Animals: https://sketchfab.com/search?q=animal&type=models&downloadable=true
> - Food: https://sketchfab.com/search?q=food&type=models&downloadable=true
> - Tech: https://sketchfab.com/search?q=gadget&type=models&downloadable=true
> - Architecture: https://sketchfab.com/search?q=architecture&type=models&downloadable=true
> 4. **Free3D** (general free model site)
> - Link: https://free3d.com/3d-models/glb
> - Note: check the license type before use
> 5. **TurboSquid Free** (pro model site free section)
> - Link: https://www.turbosquid.com/Search/3D-Models/free/glb
>
> After downloading, share the .glb file with me. If the download is a .gltf folder, use Blender to convert it to .glb.
### Step 7: When user gives keywords and asks agent to search
**Remind about token cost before searching:**
> I can search for you, but web searches use extra tokens. Would you prefer:
>
> A. I search — I use the Sketchfab API and recommend 2-3 options (uses a few tokens)
> B. Self-service — I give you search links and filter steps, you pick and share with me (no extra tokens)
>
> A or B?
If user chooses A, proceed with Step 2 (agent-driven search).
If user chooses B, proceed with Step 6 (self-service guidance).
### License reminder
Always remind before confirming download: "Please check the model license before downloading. CC0 / CC BY = free to use; CC BY-NC = non-commercial only."
---
## Visual Design System (4.0 enrichment)
morph-ppt provides the base design rules. This section adds **concrete palettes, font pairings, and layout quality rules** from PPT Creator to give the AI more variety and stronger guardrails.
### Color Palettes (pick one per deck, or blend)
Choose a palette that matches the **topic mood** — don't default to generic blue.
| Palette | Primary | Secondary | Accent | Body Text | Muted/Caption |
| ---------------------- | --------------------- | --------------------- | ---------------- | --------- | ------------- |
| **Coral Energy** | `F96167` (coral) | `F9E795` (gold) | `2F3C7E` (navy) | `333333` | `8B7E6A` |
| **Midnight Executive** | `1E2761` (navy) | `CADCFC` (ice blue) | `FFFFFF` | `333333` | `8899BB` |
| **Forest & Moss** | `2C5F2D` (forest) | `97BC62` (moss) | `F5F5F5` (cream) | `2D2D2D` | `6B8E6B` |
| **Charcoal Minimal** | `36454F` (charcoal) | `F2F2F2` (off-white) | `212121` | `333333` | `7A8A94` |
| **Warm Terracotta** | `B85042` (terracotta) | `E7E8D1` (sand) | `A7BEAE` (sage) | `3D2B2B` | `8C7B75` |
| **Berry & Cream** | `6D2E46` (berry) | `A26769` (dusty rose) | `ECE2D0` (cream) | `3D2233` | `8C6B7A` |
| **Ocean Gradient** | `065A82` (deep blue) | `1C7293` (teal) | `21295C` | `2B3A4E` | `6B8FAA` |
| **Teal Trust** | `028090` (teal) | `00A896` (seafoam) | `02C39A` (mint) | `2D3B3B` | `5E8C8C` |
| **Sage Calm** | `84B59F` (sage) | `69A297` (eucalyptus) | `50808E` | `2D3D35` | `7A9488` |
| **Cherry Bold** | `990011` (cherry) | `FCF6F5` (off-white) | `2F3C7E` (navy) | `333333` | `8B6B6B` |
**Rules:**
- One color dominates (60-70% visual weight), 1-2 supporting tones, one accent
- On light backgrounds: use Body Text color for copy, Muted for captions
- On dark backgrounds: use Secondary or `FFFFFF` for copy, Muted for captions
- For additional inspiration, browse `../morph-ppt/reference/styles/INDEX.md` — 50+ visual styles organized by mood (dark, light, warm, vivid, bw). Read `style.md` for design philosophy, `build.sh` for implementation reference. **Learn the approach, do not copy coordinates verbatim**
### Font Pairings (pick one per deck)
| Header Font | Body Font | Best For |
| ------------ | ------------- | -------------------------------- |
| Georgia | Calibri | Formal business, finance |
| Arial Black | Arial | Bold marketing, product launches |
Ver en GitHub