3D Point World Models

Appendix

Skand Peri, Hung Nguyen, Chanho Kim, Li Fuxin, Stefan Lee

AData generation

Point completion. For each YCB object we render depth maps from 100 random viewpoints on a sphere of radius 1 looking at the origin (object centred), and back-project them to partial point clouds.

Random camera viewpoints around three YCB objects
Sampled random views on three YCB objects.

Dynamics modeling. For all ManiSkill and DexMimicGen tasks a custom wrapper samples complete point clouds from object, part and geom meshes. To get correspondences, points are sampled once in the canonical frame and rigid-body poses are applied to every entity. Only one canonical cloud and len(traj) transformation matrices are stored, instead of a cloud per step.

BModel details & hyperparameters

Table III – hyperparameters
Point completion
jitter prob0.3
jitter mean0.01
jitter variance0.03
global feature channels512
encoder channels[32, 64, 128, 256]
decoder upsample factors[2, 2, 2]
decoder hidden channels64
seed generator blocks4
seed gen. attn heads8
seed gen. attn dims384
seed gen. upsample factor2
seed gen. output dim256
Point dynamics model
serialization patternZ + TZ + H + TH
patch interactionShift Order + Shuffle Order
positional encoding[CPE, RPE, CPE, RPE]
stride[2, 2]
encoder depth[2, 2, 2]
encoder channels[32, 128, 256]
encoder num heads[8, 8, 8]
encoder patch size[256, 48, 256]
decoder depth[2, 2]
decoder channels[128, 256]
decoder num heads[8, 8]
decoder patch size[256, 48]
mlp ratio4
qkv biasTrue
drop path0.3
pre norm / shuffle ordersTrue / True
MPPI planner
planning horizon20–30 steps
# samples200
# top candidates64
λ0.7
noise σ5
Training
lossHuber, δ = 0.25
optimizerAdamW
learning rate1e-4
schedulerStepLR, step 30, ε = 0.1
SAM3 prompting (VLM prompt used to get point prompts)

Given the task description, Gemini Robotics 1.5 identifies task-relevant objects and outputs one or more 2D points per object. These points prompt SAM3 to segment the objects.

You are a vision-language model assisting a robot with a manipulation task.

Given:
1. A natural-language task description.
2. An RGB image of the current scene.

Your goal is to identify all objects that are relevant to successfully
completing the task and provide one or more 2D point locations for each
relevant object.

Instructions:
1. Read the task description carefully and determine which physical objects
   the robot must interact with, manipulate, move, avoid, or otherwise
   reason about to complete the task.
2. In the image, locate each task-relevant object.
3. For each relevant object, select a 2D point that lies clearly INSIDE the
   visible region of that object.
   - The point should be near the center of the visible portion of the object
     whenever possible.
   - Do not place the point on the object's boundary.
   - Do not place the point on the background, another object, or an
     occluding object.
   - Prefer points that are visually unambiguous and far from object boundaries.
   - If an object is partially occluded, place the point on the visible portion.
...
Output format:
[ { "object": "<short object description>", "point": [x, y] }, ... ]

Example:
Task: "Pick up the red mug and place it inside the bowl."
Output:
[ {"object": "red mug", "point": [312, 241]},
  {"object": "bowl",    "point": [487, 326]} ]

Be precise: every point must fall inside the corresponding object's visible pixels.

CCost function specification

Takeaway: Because completion yields high-fidelity long-horizon rollouts, cost functions can be written directly on predicted point clouds – generated by a VLM from the task description, or adapted from a simulator reward.

We prompt Gemini 2.5 Flash with the task description and the detected-objects JSON to produce a PyTorch cost_fn(cfg, point, info) that returns a scalar (lower is better). The prompt asks the model to:

Below is an example cost function adapted almost directly from the ManiSkill PickCube reward.

Listing 1 – PickCube cost on 3DPWM rollouts
def cost_fn_pick_cube(cfg, point, info):
    """Cost function for the PickCube-v1 task."""
    goal_xyz = torch.tensor(info['extra']['goal_pos'], device=cfg.device)

    left_gripper_xyz  = point['left_gripper']
    right_gripper_xyz = point['right_gripper']
    cube_xyz          = point['cube']

    cube_center_xyz = cube_xyz.mean(dim=0)
    tcp_xyz = (left_gripper_xyz.mean(dim=0) +
               right_gripper_xyz.mean(dim=0)) / 2

    tcp_to_cube_dist = torch.norm(cube_center_xyz - tcp_xyz, dim=0)
    reaching_reward  = 1.0 - torch.tanh(5.0 * tcp_to_cube_dist)

    cube_to_goal_dist = torch.norm(cube_center_xyz - goal_xyz, dim=0)
    place_reward      = 1.0 - torch.tanh(5.0 * cube_to_goal_dist)

    contact_reward = 1.0 if info['grasped'] else 0.0

    if info['grasped']:
        total_cost = -place_reward
    else:
        total_cost = -(reaching_reward + contact_reward)

    return total_cost

