Summary
把二维平面足以展示的物理教学场景(力学、热学、电磁学、光学、原子物理、振动与波、近代物理) 做成交互教学网页:左栏题面 + 动态控制台(一个滑块驱动的实时物理量读数 + 守恒定律恒等式指示/ 状态判定),中栏 KaTeX 分步解析,右栏 2D Canvas 动态物理画板(轨迹/质点/矢量/波形/能量条/ 光线 +…
liangdabiao/edulab · Archived
>- 把二维平面足以展示的物理教学场景(力学、热学、电磁学、? 做成交互教学网页:左栏题面 + 动态控制台(一个滑块驱动的实时物理量读数 + 守恒定律恒等式指示/ 状态判定),中栏 KaTeX 分步解析,右栏 2D Canvas 动态物理画板(轨迹/质点/矢量/波形/能量条/ ? 实现交互。形态与 edu-plane-geometry 平行,但面向物理场景而非纯几何。 三维物理(洛伦? 触发词:物理, 力学, 抛体运动, 动量守恒, 能量守恒, 简谐振动, 机械波, 电场, 磁场, 电磁感应, 折射, 反射, 干涉, 衍射, 气体状态方程, 热力学, 原子物理, 相对论, 核物理 交互教学; …
npx skills add liangdabiao/edulab --skill edu-physics
把二维平面足以展示的物理教学场景(力学、热学、电磁学、光学、原子物理、振动与波、近代物理) 做成交互教学网页:左栏题面 + 动态控制台(一个滑块驱动的实时物理量读数 + 守恒定律恒等式指示/ 状态判定),中栏 KaTeX 分步解析,右栏 2D Canvas 动态物理画板(轨迹/质点/矢量/波形/能量条/ 光线 +…
This repository is archived — consider an actively maintained alternative.
>- 把一道立体几何题解成一个自? 右侧 Three.js 可交互 3D 模型(分步高亮 + 镜头切换)。支持三种? …
3 installs>- 科学可视化科普技能:把任何数学或科学概念(日食、月食、太阳系、四季、月相、潮汐、 卫星轨道、…
3 installsRelated neighbors and high-traction skills in the same topics — useful to compare before installing.
Official NVIDIA-authored guidance for navigating PhysicsNeMo — pick the model, datapipe, or exa…
1.8K installsTune game physics for stable, good-feeling motion — fixed vs variable timestep, render interpol…
2.5K installsUse Godot 4.7 physics bodies and detection in 2D and 3D: RigidBody, StaticBody, Area, and Chara…
2.2K installsSet up 3D physics in Unity 6.3 LTS: Rigidbody movement and forces, colliders, triggers vs colli…
2K installsUse Phaser 4 Arcade Physics: enable the world, give sprites bodies, set velocity/acceleration/g…
2K installsPhysics-based animation library combining React Spring (spring dynamics, gesture integration, 6…
1.9K installsOther skills from liangdabiao/edulab.
npx skills add liangdabiao/edulab
Declared targets from SKILL.md / docs. Unmarked agents are not listed — the skill may still install via the CLI.
master
Parsed from SKILL.md frontmatter.
Files included with this skill beyond the listing page.
SKILL.md
13,849 B
SUMMARY.md
1,228 B
一个可直接用浏览器打开的单页 HTML(三栏):
重算的物理量(位置、速度、加速度、能量、动量…),以及"恒等式指示"(守恒定律)或"状态判定"。
网格坐标轴),叠加画笔涂鸦工具栏。
本技能(edu-physics)覆盖二维平面即足以展示的物理场景。凡是物理量/方向/轨迹涉及三维空间、 需要从任意角度观察的,请使用独立的 edu-physics-3d 技能(Three.js 三维画板)。
| 场景 | 使用技能 | 原因 |
|---|---|---|
| 抛体运动、简谐振动、波 | edu-physics | 2D 完全够用 |
| 斜面滑块、碰撞、圆周运动 | edu-physics | 平面内运动 |
| 电场线、等势面、电路 | edu-physics | 平面场分布 |
| 气体状态变化、热力学循环 | edu-physics | PV 图平面 |
洛伦兹力 F=qv×B |
edu-physics-3d | 叉积方向垂直于平面,必须 3D |
| 右手定则可视化 | edu-physics-3d | 力的方向垂直于 v 和 B 平面 |
| 原子轨道形状 | edu-physics-3d | s/p/d 轨道是三维空间分布 |
| 晶体结构/晶格 | edu-physics-3d | 三维空间排列 |
| 刚体旋转/角动量 | edu-physics-3d | 旋转轴在三维空间 |
| 电磁波 E/B 正交 | edu-physics-3d | 两场在三维空间正交传播 |
| 磁场(螺线管) | edu-physics-3d | 场线在三维空间分布 |
edu-physics 输出 2D Canvas 单页 HTML;edu-physics-3d 输出 Three.js 3D 单页 HTML。 两者数据岛格式不同(board vs board3d),详见各自 SKILL.md。
无外部依赖(不需要物理引擎、不需要 sympy)。模板引擎 template/board.html 是自包含的单页 HTML。只要能用 Python 3(标准库即可)做字符串替换就行,或者直接用 JSON 手动注入。
明确:
这是最关键的一步。选取方便的系统坐标,写出物理量的参数化表达式。
坐标放置技巧:
物理量构造模式:
| 场景 | 坐标方案 | scalars 序列 |
|---|---|---|
| 抛体运动 | 原点在抛出点 | vx=v₀cosθ, vy=v₀sinθ-gt, x=vx·t, y=vy·t-½gt² |
| 简谐振动 | 平衡位置在原点 | x=A·cos(ωt+φ), v=-Aω·sin(ωt+φ), a=-Aω²·cos(ωt+φ) |
| 斜面滑块 | 斜面沿 x 轴 | a=g(sinθ-μcosθ), v=at, s=½at² |
| 动量守恒 | 同一直线 | v1'=(m1-m2)v1/(m1+m2), v2'=2m1v1/(m1+m2) |
验证物理正确性(心算检查):
viewport 范围:留 10-15% 边距,确保完整运动轨迹在画板可见。
📍 输出位置 & 唯一产物:交付给用户的只有一个
.html,写到**当前工作目录
(Path.cwd())**。cwd 里不要留任何别的文件——构建脚本(.py)、pycache、截图等
临时文件一律放/tmp或用完即删。也绝不要写进技能自身目录。
数据格式(三段式 JSON,schema 见 template/board.html 数据岛 __LESSON_DATA__):
{
"lesson": {
"language": "zh-CN",
"title": "页面标题",
"problem": "<p>题面 HTML,公式用 $…$ / $$…$$</p>",
"answer": "$E_k+E_p = \\text{const}$"
},
"steps": [
{ "title": "步骤一", "content": "<p>解析内容...</p>" },
],
"board": {
"view": { "xRange": [-1, 10], "yRange": [-1, 6] },
"points": {
"O": [0, 0],
"P": ["v0*cos(theta*PI/180)*t", "v0*sin(theta*PI/180)*t-0.5*g*t*t"],
// 速度矢量箭头末端 = 当前位置 + 速度方向(缩放),用表达式点驱动
"Vtip": ["x+vx*0.3", "y+vy*0.3"]
},
"param": {
"name": "t",
"label": "时间 $t$ (s)",
"min": 0, "max": 5, "step": 0.05,
"value": 0, "unit": "s",
"ticks": ["0", "2.5", "5"]
},
"scalars": [
{ "name": "v0", "expr": "10" },
{ "name": "theta", "expr": "45" },
{ "name": "g", "expr": "9.8" },
{ "name": "vx", "expr": "v0*cos(theta*PI/180)" },
{ "name": "vy", "expr": "v0*sin(theta*PI/180)-g*t" },
{ "name": "x", "expr": "vx*t" },
{ "name": "y", "expr": "vy*t-0.5*g*t*t" },
{ "name": "Ek", "expr": "0.5*(vx*vx+vy*vy)" },
{ "name": "Ep", "expr": "g*y" },
{ "name": "E", "expr": "Ek+Ep" }
],
"derived": [
// 质点 P(points 里定义的点默认按浅灰渲染;这里用 vector 叠加箭头更醒目)
// 位移矢量:从原点指向质点
{ "type": "vector", "name": "r_vec", "from": "O", "to": "P", "color": "vecA", "label": "$\\vec{r}$" },
// 速度矢量:从质点 P 指向 Vtip(随速度方向变化的箭头)
{ "type": "vector", "name": "v_vec", "from": "P", "to": "Vtip", "color": "vec", "label": "$\\vec{v}$" },
],
"readouts": [
{ "id": "x", "label": "水平位移 $x$", "type": "expr", "expr": "x", "digits": 2, "color": "vecA" },
{ "id": "y", "label": "竖直位移 $y$", "type": "expr", "expr": "y", "digits": 2, "color": "vecB" },
{ "id": "vx", "label": "$v_x$", "type": "expr", "expr": "vx", "digits": 2, "color": "vecA" },
{ "id": "vy", "label": "$v_y$", "type": "expr", "expr": "vy", "digits": 2, "color": "vecB" },
{ "id": "Ek", "label": "$E_k = \\frac{1}{2}mv^2$", "type": "expr", "expr": "Ek", "digits": 2 },
{ "id": "Ep", "label": "$E_p = mgy$", "type": "expr", "expr": "Ep", "digits": 2 },
{ "id": "E", "label": "$E = E_k+E_p$", "type": "expr", "expr": "E", "digits": 4, "highlight": true }
],
// 定值指示(机械能守恒)—— of 指向上面 readouts 里真实存在的 id "E"
"constant": { "of": "E", "label": "$E_k+E_p \\equiv \\text{常数}$" },
// trace 轨迹
"trace": { "of": "P", "color": "locus" },
// 图例
"legend": [
{ "color": "locus", "text": "轨迹" },
{ "color": "vec", "text": "速度 $\\vec{v}$" },
]
}
}
构建脚本方法(Python,推荐): 将构建脚本放 /tmp,直接做字符串替换:
#!/usr/bin/env python3
import json, sys
from pathlib import Path
sys.dont_write_bytecode = True
SKILL_DIR = Path(".claude/skills/edu-physics")
TEMPLATE = SKILL_DIR / "template" / "board.html"
PLACEHOLDER = "__LESSON_DATA__"
data = {
"lesson": { ... },
"steps": [ ... ],
"board": { ... }
}
template = TEMPLATE.read_text(encoding="utf-8")
out_path = Path.cwd() / "solution-xxx.html"
out_path.write_text(
template.replace(PLACEHOLDER, json.dumps(data, ensure_ascii=False)),
encoding="utf-8"
)
print("written:", out_path)
python3 -B /tmp/build.py && rm -f /tmp/build.py
注:如果运行时提示
template/board.html路径不对,请使用绝对路径或从Path(file)推导。
- 滑块拖动时质点沿预期轨迹运动 - trace 轨迹曲线正确(抛体为抛物线、SHM 为正弦等) - 矢量方向/大小随参数正确变化 - constant 指示器全程恒定显示
/tmp 中的临时脚本,确认 cwd 只有 .html| 字段 | 类型 | 说明 |
|---|---|---|
view |
{xRange, yRange} |
数学坐标视窗 |
points |
{name: [x,y] 或 {xy,color,label}} |
关键位置坐标 |
param |
{name, min, max, step, value, label, unit, ticks} |
滑块定义 |
scalars |
[{name, expr}] |
由 param 派生的物理量 |
derived |
构造序列 | point / vector / segment / polygon 等 |
readouts |
[{id, label, type, ...}] |
实时物理量数值 |
constant |
{of, label} |
守恒定律指示器 |
trace |
{of, color} |
轨迹采样(160步) |
legend |
[{color, text}] |
图例 |
| type | 字段 | 显示内容 |
|---|---|---|
expr |
expr, digits |
任意物理量表达式 |
distance |
a,b (点) |
两点距离 |
coord |
of (点) |
坐标 |
status |
expr, rhs, okText, badText |
布尔状态判定(如"超重"/"失重") |
注意:质点位置在
points里定义后会自动渲染(默认浅灰);如需改变颜色/标签,
在points里用{xy, color, label}形式声明,而不是用 derived 的point(该 type 未实现)。
速度/力矢量随质点变化时,常用做法:在points里定义一个"箭头末端"点(坐标用表达式),
再用vector从质点指向它(见上面抛体示例的Vtip)。
| type | 字段 | 效果 |
|---|---|---|
segment |
name, a, b, color, dashed |
线段(光线/电场线/边界) |
vector |
name, from, to, color, label |
位移/力/场强矢量(name 必填) |
polygon |
pts, color, stroke |
半透明填充(能量条/区域) |
midpoint |
name, a, b |
中点 |
linethroughpoints |
name, a, b, color |
过两点直线 |
linethroughslope |
name, point, slope, color |
过一点斜率直线 |
curve(金黄) · line(青) · aux(灰辅助) · ptA(红) · ptB(蓝) · point(浅灰) · given(紫) · fixed(翠绿) · vecA(红) · vecB(蓝) · locus(轨迹紫红) · area(青半透明)。 也可直接写 hex:#f87171 或 rgba(248,113,113,0.25)。
坐标值/scalars 中的 expr 支持:+ - / ^ sqrt cbrt abs sin cos tan asin acos atan atan2 exp log pow min max sign floor ceil hypot PI 三角函数使用弧度(角度需先转换:thetaPI/180)。 参数名须是合法 JS 标识符(如 t/v0/theta,不能用 θ 等非标识符)。
课程正文(lesson.problem、steps[].content)及图例(legend[].text)中的 KaTeX 公式 使用 $...$(行内)或 $$...$$(块级)包裹。
已知不兼容命令:
\\prescript — KaTeX 不支持 mathtools 包的 \\prescript 命令。✅ 改用 {}^{<上标>}{<下标>}\\text{<基>},如: $\\left({}^{4}{2}\\text{He}^{2+}\\right)$ → $\left({}^{4}_{2}\text{He}^{2+}\right)$
在 board 中配置 trace: { of: "点名称", color: "颜色" } 后,引擎在 param 的 [min, max] 区间 均匀采样 160 步,对指定点绘制轨迹路径。适用于:
配置 constant: { of: "读数id", label: "标签" } 后,当读数值随滑块变化恒为定值时, 页面显示绿色横幅提示。适用于:
Eₖ+Eₚ 恒定)m₁v₁+m₂v₂ 恒定)a²+b²-c²≡0)template/board.html — 数据驱动模板(通用 2D 渲染器 + 参数引擎 + 数据岛 __LESSON_DATA__)references/conventions.md — 物理交互范式、构造模式、自检清单examples/ — 范例参考