Kinematic paddle
Basic contacts
A paddle on a fixed path sweeps boxes; one box ignores gravity.
steel preset (the default), recordedon an NVIDIA RTX PRO 6000 Blackwell.Run it
cd examples# the default preset (steel), then the othersuv run shelf play kinematic# change solver settings liveuv run shelf tune kinematicSource: examples/shelf/01_basic_contacts/kinematic/ · ported from steel-webgpu tools/scenes.py kinematic() @ ad03e49
Presets
| Preset | Solver | Status | Checked |
|---|---|---|---|
steeldefault | steel | works | 2026-11-10, newton f6fc82a8b, NVIDIA RTX PRO 6000 Blackwell Server Edition |
Solvers with no row are untested on this example. The full settings are inpresets.toml.
Code
# SPDX-FileCopyrightText: Copyright (c) 2026 Skild AI and the Steel contributors# SPDX-License-Identifier: Apache-2.0# Direct source: steel-webgpu; see presets.toml and THIRD_PARTY.md.# Modified for Steel Shelf: preset-driven execution and shared runner integration.
############################################################################ Example Kinematic paddle## Kinematic bodies: a kinematic paddle sweeps boxes at a prescribed spin; a gravity-free box floats.## Ported from steel-webgpu's tools/scenes.py (kinematic); the scene builds# as it does there and the shelf's preset drives the solver.## Command: python -m shelf run kinematic############################################################################
import math
import numpy as npimport warp as wp
import newtonimport newton.examplesfrom common.steel_scenes import BLUE, GOLD, GREY, RED, TEAL, SceneExample, cfg, tf
class Example(SceneExample): file = __file__ camera = {'eye': (0.6, -1.2, 0.8), 'target': (0.0, 0.0, 0.1)}
def build(self): """Kinematic bodies: a kinematic paddle sweeps boxes at a prescribed spin; a gravity-free box floats.""" b = newton.ModelBuilder() b.add_ground_plane() paddle = b.add_body(xform=tf((0.0, 0.0, 0.05)), is_kinematic=True) b.add_shape_box(paddle, hx=0.42, hy=0.015, hz=0.04, cfg=cfg(density=500), color=RED) twists = {paddle: (0.0, 0.0, 0.0, 0.0, 0.0, 1.2)} for k in range(10): # half a spacing off steel-webgpu's ring (2 pi k / 10), whose boxes at 0 and pi start 45 mm inside the # paddle and are shot out by the depenetration (at 3.5 m at 16 substeps) before the paddle reaches them a = 2 * math.pi * (k + 0.5) / 10 body = b.add_body(xform=tf((0.32 * math.cos(a), 0.32 * math.sin(a), 0.03))) b.add_shape_box(body, hx=0.03, hy=0.03, hz=0.03, cfg=cfg(density=300), color=[BLUE, TEAL, GOLD][k % 3]) floater = b.add_body(xform=tf((0.0, 0.0, 0.4)), disable_gravity=True) b.add_shape_box(floater, hx=0.04, hy=0.04, hz=0.04, cfg=cfg(density=300), color=GOLD) twists[floater] = (0.0, 0.0, 0.0, 0.3, 0.5, 0.0) return b, twists, "Kinematic bodies: a kinematic paddle (prescribed 1.2 rad/s spin, infinite mass) sweeps boxes; the gold box above has gravity disabled."
if __name__ == "__main__": parser = Example.create_parser() viewer, args = newton.examples.init(parser) newton.examples.run(Example(viewer, args), args)example = "kinematic"source = "steel-webgpu tools/scenes.py kinematic() @ ad03e49"default = "steel"
[check]# Arguments `python -m shelf check` passes in test mode.args = []
[gallery]short = "A paddle on a fixed path sweeps boxes; one box ignores gravity."title = "Kinematic paddle"frame = 120
[xpbd]status = "untested"
[vbd]status = "untested"
[mujoco]status = "untested"
[featherstone]status = "untested"
[semi_implicit]status = "untested"
[feather_pgs]status = "untested"
[steel]status = "works"# 3 substeps x 8 iterations: the paddle (now turned through its joint coordinates, see common/steel_scenes.py)# sweeps the boxes at its tip speed (boxes peak at 0.51 m/s, as at 16 x 50), none lifts, and boxes pinned between# paddle and box stay within 1 mm of contact (peak 0.98 mm; 4 x 12: 0.26). 2 x 8 and 4 x 6 reach 1.8 and 1.3 mm,# 1 substep 4 to 33 mm. No joints: limits off.sim = { fps = 60, substeps = 3 }solver = { solve_mode = "matrix_free", iterations = 8, articulated_contact_response = "propagation_colored" }checked = "2026-11-10, newton f6fc82a8b, NVIDIA RTX PRO 6000 Blackwell Server Edition"
[kamino]status = "untested"
[implicit_mpm]status = "untested"
[style3d]status = "untested"Steel docs and tutorials are licensed under Apache-2.0. Third-party notices. "Skild", "Skild AI" and the Skild logo are trademarks of Skild AI and are not licensed under Apache-2.0.