🎨 渲染器(RenderApp)#

启动与加载#

RenderApp 负责基本的场景渲染。一般的,在代码中创建一个 RenderApp 实例,通过 load_model 加载模型后调用 render.launch(model) 来为渲染器加载模型。

同步#

在主循环中,推荐每经过一次物理模拟 step 之后,调用 render.sync(data) 进行渲染双向同步更新。

用户也可按实际需求自行调整 step 与 sync 之间的倍率。

同步的内容包括:

  • 向渲染器发送物理模拟数据、自定义 UI 组件、gizmos 绘制等指令

  • 从渲染器获取 IO 输入事件。

自定义 UI 组件#

目前支持按钮 add_button 与复选框 add_toggle 两种组件,通过设置回调函数的方式来响应用户的点击事件。

用户需要通过 render.opt.set_left_panel_vis(True) 来显示左侧面板,组件会按添加顺序显示在面板上。

force = 10

# button
def on_click():
    nonlocal force
    print("Button clicked!")
    model.get_actuator("actuator_slider").set_ctrl(data, force)
    force = -force

def on_toggle_changed(value: bool):
    print("toggle value:", value)

render.opt.set_left_panel_vis(True)
render.ui.add_button("Click Me", on_click)
render.ui.add_toggle("Some Toggle", False, on_toggle_changed)

完整代码见 examples/custom_ui.py

Gizmos 绘制#

Gizmos 是一种用于辅助调试的图形元素,渲染器提供了一个简单的 API 来绘制 gizmos。

Gizmos 采用即时模式,即使不需要更新,用户也需要在每次渲染同步时添加 gizmos。

目前支持球体 draw_sphere 与立方体 draw_cuboid 两种形状的 gizmos。

# gizmos is drawning in immediate mode. so you must call it every frame
render.gizmos.draw_sphere(0.1, np.array([x, 0, 1]), color=Color.rgb(1, 0, 0))

render.gizmos.draw_cuboid(
    size=np.array([0.2, 0.3, 0.4]), pos=np.array([1, 0, 1]), rot=rot.as_quat(), color=Color.rgb(0, 1, 0)
)

render.gizmos.draw_cuboid(
    size=np.array([0.1, 0.1, 1]), pos=np.array([3, 0, 1]), rot=rot.as_quat(), color=Color.rgb(0, 1, 0)
)

render.gizmos.draw_capsule(0.5, 0.5, pos=np.array([1, 1, 1]), rot=Rotation.identity().as_quat())
render.gizmos.draw_cylinder(0.5, 0.5, pos=np.array([2, 1, 1]), rot=Rotation.identity().as_quat())
render.gizmos.draw_arrow(start=np.array([3, 1, 1]), end=np.array([4, 2, 1]), color=Color.rgb(1, 1, 0))
render.gizmos.draw_line(start=np.array([3, 2, 1]), end=np.array([4, 3, 1]), color=Color.rgb(1, 1, 0))
render.gizmos.draw_ray(start=np.array([4, 1, 1]), vector=np.array([3, 0.2, 0]), color=Color.rgb(1, 1, 0.2))
render.gizmos.draw_grid(
    pos=np.array([0, -2, 1]),
    rot=rot.as_quat(),
    color=Color.rgb(1, 0.5, 0.2),
)
render.gizmos.draw_rect(
    pos=np.array([3, -2, 1]),
    rot=Rotation.identity().as_quat(),
    width=1.5,
    height=3.5,
    color=Color.rgb(0.5, 1, 0.2),
)

完整代码见 examples/gizmos.py

IO 输入事件#

通过 render.input 可以获取到Input对象,Input 对象提供了一系列方法,用于查询渲染器的鼠标、键盘以及 UI 事件。

您可以通过以下的例子来了解更详细的用法:

合法键盘输入列表#

以下是支持的键盘按键输入列表:

按键类型

示例按键

字母键

A, B, ..., Z

功能键

F1, F2, ..., F12

特殊键

Enter, Esc, Space

方向键

Up, Down, Left, Right

注意:以上均不区分大小写,表格内未提及的键位暂不支持。

摄像头控制#

渲染器提供了一个自由的摄像头控制系统,用户可以通过鼠标操作来控制摄像头的视角和焦点(始终位于屏幕中心)。

  • 鼠标左键按下并拖动:绕着焦点旋转摄像头

  • 鼠标右键按下并拖动:移动焦点(此时显示红圈为焦点)

  • 鼠标滚轮:缩放(到焦点位置不可再放大)

单模型多实例渲染#

render.launch(model) 还有 repeat:int 与 render_offset:List[:3] 两个可选参数,在需要单个模型多实例渲染时,分别用于设置实例数与偏移位置。

# Create the render instance of the model
# Try to create 3 model data
repeat = 3
render_offset_1 = [0, 0, 0]
render_offset_2 = [0, 1, 0]
render_offset_3 = [0, -1, 0]
render.launch(model, repeat, [render_offset_1, render_offset_2, render_offset_3])

完整代码见 examples/model.py