Skip to content

Make the tiled ground plane the default - #7399

Draft
maxkra15 wants to merge 6 commits into
isaac-sim:developfrom
maxkra15:maximiliank/default-ground-floor
Draft

Make the tiled ground plane the default#7399
maxkra15 wants to merge 6 commits into
isaac-sim:developfrom
maxkra15:maximiliank/default-ground-floor

Conversation

@maxkra15

@maxkra15 maxkra15 commented Aug 27, 2026

Copy link
Copy Markdown

Description

Bundle a warm-white ground plane with NVIDIA-green metric grid lines and make it the default for GroundPlaneCfg and plane terrains.

This change:

  • replaces the remote Nucleus default with a repository-owned USD and textures;
  • preserves the authored floor appearance unless callers explicitly provide a color tint;
  • makes authored face-varying primvars:st the sole texture-mapping authority for Kit, Newton RTX, and Newton GL;
  • configures OmniPBR to consume UV set 0 (st) with projection disabled and identity texture scale;
  • recomputes the bundled asset's UVs when GroundPlaneCfg.size changes so its 5 m texture tile and 1 m grid stay metric;
  • sizes a plane terrain's visual mesh to cover its environment grid, with a 100 m minimum, while retaining an infinite collision plane;
  • keeps the historical dark material default for generated terrains; and
  • documents and tests the asset contract.

The bounded visual mesh matters for standalone visualizers: the previous 2,000 km mesh exhausted useful UV precision near the origin and could sample one green texel across the entire view. Collision behavior is unchanged because the USD Plane collider is infinite.

This is the asset-level solution that superseded #7352. It does not require a Newton-specific OmniPBR compatibility patch or Nucleus upload. Renderer tone mapping and light models can still produce different final brightness.

Renderer comparison

All clips use the bundled default floor, one environment, 300 frames at 60 FPS (5 seconds), and a fixed camera per task. Each renderer panel is captured at 1280 × 720. Kit uses PhysX; Newton RTX and Newton GL use MJWarp.

To keep the warm-white floor below clipping and make the grid legible, these presentation captures use fixed neutral calibration: Kit uses each environment's neutral scene light at 40% of its normal intensity, Newton RTX uses a neutral dome at intensity 400, and Newton GL uses the established neutral ambient profile at exposure 0.40. This calibration affects the media only and is not part of the runtime ground-plane change.

ANYmal-D walking policy

ANYmal-D renderer comparison

Full-resolution ANYmal-D MP4

Cartpole policy

Cartpole renderer comparison

Full-resolution Cartpole MP4 · Both environments in one MP4

Type of change

  • New feature (non-breaking change which adds functionality)
  • Documentation update

Release backport

  • Backport this pull request to the active release branch after it merges into develop

Testing

  • uv run --frozen --no-sync isaaclab -f
  • uv run --frozen --no-sync pytest source/isaaclab/test/sim/test_default_ground_plane.py -q (3 passed)
  • uv run --frozen --no-sync pytest source/isaaclab/test/sim/test_spawn_from_files.py::test_spawn_ground_plane -q (1 passed)
  • uv run --frozen --no-sync pytest source/isaaclab/test/terrains/test_terrain_importer.py::test_plane -q (4 passed)
  • Manual Cartpole and ANYmal-D policy playback with Kit/PhysX, Newton RTX/MJWarp, and Newton GL/MJWarp

Checklist

  • I have read and understood the contribution guidelines
  • I have run the repository formatting and pre-commit checks with uv run --frozen --no-sync isaaclab -f
  • I have made corresponding changes to the documentation
  • My changes generate no new warnings
  • I have added tests that prove my fix is effective or that my feature works
  • I have added a changelog fragment under source/<pkg>/changelog.d/ for every touched package
  • My name already exists in CONTRIBUTORS.md

@github-actions github-actions Bot added documentation Improvements or additions to documentation isaac-lab Related to Isaac Lab team labels Aug 27, 2026
@maxkra15
maxkra15 force-pushed the maximiliank/default-ground-floor branch from 6252f3d to d1b1cdc Compare August 28, 2026 00:24
@ooctipus

Copy link
Copy Markdown
Collaborator

Thanks—this asset-level approach looks good, and the authored metric UVs are the important part. Could we make primvars:st the single source of texture mapping for every renderer, rather than maintaining both OmniPBR projection and equivalent authored UVs?