Contact is not modeled explicitly: we treat the object as grasped when the gripper TCP is within 2.5 cm of the object centre (info['grasped'] = True). Thresholding the gripper–object–gripper intersection was hard to tune in practice; explicit contact modeling in point world models is left for future work.

DFailure scenarios

Takeaway: Failures mostly come from a train/real distribution gap in the partial inputs: our completion data contains no inter-object occlusion, and the model sometimes emits stray points outside the object boundary.

Completion is trained on partial clouds rendered from single meshes at 100 viewpoints, so occlusions caused by other objects are never seen. Noisy points outside the object boundary are also a common failure. Remaining real-world failures are also attributed to biased centre-of-mass estimates.

Successful and failed point completions
Fig. 7. Fine-tuned completion. Top: successes on apple and mustard bottle (red = partial input, green = completion). Bottom: failures on drill and apple.

ERobustness to lighting and camera viewpoint

Takeaway: With two new camera viewpoints and dim lighting, 3DPWM holds 55–60% success on PickApple while ParticleFormer+ falls to 0–10%.

Policies trained on calibrated point clouds are generally robust to lighting and viewpoint shifts [20, 65]; our PickApple results (20 trials per plot) agree.

Two viewpoint changes and darker lighting
The tested conditions.
Bar chart: 3DPWM 60, 55, 60 vs ParticleFormer+ 0, 10, 0
Fig. 8. Success rate: Viewpoint-1 / Viewpoint-2 / Dark lighting.
PickApple under darker lighting.

FComparison to GNN-based methods

Takeaway: Transformer dynamics on completed clouds are an order of magnitude more accurate than GNN dynamics (GBND), consistent with prior findings that GNNs underperform transformers.

Gaussian-splatting methods such as GBND [24] combine Gaussian point dynamics with splat rendering. As 3DPWM models dynamics rather than rendering, we compare against GBND's GNN dynamics. Lower Chamfer and higher correlation are better; best in bold.

TaskChamfer L1 ↓Reward corr. (r) ↑
GBND3DPWMGBND3DPWM
PickCube0.1850.0090.370.86
Pick YCB0.210.0280.330.85
Box Cleanup0.3010.0220.160.83

Integrating a rendering pipeline into 3DPWM, with 3DPWM as the dynamics model, is future work.

GSim2Real in cluttered environments

Takeaway: In clutter, 3DPWM gets 45% (PickPlaceApple) and 60% (StackCube) over 20 trials, versus 0% and 5% for ParticleFormer+. All StackCube failures are near-misses during the final placement.

PickPlaceApple: the apple starts near a group of clutter objects and the cost adds a heuristic collision penalty. StackCube: stack a yellow cube on a blue cube in a moderately cluttered scene; precise placement is critical.

Clutter success rates and a StackCube near-miss sequence
Fig. 9. Left: success over 20 trials per task. Right: a StackCube failure at the very end, placing the yellow cube on the blue cube.
PickPlaceApple in clutter
StackCube in clutter

HBaselines: ParticleFormer

Takeaway: Even a stronger PTv3-based ParticleFormer+ trails 3DPWM, and the original 3-layer version is weaker still – so the gap is not about network size.

Each partial input has point velocities and a one-hot instance segmentation vector. We run two variants, both trained on segmented partial clouds with the authors' hybrid Chamfer + Hausdorff loss: PFormer (3-layer) – re-implementation with three transformer layers as in the original paper; and PFormer+ – encoder/decoder replaced by our PTv3 architecture.

TaskAvg. rollout len.Chamfer L1 ↓Reward corr. (r) ↑
PFormer+PFormer (3L)3DPWMPFormer+PFormer (3L)3DPWM
PickCube660.0800.1320.0090.610.410.86
Box Cleanup2180.1320.2250.0220.300.190.83

IEnvironments

Snapshots of the six evaluation environments
Fig. 10. Environments used to evaluate 3DPWM.
TaskDescriptionObservation pointsAction dim
PickCubeLift the cube from the table to a goal position in the air, given as a 3D point.1,2007
StackCubeStack the red cube on top of the green cube.1,5007
PickYCBPick any YCB object from the table to a goal position in the air, given as a 3D point.1,2007
MugCleanupPick and place the mug inside the drawer and close it.8,1927
TwoArmBoxCleanupPick up the lid of the box using two dexterous hands and place it on the box.10,00024
TwoArmDrawerCleanupPick and place the mug using two dexterous hands inside the drawer and close it.12,00024

Table VI. Complete-cloud points and action dimension per task. The dexterous two-arm tasks are much higher-dimensional: 24-d actions (6 pose + 6 finger dimensions per arm, versus 7 for the parallel gripper) and up to 12,000 points (versus 1,200), and MugCleanup already uses 8,192 points.

JThings we tried that did not work

Takeaway: Off-the-shelf 3D/depth foundation models were insufficient for real-world manipulation, primarily due to object misalignment.

Shared here in the hope that they help others.