Newton 可视化与调试指南:从实时渲染到录制回放的完整 Viewer 体系
发布时间:2026/9/18 9:34:28来源:尧图网络
Newton 可视化与调试指南从实时渲染到录制回放的完整 Viewer 体系【免费下载链接】newtonAn open-source, GPU-accelerated physics simulation engine built upon NVIDIA Warp, specifically targeting roboticists and simulation researchers.项目地址: https://gitcode.com/GitHub_Trending/newton9/newtonNewton 是一个基于 NVIDIA Warp 的开源 GPU 物理仿真引擎面向机器人学家与仿真研究人员。本文以仓库文档 docs/guide/visualization.rst 为主线系统讲解 Newton 的多后端 Viewer 架构如何根据场景选择 Viewer、如何用统一的log_*接口进行显式调试、如何录制状态快照并离线回放以及如何叠加自定义可视化覆盖层。读完本文你将掌握ViewerGL/ViewerRTX/ViewerFile/ViewerUSD/ViewerRerun/ViewerViser/ViewerNull七个后端的安装、接入与最佳实践并能在无显示器环境下完成离屏渲染与帧捕获。一、Viewer 体系总览按需求选择后端Newton 在newton/viewer.py中统一导出了全部 Viewer 类见 newton/viewer.pyViewerBase、ViewerGL、ViewerRTX、ViewerFile、ViewerUSD、ViewerRerun、ViewerViser、ViewerNull另有用于多模型叠加的Layer。所有后端都继承自 ViewerBase共享同一套模拟循环接口。选择 Viewer 的关键是明确你需要实时显示、当前会话内的历史检查还是持久的可分享产物Viewer适用场景检查/输出形式依赖newton.viewer.ViewerGL交互式开发与实时调试实时显示headless 模式可捕获帧pyglet、imgui_bundlenewton.viewer.ViewerRTXNVIDIA GPU 上的光线追踪可视化实时显示ovrtx、usd-core、pygletuv sync --extra rtxnewton.viewer.ViewerFile持久化的状态快照录制与可视化回放.json或.bin文件JSON 无额外依赖二进制需 cbor2newton.viewer.ViewerUSD面向 3D 管线的持久化场景导出带时间采样的.usd文件usd-corenewton.viewer.ViewerRerun实时可视化与可选的会话时间轴检查Web 界面rerun-sdknewton.viewer.ViewerViser浏览器或笔记本可视化与视觉录制Web 界面.viser文件visernewton.viewer.ViewerNull无可视化要求的无头执行或自动化测试无无二、用 Viewer 调试显式日志记录而非自动插桩Newton 的 Viewer 采用协作式、显式日志记录cooperative, explicit logging模式而不是自动检查仿真的每一个角落调用ViewerBase.set_model提供场景结构每帧调用ViewerBase.log_state提供运动状态刚体变换、粒子位置等只有应用显式调用log_contacts时接触才会出现力、目标点、法线、指标等其他诊断数据同样需要显式调用对应的log_*()方法。这些诊断数据如何呈现、历史是否保留取决于 Viewer 后端。调试建议用ViewerGL这类实时 Viewer 检查当前场景并叠加自定义覆盖层见「自定义可视化」需要历史检查时在ViewerRerun中开启keep_historical_data保留当前会话的时间轴或用ViewerFile创建持久化状态快照用于后续可视化回放ViewerViser与ViewerUSD则创建可分享、可供外部工具使用的持久化视觉/场景产物。需要注意当前 Viewer 不会自动捕获求解器内部状态或复现仿真所需的全部输入。录制与诊断捕获能力将在未来版本中继续扩展因此如果需要复现一次运行求解器配置、控制器、接触等仿真输入必须另行记录。三、公共接口所有后端共享的模拟循环所有 Viewer 后端继承自ViewerBase其抽象方法与默认实现集中在 newton/_src/viewer/viewer.py。3.1 核心循环方法set_model(model)— 绑定一个newton.Model之后可用set_visible_worlds()限制渲染的世界数量。begin_frame(time)— 以当前仿真时间开启新一帧源码中仅记录self.time见 viewer.py。log_state(state)— 用当前newton.State更新 Viewer刚体变换、粒子位置等。end_frame()— 结束当前帧并呈现。is_running()— 检查 Viewer 是否仍处于打开状态适合作为循环条件ViewerGL关闭窗口后返回False。is_paused()— 检查仿真是否暂停ViewerGL中用SPACE切换。should_step()— 每帧恰好调用一次运行中返回True收到单步请求ViewerGL中按.或点击 Step 按钮后返回一次True其余返回False。官方建议优先使用它而不是手动组合is_paused()见 viewer.py。close()— 关闭 Viewer 并释放资源。3.2 相机与布局set_camera(pos, pitch, yaw)— 设置相机位置、俯仰角与偏航角。camera_speed— 属性设置键盘相机平移速度m/s。源码要求其值为有限非负数viewer.py默认4.0。set_world_offsets(spacing)— 以给定轴间距把多个世界排布为网格。该方法必须在set_model之后调用若未手动设置Viewer 会依据模型包围盒自动计算紧凑网格间距viewer.py。3.3 自定义可视化覆盖层log_lines(name, starts, ends, colors, ...)— 绘制线段射线、法线、力矢量。log_points(name, points, radii, colors, ...)— 绘制点云接触位置、粒子位置。log_contacts(contacts, state)— 以接触点法线形式可视化newton.Contacts。log_gizmo(name, transform)— 显示变换坐标系小控件位置 朝向轴。log_scalar(name, value, ...)/log_array(name, array, ...)— 以标量曲线或数组可视化展示数值诊断详见「实时曲线与数组图」。log_image(name, image, fullscreenFalse)— 在ViewerGL中以可停靠窗口显示单张或批量图像fullscreenTrue时作为当前帧的主 Viewer 表面其他后端为 no-op。3.4 限制渲染的世界数量在并行环境多 world 强化学习训练中渲染所有世界会影响性能。所有 Viewer 都支持set_visible_worlds()只可视化环境的子集builder newton.ModelBuilder() body builder.add_body(mass1.0) model builder.finalize() # Only render the first 4 environments viewer newton.viewer.ViewerNull() viewer.set_model(model) viewer.set_visible_worlds(range(4))源码实现在 viewer.py它维护可见世界索引集合重建 GPU 掩码并重新填充形状实例批次也可在帧间动态调用以切换可视化范围无需重建模型。set_visible_worlds(None)恢复显示全部世界。四、实时曲线与数组图Live Plotslog_scalar与log_array提供数值诊断其展示方式依后端而异ViewerGL与ViewerRTX在 Plots 窗口中显示滚动标量折线图以及标量/1-D/2-D NumPy 或 Warp 数组的热力图。ViewerViser侧边栏显示滚动标量折线图不支持通用数组可视化。ViewerRerun把标量/数组数据转发给 Rerun 原生的标量可视化。对于ViewerGL、ViewerRTX与ViewerViser构造 Viewer 时用plot_history_size配置每条标量信号的绘图样本数默认 250。源码 plot_logger.py 要求其为正整数否则抛TypeError/ValueError。用smoothing把一组原始样本平均后提交为单个绘图点smoothing 1默认 1。用log_scalar(..., clearTrue)重置某条信号的历史与待平滑样本。示例ViewerGL或ViewerRTXviewer.log_scalar(Training/reward, reward, smoothing10) viewer.log_array(Training/observations, observations)细节补充在ViewerGL/ViewerRTX中向log_array传None可移除某张热力图日志记录在首帧渲染之前及 headless 模式下均可用曲线在 Viewer 窗口及其 UI 激活时显示。ViewerRerun通过keep_scalar_history默认True与keep_historical_data控制历史且忽略clear与smoothing向log_array传None为 no-op见 viewer_rerun.py。五、实时 Viewer5.1 OpenGL ViewerViewerGLViewerGL是一个轻量 OpenGL Viewer用于仿真的交互式实时可视化。要求安装 pyglet 2.1.6与 imgui_bundle 1.92.0。其构造参数viewer_gl.py包括width1920、height1080窗口像素尺寸vsyncFalse垂直同步headlessFalse无窗口离屏渲染pausedFalse启动即暂停plot_history_size250每条log_scalar信号保留的样本数num_framesNoneheadless 模式下渲染帧数上限None不设上限0不渲染任何帧窗口模式忽略enable_cuda_interopCUDA-OpenGL 互操作类别默认CudaInterop.DYNAMIC_MESH。基本用法viewer newton.viewer.ViewerGL() viewer.set_model(model) # at every frame: viewer.begin_frame(sim_time) viewer.log_state(state) viewer.end_frame() # advance the simulation each frame, or step once when paused: if viewer.should_step(): pass # call solver.step(), example.step(), etc.交互力与键盘输入ViewerGL.apply_forces(state)把 Viewer 驱动的力右键拾取物体、风应用到仿真状态应在每帧步进求解器前调用viewer.apply_forces(state) solver.step(model, state, ...)ViewerGL.is_key_down(key)查询某键是否被按住。键可用单字符字符串w、特殊键名space、escape或 pyglet 键常量指定if viewer.is_key_down(r): state model.state() # resetHeadless 模式与帧捕获headlessTrue时 Viewer 离屏渲染、不打开窗口用get_frame()取回渲染图像以 Viewer 设备上的 Warp 数组返回viewer newton.viewer.ViewerGL(headlessTrue) viewer.set_model(model) viewer.begin_frame(sim_time) viewer.log_state(state) viewer.end_frame() # Returns a wp.array with shape (height, width, 3), dtype wp.uint8 frame viewer.get_frame()无显示器机器的关键坑pyglet 在首次导入后端时绑定显示后端而 Newton 在第一个ViewerGL构造时才会导入 pyglet 的窗口/显示模块所以 headless 选项必须在那之前设置。否则在 Linux 上会报pyglet.display.xlib.NoSuchDisplayException: Cannot connect to Nonepyglet 默认 Xlib。两种解法PYGLET_HEADLESS1 python your_script.py或在创建 Viewer 前于 Python 中设置import newton import pyglet pyglet.options[headless] True viewer newton.viewer.ViewerGL(headlessTrue)多 GPU 机器上PYGLET_HEADLESS_DEVICE或pyglet.options[headless_device]选择用于渲染的 GPU默认0这未必是仿真其余部分运行的设备。自定义 UI 面板ViewerGL.register_ui_callback(callback, position...)向 Viewer 添加自定义 imgui UI 元素。position控制放置位置side默认、stats、free或paneldef my_ui(ui): import imgui_bundle.imgui as imgui imgui.text(Hello from custom UI!) viewer.register_ui_callback(my_ui, positionside)ViewerGL 控件表按键说明W、A、S、D或方向键在地面平面内移动相机Q/E相机下移 / 上移左键拖拽环视中键拖拽绕当前相机枢轴旋转orbitShift 中键拖拽平移相机与枢轴Ctrl 中键拖拽朝枢轴推进 / 拉远dolly鼠标滚轮朝枢轴推进 / 拉远Ctrl 滚轮调整视场角FOVF框选可见模型并设置轨道枢轴H切换侧边栏SPACE暂停 / 继续仿真.暂停时单步推进一帧ESC关闭 Viewer右键拾取物体轨道模式下枢轴保持不动、相机绕其旋转按F把枢轴居中到模型Shift 中键拖拽把枢轴随相机平移滚轮改变轨道距离。Wayland 故障排查在 Linux Wayland 上遇到 OpenGL 上下文错误OpenGL.error.Error: Attempt to retrieve context when no valid context请先设置 PyOpenGL 平台再运行export PYOPENGL_PLATFORMglx这是 Wayland 显示服务器上运行 OpenGL 应用的已知问题。5.2 RTX ViewerViewerRTXViewerRTX使用 NVIDIA OVRTX 渲染器提供实时路径追踪渲染首帧构建 USD 场景之后每帧通过 OVRTX 属性 API 更新刚体变换并在 pyglet/OpenGL 窗口中呈现结果。注意RTX Viewer 目前是实验性的功能可能不如 OpenGL Viewer 完整。安装需要rtx依赖组uv sync --extra rtx这会安装ovrtxNVIDIA OVRTX 渲染器与usd-core外加窗口所需的pyglet。viewer newton.viewer.ViewerRTX(environmentstudio) viewer.set_model(model) # at every frame: viewer.begin_frame(sim_time) viewer.log_state(state) viewer.end_frame()实时曲线依赖imgui_bundle它包含在examples依赖中。可同时安装 RTX Viewer 与 UI 依赖uv sync --extra rtx --extra examples六、录制与离线 Viewer6.1 录制到文件ViewerFileViewerFile把模型与状态快照录制为 JSON 或二进制文件用于后续可视化回放或程序化检查非常适合捕获仿真运动用于调试或分享。一份ViewerFile录制包含传给set_model的newton.Model传给log_state的每个newton.State上直接存储的所有 Warp 数组。它不包含接触、自定义图元、标量/数组诊断、求解器内部状态以及传给begin_frame的仿真时间戳。加载录制只恢复捕获的模型与状态快照不会重新执行仿真求解器配置、控制器、接触等其他仿真输入如需复现运行必须单独捕获。文件格式.json人类可读的 JSON 格式无额外依赖.bin二进制 CBOR2 格式更高效需要cbor2包。二进制格式需安装可选依赖pip install cbor2录制静态状态快照import tempfile, os builder newton.ModelBuilder() body builder.add_body(mass1.0) model builder.finalize() state model.state() # Record to JSON format (human-readable, no extra dependencies) output_path os.path.join(tempfile.mkdtemp(), simulation.json) viewer newton.viewer.ViewerFile(output_path) viewer.set_model(model) sim_time 0.0 # Record five snapshots of the current static state for _ in range(5): viewer.begin_frame(sim_time) viewer.log_state(state) viewer.end_frame() sim_time 1.0 / 60.0 # Close to save the recording viewer.close()加载并回放录制用ViewerFile加载录制、恢复指定帧的模型与状态再用ViewerGL或其他渲染 Viewer可视化# Load a recording for playback viewer_file newton.viewer.ViewerFile(output_path) viewer_file.load_recording() # Restore the model and state from the recording model newton.Model() viewer_file.load_model(model) print(fFrames: {viewer_file.get_frame_count()}) state model.state() viewer_file.load_state(state, frame_id0) # frame index in [0, get_frame_count())源码中load_recording、get_frame_count、load_model、load_state位于 viewer_file.py。完整工作流示例仓库内置示例可直接体验完整录制-回放流程uv run --extra examples -m newton.examples recording uv run --extra examples -m newton.examples replay_viewerexample_recording.py在多个世界中仿真人形机器人并把模型与状态快照写入humanoid_recording.bin在 replay viewer 中选择该文件即可滑动浏览捕获的状态快照。对应源码见 newton/examples/basic/example_recording.py 与 newton/examples/basic/example_replay_viewer.py。内存与磁盘控制ViewerFile会捕获所记录State的所有直接 Warp 数组属性无论用set_visible_worlds选择了哪些世界——因此大状态与长运行会占用可观的内存与磁盘。构造时设置max_history_size只保留最近的有界数量的快照内部使用默认容量 100 的环形缓冲见 viewer_file.py。按世界捕获目前尚不支持。6.2 渲染为 USDViewerUSD除实时渲染外还可以用ViewerUSD把仿真渲染为带时间采样的 USD 场景供 Omniverse 或其他 USD 兼容工具可视化viewer newton.viewer.ViewerUSD(output_pathsimulation.usd, fps60, up_axisZ) viewer.set_model(model) # at every frame: viewer.begin_frame(sim_time) viewer.log_state(state) viewer.end_frame() # Save and close the USD file viewer.close()七、外部集成7.1 Rerun ViewerViewerRerunViewerRerun集成 rerun 可视化库支持实时或离线可视化并提供时间轴拖拽time scrubbing与数据检查等高级功能。安装pip install rerun-sdk用法# Default usage: spawns a local viewer viewer newton.viewer.ViewerRerun( app_idnewton-simulation ) # Or specify a custom server address for remote viewing viewer newton.viewer.ViewerRerun( addressrerunhttp://127.0.0.1:9876/proxy, app_idnewton-simulation ) viewer.set_model(model) # at every frame: viewer.begin_frame(sim_time) viewer.log_state(state) viewer.end_frame()默认情况下Viewer 不保留历史状态数据从而在通过log_state持续发送变换更新时保持内存占用恒定——这对长时间复杂仿真尤其重要否则会迅速填满 Web Viewer 内存。若要在 Viewer 中保留历史状态把keep_historical_data设为True默认False。Rerun Viewer 提供基于 Web 的界面特性包括时间轴拖拽与播放控制3D 场景导航数据检查与过滤录制与导出能力。Jupyter Notebook 支持ViewerRerun构造时会自动检测是否运行于 Jupyter notebook 环境并自动生成输出控件。rerun SDK 提供了 Jupyter notebook 扩展也可用pip install rerun-sdk[notebook]手动安装扩展。用uv启动 Jupyter labuv run --extra notebook jupyter lab然后在 notebook 中导入rerun模块并创建 Viewer 实例viewer newton.viewer.ViewerRerun(keep_historical_dataTrue) viewer.set_model(model) frame_dt 1 / 60.0 sim_time 0.0 for frame in range(500): # simulate, step the solver, etc. solver.step(...) # visualize viewer.begin_frame(sim_time) viewer.log_state(state) viewer.end_frame() sim_time frame_dt viewer.show_notebook() # or simply viewer to display the viewer in the notebook开启keep_historical_dataTrue后Viewer 中保留全部状态历史可在时间轴上滑动浏览仿真全程。7.2 Viser ViewerViewerViserViewerViser集成 viser 可视化库提供在任何浏览器中可用的 Web 3D 可视化并原生支持 Jupyter notebook。安装pip install viser用法# Default usage: starts a web server on port 8080 viewer newton.viewer.ViewerViser(port8080) # Open http://localhost:8080 in your browser to view the simulation viewer.set_model(model) # at every frame: viewer.begin_frame(sim_time) viewer.log_state(state) viewer.end_frame() # Close the viewer when done viewer.close()录制与回放ViewerViser可以把仿真录制为.viser文件供后期回放# Record to a .viser file viewer newton.viewer.ViewerViser(record_to_visermy_simulation.viser) viewer.set_model(model) # Run simulation... for frame in range(500): viewer.begin_frame(sim_time) viewer.log_state(state) viewer.end_frame() sim_time frame_dt # Save the recording viewer.save_recording()录制的.viser文件可用 viser 的 HTML player 回放。Jupyter Notebook 支持ViewerViser原生集成 Jupyter启用录制后调用show_notebook()会显示带时间轴控件的内嵌播放器viewer newton.viewer.ViewerViser(record_to_visersimulation.viser) viewer.set_model(model) # Run simulation... for frame in range(500): viewer.begin_frame(sim_time) viewer.log_state(state) viewer.end_frame() sim_time frame_dt # Display in notebook with timeline controls viewer.show_notebook() # or simply viewer at the end of a cell未启用录制时show_notebook()在 IFrame 中显示实时服务器。Viser Viewer 的特性包括任何 Web 浏览器中的实时 3D 可视化交互式相机控制平移、缩放、轨道GPU 加速的批量网格渲染录制与回放能力通过 viser 的分享功能发布公共 URL。八、工具 ViewerNull ViewerViewerNull是 no-op Viewer用于不需要可视化的无头环境或自动化测试——它只计数帧并为所有 Viewer 方法提供桩实现见 newton/_src/viewer/viewer_null.pybuilder newton.ModelBuilder() body builder.add_body(mass1.0) model builder.finalize() state model.state() sim_time 0.0 viewer newton.viewer.ViewerNull(num_frames10) viewer.set_model(model) while viewer.is_running(): viewer.begin_frame(sim_time) viewer.log_state(state) viewer.end_frame() sim_time 1.0 / 60.0 print(fRan {viewer.frame_count} frames)输出Ran 10 frames特别适用于无渲染开销的性能基准测试CI/CD 流水线中的自动化测试无头服务器上运行仿真仿真批量处理。九、自定义可视化叠加调试覆盖层除用log_state渲染仿真状态外还可以用所有 Viewer 共有的log_*方法绘制自定义调试覆盖层。下文代码在 docs/guide/visualization.rst 的基础上补充了各方法的签名细节与 ViewerBase 中的抽象定义一一对应。9.1 绘制线段用log_lines绘制线段适合可视化力、射线或法线starts/ends为wp.array[wp.vec3]width参数目前保留用于未来世界空间线宽实际像素宽度由渲染器控制# Draw force vectors at body positions viewer.log_lines( /debug/forces, startspositions, # wp.array[wp.vec3] endspositions forces, # wp.array[wp.vec3] colors(1.0, 0.0, 0.0), # red width0.005, )9.2 绘制点云用log_points绘制点云radii可为统一半径或wp.array[wp.float32]逐点半径viewer.log_points( /debug/targets, pointstarget_positions, # wp.array[wp.vec3] radii0.02, # uniform radius, or wp.array[wp.float32] colors(0.0, 1.0, 0.0), # green )9.3 可视化接触用log_contacts(contacts, state)从newton.Contacts对象绘制接触法线。Viewer 的show_contacts标志可在ViewerGL侧边栏切换控制整体可见性viewer.log_contacts(contacts, state)从源码看接触可视化分为三个可独立开关的图层viewer.py/contacts/normals— 沿rigid_contact_normal的箭头绿色由show_contact_normals控制/contacts/modes— 每个接触点处的薄朝向圆盘按推断的接触模式着色open 为黑色、stick 为浅灰、slip 为蓝色阈值由contact_mode_eps_force默认1e-4与contact_mode_eps_velocity默认1e-3控制要求contacts.force已分配/contacts/forces— 沿contacts.force线性部分的箭头品红色由show_contact_forces控制同样要求force扩展接触属性。接触法线、模式圆盘与力箭头的大小相对每个接触对中较小形状缩放侧边栏的 Contact Relative Scalecontact_viz_scale可统一调整所有接触字形而保持不同大小接触间的比例。set_model时 Viewer 会根据模型估计场景尺度并自动适配接触可视化比例contact_force_scale依据模型总质量与重力自适应见 viewer.py。接触模式着色与力箭头需要force扩展接触属性。9.4 变换坐标轴小控件用log_gizmo在给定变换处显示坐标系小控件源码签名还支持translate/rotate轴选择与snap_to吸附目标见 viewer.pyviewer.log_gizmo(/debug/target_frame, wp.transform(pos, rot))9.5 记录图像用log_image显示图像包括newton.sensors.SensorTiledCamera的批量/拼接输出。默认情况下非 headless 的ViewerGL把日志图像显示为可停靠窗口传fullscreenTrue则把图像作为当前帧的主 Viewer 表面而非 3D 场景。可接受的形状为(H, W)、(H, W, C)、(N, H, W)、(N, H, W, C)其中C in (1, 3, 4)可接受的数据类型为uint8值域[0, 255]与float32值域[0, 1]越界值被裁剪。from newton.sensors import SensorTiledCamera builder newton.ModelBuilder() builder.add_body(mass1.0) model builder.finalize() viewer newton.viewer.ViewerNull() viewer.set_model(model) # Grayscale heatmap: normalize to [0, 1] before logging so float32 # values land in the accepted range. depth_image np.full((16, 16), 2.0, dtypenp.float32) heatmap depth_image / max(depth_image.max(), 1e-6) viewer.log_image(heatmap, heatmap) # Batched color tiles from a tiled-camera sensor. Allocate the sensor # output once and reuse it every frame; the RGBA conversion is a # zero-copy view. sensor SensorTiledCamera(modelmodel) W, H, camera_count 16, 16, 1 color_image sensor.utils.create_color_image_output(W, H, camera_count) # ... in a real pipeline, sensor.update(...) fills color_image each frame. rgba sensor.utils.to_rgba_from_color(color_image) viewer.log_image(tiled_camera, rgba)形状歧义规则3D 输入中若最后一维为 1、3 或 4则按单张(H, W, C)图像解释否则按批量(N, H, W)灰度图解释。若歧义影响结果请显式传入 4D 数组。fullscreenTrue适用于图像优先型 Viewer、相机调试视图或无头帧捕获等需要图像取代 3D 场景的场景from newton.sensors import SensorTiledCamera builder newton.ModelBuilder() builder.add_body(mass1.0) model builder.finalize() viewer newton.viewer.ViewerNull() viewer.set_model(model) sensor SensorTiledCamera(modelmodel) W, H, camera_count 16, 16, 1 color_image sensor.utils.create_color_image_output(W, H, camera_count) # ... in a real pipeline, sensor.update(...) fills color_image each frame. rgba sensor.utils.to_rgba_from_color(color_image) viewer.log_image(tiled_camera, rgba, fullscreenTrue)fullscreenTrue是逐帧选择需要在每一帧的begin_frame之后、end_frame之前调用log_image(..., fullscreenTrue)若某帧未记录全屏图像ViewerGL该帧渲染 3D 场景。图像渲染目前仅由ViewerGL实现其他后端继承 no-op 基类实现会同时忽略图像与fullscreen选项。9.6 相机与世界布局程序化设置相机camera_speed单位 m/sviewer.set_camera(poswp.vec3(5.0, 2.0, 3.0), pitch-0.3, yaw0.5) viewer.camera_speed 0.2 # m/s可视化多个世界时用set_world_offsets以网格排布必须在set_model之后调用viewer.set_world_offsets(spacing(5.0, 5.0, 0.0))十、进阶Layer 多模型叠加渲染从 ViewerBase 的源码结构可以看到Newton 的 Viewer 还内置了Layer 机制一个 Viewer 可注册多个渲染层每层拥有独立的模型、形状实例批次、接触/关节缓存、可见性与渲染变换。通过activate(layer_id)切换后续set_model/log_state/log_*调用的写入目标对象名自动加上/layers/layer_id前缀以避免命名冲突set_layer_visible切换层的可见性set_layer_transform可让多层并排、叠加或旋转对比如多求解器同场景对照。默认层保留传统的不带前缀行为保证既有示例与测试不变。这在多求解器对比例如仓库中example_basic_multi_solver_overlay.py一类的场景中是重要的调试利器。结语Newton 的 Viewer 体系覆盖了从交互式实时调试ViewerGL/ViewerRTX、持久化状态录制回放ViewerFile/ViewerUSD到浏览器/笔记本可视化ViewerRerun/ViewerViser和无头自动化ViewerNull的完整工作流。所有后端共享ViewerBase的统一接口与显式日志哲学场景结构交给set_model运动交给每帧的log_state诊断数据通过log_lines/log_points/log_contacts/log_scalar/log_image按需叠加。理解这套接口后你可以让同一份仿真代码在本地窗口、无头 CI、Jupyter notebook 或 USD 管线之间无缝切换并将调试数据以可复现、可分享的形式沉淀下来。【免费下载链接】newtonAn open-source, GPU-accelerated physics simulation engine built upon NVIDIA Warp, specifically targeting roboticists and simulation researchers.项目地址: https://gitcode.com/GitHub_Trending/newton9/newton创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网