Newton #4007 is now merged. Newton supports the standard OpenUSD path:

UsdPrimvarReader_float2("st") -> [optional UsdTransform2d] -> UsdUVTexture -> UsdPreviewSurface

That change intentionally does not read OmniPBR mapping inputs (project_uvw, world_or_object, texture_scale, and related attributes). Since this plane already bakes the 5 m repeat into face-varying primvars:st, it does not need a UsdTransform2d either.

My suggestion:

  • Keep the metric primvars:st authored and resized by Isaac Lab as the sole mapping authority.
  • Author a universal UsdPreviewSurface / UsdUVTexture output with explicit repeat wrapping for Newton.
  • If an MDL/OmniPBR output is retained for Kit appearance, have it consume UV set 0 (st) with projection disabled and identity scale, rather than owning a second projected mapping.

This should give Kit, Newton GL, and Newton RTX the same tiling while preventing the two mappings from drifting. Is there a Kit-specific reason this asset still needs object projection instead of consuming the authored st?

@ooctipus

ooctipus commented Aug 28, 2026

Copy link
Copy Markdown
Collaborator

One clarification on the maintenance boundary: the current dual-authoring approach—OmniPBR object projection plus equivalent authored UVs—is not ideal because the same tiling semantics have two sources of truth and can drift.

Making primvars:st the sole mapping source removes that duplication. However, if both an OmniPBR material output and a UsdPreviewSurface output remain, there are still two material descriptions to maintain even though they share one UV mapping.

The cleanest end state, if Kit provides the required visual fidelity, is therefore a single standard UsdPreviewSurface / UsdUVTexture graph consuming primvars:st across Kit, Newton GL, and Newton RTX.

The bundled plane carried the same 5 m tiling twice: an OmniPBR object
projection for Kit and an equivalent face-varying primvars:st for renderers
that consume mesh UVs. Two sources of truth for one mapping can drift, and
only the UV set was rescaled when the plane was resized.

Disable project_uvw and set an identity texture_scale so the OmniPBR shader
reads UV set 0. primvars:st is now the sole mapping authority for Kit,
Newton GL, and Newton Viewer RTX, and the rescale in spawn_ground_plane()
keeps the tile metric in all three rather than in two.

The MDL output is kept: Newton resolves the albedo and the conventional st
primvar from it today, and a universal UsdPreviewSurface output would report
no base color to Newton, which falls back to 0.5 grey and darkens the plane.
@ooctipus

Copy link
Copy Markdown
Collaborator

Pushed 261ca78 to this branch rather than leaving the thread open — revert it if you would rather take a different route.

What it does. project_uvw = 0 and texture_scale = (1, 1) on the OmniPBR shader, so it reads UV set 0 instead of projecting. primvars:st becomes the only mapping authority for Kit, Newton GL, and Newton Viewer RTX, and the rescale already in spawn_ground_plane() now keeps the tile metric in all three rather than in two. Asset README and the USD contract test updated with it; the test fails against the projected asset and passes against the new one.

What it does not do, and why I am walking back the second half of my earlier suggestion: adding a universal UsdPreviewSurface output alongside the MDL one would regress Newton. _extract_preview_surface_properties only records a base color when diffuseColor holds a value; with the texture connected it returns color=None, _get_input_value_and_attr then follows the connection to outputs:rgb and gets nothing, and ViewerBase._update_shapes falls back to wp.vec3(0.5, 0.5, 0.5) for a visual-only shape. The GL shader does albedo = ObjectColor; albedo *= tex_color, so the plane would render at half brightness. The MDL path avoids this because diffuse_color_constant = (1, 1, 1) is a plain value, and Newton still resolves the conventional st primvar from it.

So one mapping, still one material description. Worth filing upstream that a UsdPreviewSurface with a textured diffuseColor should default to white; once that lands, dropping OmniPBR for a single standard graph becomes the clean end state I described, subject to the emissive-mask modulation which UsdPreviewSurface cannot express without math nodes.

matthewtrepte added a commit to matthewtrepte/IsaacLab that referenced this pull request Aug 31, 2026
…revert

