Skip to content

十分钟看懂六面骰子

先把完整结果和碰撞模型对应起来。首页 GIF 是 JVM 沙盒实际执行 VVE 的输出;下面的网页实验会加载真实 Math3、VVE、骰子示例和资源包,并在浏览器内以 20 TPS 推进物理。

1. 直接观察

操作顺序:

  1. 等状态显示 6 个真实 VVE 依赖已经就绪。
  2. 点击 初始化并投掷,页面会执行运行时、骰子模型、模拟器和真实 _roll 路径。
  3. 观察 tick、Pos、Velocity 与 Travel;骰子落地后 tick 仍会连续推进。
  4. Pause / Step 逐帧观察接触,用 重新投掷 重复实验。
  5. 展开下方编辑器,可修改初始化或命令并再次运行;按 T 可在视窗内输入命令。
  6. 点击画面后用 WASD、Space、Shift 和鼠标从不同角度观察。

这是可观察的 clean-room 模拟,不是原版客户端

页面执行真实 VVE 函数与数据,但 Datapack Sandbox 仍不是 Mojang 服务端。客户端物理、AI、红石和逐像素渲染不会被隐式补齐;正式发版仍需在目标 Minecraft 版本验收。

2. 完整物理的初始化代码

在 JVM 沙盒或 Minecraft 中,先按依赖顺序初始化:

mcfunction
function math:_init
function math:_init_la
function vve:_init

再初始化骰子模型和专用模拟器:

mcfunction
function vve_examples:dice_6/init
function vve_examples:dice_simulator/init

dice_6/init 创建字段记分板,调用 _consts,再由 _class 生成默认 plate;dice_simulator/init 生成独立模拟器状态。由一个世界实体提供投掷位置与朝向:

mcfunction
summon marker 0.5 106 -2.5 {Tags:["thrower"]}
execute as @e[tag=thrower,limit=1] at @s rotated 0 -25 anchored eyes positioned ^ ^ ^0.5 run function vve_examples:dice_6/_roll
kill @e[tag=thrower]

JVM 演示包还会铺设地面与围栏、启动低速稳定监视。它不修改 VVE 原包;兼容逻辑仅位于独立演示包中。

3. 一次投掷发生了什么

vve_examples:dice_6/_roll 的主路径可以压缩成:

text
dice_6_plate
  ↓ 写入 vve_examples:io input
_new 创建 item_display 实例
  ↓ _get
随机四元数 + 偏心冲量
  ↓ _store
模拟器每 tick 调用 main_c

运动 → 八顶点探测 → 重力/响应 → 姿态规整 → 同步 → 写回

偏心冲量同时改变线速度和角速度,所以骰子不只是平移。八个局部顶点 (±a, ±a, ±a) 被旋转到世界坐标,分别与方块介质交互;响应最终汇总回一个刚体。

4. 做三个小实验

改变投掷方向

在 JVM/游戏中把 rotated 0 -25 改为:

mcfunction
execute as @e[tag=thrower,limit=1] at @s rotated 35 -10 anchored eyes positioned ^ ^ ^0.5 run function vve_examples:dice_6/_roll

水平角改变前进方向,俯仰角影响抛射方向。_roll 要求一个世界实体作为执行者,因为它需要读取和调整执行位置。

查看运动数据

mcfunction
execute as @e[tag=dice_6,limit=1] run function vve_examples:dice_6/_get
function vve:_print_coord
function vve:_print_velocity
function vve:_print_angular

_get 把选中实例读进共享临时对象;后续打印函数读的正是这组临时记分板。不要在 _get 和打印之间运行另一个物体的计算。

暂停后单步

JVM 视窗点击 Pause,再点 Step。逐帧观察接触时,更容易判断抖动来自位置修正、冲量还是展示插值。网页观察场的 Step 只推进展示世界时间,不执行完整 VVE。

5. 你现在应该记住的四件事

  • plate 是创建实例前的静态数据模板;实例不是 plate 的引用,而是一次复制。
  • _get/_store 围住一次实例计算;共享临时对象不可嵌套、不可并发。
  • 显示与物理模型分离;看到一个立方体不代表碰撞一定按完整表面计算。
  • 模拟器决定“谁在什么时候执行”,模型主程序决定“一次物理帧做什么”。

下一步阅读VVE 的心智模型,把这次观察中的模型、碰撞点和函数各自放回正确位置。

VVE 由小豆 8593 开发;本站是面向学习与查阅的增强文档。