教师出题指南
本文面向老师,说明如何用场景编辑器制作一个 3D 编程闯关关卡。
1. 打开编辑器
- 直接访问:
https://3d.lebiantiku.com/editor - 编辑已有:
https://3d.lebiantiku.com/editor?token=<关卡token> - 机构老师也可以从机构端「教学后台 → 3D 编程闯关」进入,或在关卡列表中点击「编辑」。
提示:读取与保存关卡都需要登录;保存还需要具备关卡管理权限。
2. 编辑器界面
编辑器左侧是实时 3D 预览,右侧是表单,分为几个页签:
| 页签 | 用途 |
|---|---|
| 关卡信息 | 关卡 token、名称、排序、前置关卡 ID、是否启用、介绍与提示 |
| 图元 | 新增立方体 / 球体 / 圆柱 / 圆锥 / 平面 / 目标标记 / 外部模型 |
| 物体 | 编辑每个物体的 id、名称、静态与否、位置、旋转、缩放、颜色(模型还可填 URL),以及删除 |
| 场景 | 场景版本、相机位置与注视点、光照 |
| 判定规则 | 组合逻辑与若干判定条件 |
| 导出 JSON | 查看并复制 scene_json / check_rule_json |
- 新增的图元默认加入「可移动物体」(spawnObjects),即受程序控制;在「物体」页把「静态」打开即可变为布景。
- 「目标标记」会以一块静态细扁方块加入场景(objects),常用于 collision 判定。
- 「外部模型」会加入一个
model类型物体,默认指向内置示例模型,可在「物体」页修改模型 URL(GLB / GLTF)。模型加载失败会自动降级为立方体,不会阻断关卡。
3. scene_json 结构
{
"scene_version": 1,
"camera": { "pos": [10, 10, 14], "lookAt": [0, 0.5, 0] },
"lights": [
{ "type": "ambient", "color": "#ffffff", "intensity": 0.75 },
{ "type": "directional", "color": "#ffffff", "intensity": 1.2, "position": [8, 14, 10] }
],
"objects": [
{ "id": "ground", "name": "地面", "type": "plane", "isStatic": true,
"position": [0, 0, 0], "rotation": [0, 0, 0], "scale": [16, 1, 16], "color": "#2b3a55" }
],
"spawnObjects": [
{ "id": "robot", "name": "机器人", "type": "cube", "isStatic": false,
"position": [-4, 0.5, 3], "rotation": [0, 0, 0], "scale": [1, 1, 1], "color": "#4a90d9" }
]
}
字段说明:
objects:静态布景(默认静止,脚本不可修改);spawnObjects:动态物体(可被脚本 / 拖拽操作)。type取值:cube/sphere/cylinder/cone/plane,以及外部模型model(模型需额外提供url)。position/rotation(角度制)/scale均为长度为 3 的数组。color形如#rrggbb。- 物理:在 scene_json 顶层增加
"physics": { "enabled": true, "gravity": [0, -9.82, 0] }即对本关启用物理模拟——动态物体会受重力影响下落、与静态物体碰撞并停在上面。该字段目前需直接写在 scene_json 中(编辑器暂未提供可视化开关)。物理为按需加载,未启用时不会加载物理引擎。
4. check_rule_json 结构
{
"logic": "AND",
"conditions": [
{ "type": "position", "objId": "robot", "target": [4, 0.5, -3], "tolerance": 0.8 },
{ "type": "rotation", "objId": "robot", "axis": "y", "target": 90, "tolerance": 5 },
{ "type": "color", "objId": "robot", "target": "#00ff00", "tolerance": 24 },
{ "type": "collision", "objId": "robot", "targetObjId": "goal", "tolerance": 0.1 },
{ "type": "count", "objId": "*", "scope": "dynamic", "target": 3 }
]
}
logic:AND(全部满足,默认)或OR(满足任一)。- 判定条件为空时视为不通过。
五类判定条件与默认容差
| 类型 | 含义 | 关键字段 | 默认容差 |
|---|---|---|---|
position |
物体位置到达目标点(三维距离 ≤ 容差) | objId、target:[x,y,z] |
0.8 |
rotation |
绕某轴旋转到目标角度(考虑 360° 环绕) | objId、axis(x/y/z)、target(度) |
5 |
color |
物体颜色匹配(逐通道最大差值 ≤ 容差) | objId、target(#rrggbb) |
24 |
collision |
两物体碰撞(中心距离 ≤(半径之和 ×(1+容差))) | objId、targetObjId |
0.1 |
count |
物体数量达标 | scope(all/dynamic)、target(整数) |
0 |
提示:条件里的
tolerance可留空表示使用上表默认值;数值越小要求越精确。碰撞判定使用物体的包围球半径近似,适合「大致接触」的场景。
5. 解锁(前置关卡)
- 在「关卡信息」页填写前置关卡 ID:填写后,学生必须先通关该前置关卡才能进入本关。
- 前置关卡 ID 为 0(留空)表示无需前置,直接解锁。
- 注意:这里填写的是关卡 ID(数字),不是关卡 token。
6. 保存与发布
- 在「关卡信息」页填好关卡名称(必填)。
- 点击右上角「保存关卡」。首次保存会自动生成
token(形如lv-xxxxxxxxxx),并同步到地址栏。 - 在「是否启用」中控制关卡是否对学生可见。
- 保存后即可在关卡列表(按排序从小到大)看到该关卡。
提示:机构老师通过机构端「教学后台」创建的关卡归属本机构,学生登录后只在对应机构下可见;平台公共关卡对所有学生可见。
7. 出题小建议
- 先搭好地面 + 目标,再放动态物体,最后配判定规则,预览确认画面后再保存。
- 目标位置建议与场景中的可见参照物对齐,并给出合理的容差,避免过严导致学生无法通关。
- 每关只聚焦一个知识点(移动 / 旋转 / 颜色 / 碰撞 / 循环),循序渐进。
- 完成一个关卡后,把它作为下一关的前置关卡,形成一条学习路径。