Reverting a2a6329 (superseded by cherry-picking PR isaac-sim#7399's asset-level
ground-plane fix) also removed _hash_geometry's UV-awareness in
newton_visualizer.py, which is a separate concern -- it prevents Newton
GL/RTX's prototype cache from conflating differently-UV-mapped textured
meshes in general, not just the ground plane. PR isaac-sim#7399 doesn't touch
isaaclab_visualizers/ at all, so there's no replacement for this piece.
Re-applied it standalone; confirmed via
test_newton_viewer_geometry_hash_distinguishes_uvs (was failing after the
revert, passes now).
matthewtrepte added a commit to matthewtrepte/IsaacLab that referenced this pull request Aug 31, 2026
Uses the new default ground plane (PR isaac-sim#7399, cherry-picked in e769c1b/
6878e5b/38403630a4/325655dcc3) instead of the old black-floor default.
All 5 visualizers now show a proper floor (Kit, Newton GL, Newton RTX,
Rerun, Viser), where the black-floor/green-sky combination on Newton GL
was the original problem this whole thread investigated.
"""Test loading prim for the ground plane from grid world USD."""
# Spawn ground plane
cfg = sim_utils.GroundPlaneCfg(color=(0.1, 0.1, 0.1), size=(10.0, 10.0))
cfg = sim_utils.GroundPlaneCfg(color=(0.1, 0.1, 0.1), size=(10.0, 20.0))

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

hm why is the ground plane rectangular?

@kellyguo11 kellyguo11 moved this to In progress in Isaac Lab Aug 31, 2026
matthewtrepte added a commit to matthewtrepte/IsaacLab that referenced this pull request Sep 1, 2026
This reverts commits 325655d, 3840363, and 6878e5b -- the
cherry-picked ground-plane asset/texture change from the still-open
upstream PR isaac-sim#7399. Its default_ground_plane.usda asset fails to parse
as a valid USD layer on CI ("No collision prim found at path:
'/World/ground'"), breaking Installation Tests.
matthewtrepte added a commit to matthewtrepte/IsaacLab that referenced this pull request Sep 1, 2026
…osted media

Restructures docs/source/overview/core-concepts/visualization.rst,
docs/source/how-to/record_video.rst, and docs/source/how-to/visualizer_tiled_camera.rst
into docs/source/concepts/visualization.rst, docs/source/features/record_video.rst, and
docs/source/features/visualizer_tiled_camera.rst, with a hero grid, per-visualizer sections,
and shared-features overview covering all 5 visualizers (Kit, Newton GL, Newton RTX, Rerun,
Viser).

Media
- All demo clips are mp4 (h.264) instead of GIFs, hosted on
  https://download.isaacsim.omniverse.nvidia.com/isaaclab/images/ rather than bundled in the
  repo; only the two marker screenshots (markers_anymal_d.jpg, markers_franka.jpg) stay local.
- Consolidated doc-media generation from 11 ad hoc scripts down to 4
  (tools/docs/media/visualizers/capture_common.py, capture_hero.py, capture_showcase.py,
  capture_streaming.py), each independently re-runnable to regenerate its clips.

Bug fixes (isaaclab_visualizers)
- Fixed NewtonGLVisualizer.render_rgb_array omitting visualization markers from recorded
  video.
- Fixed NewtonRTXVisualizer unconditionally reporting the streaming/tiled camera view as
  unsupported; streaming_view=True now creates the owned streaming camera sensor for headless
  capture.
- Implemented RerunVisualizer.set_camera_view / ViserVisualizer.set_camera_view (previously
  no-op stubs).
- Fixed run_video_recording.py's Example 3 Kit streaming view crashing on a stale camera prim
  path.

Reverted from this branch
- The cherry-picked ground-plane texture asset (PR isaac-sim#7399) and Newton UV-collision
  prototype-cache fix (PR isaac-sim#7352), both out of scope for this PR.
- Viser ambient-light (light_intensity) and Rerun/Viser HUD-toggle (show_hud) options, added
  alongside the legitimate visualizer fixes above but out of scope for this PR.
@maxkra15

maxkra15 commented Sep 1, 2026

Copy link
Copy Markdown
Author

run-ci

@isaaclab-bot isaaclab-bot Bot added ci:run-docker Trigger the on-demand Docker and GPU CI workflow and removed ci:run-docker Trigger the on-demand Docker and GPU CI workflow labels Sep 1, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation infrastructure isaac-lab Related to Isaac Lab team

Projects

Status: In progress

Development

Successfully merging this pull request may close these issues.

5 participants