EG/TransformGizmo/docs/transform_gizmo_events.md
2026-02-25 11:53:06 +08:00

105 lines
3.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# TransformGizmo 事件钩子使用说明
本文档说明如何在 `TransformGizmo` 初始化时注入拖拽事件回调(类似 C# 委托),以及各事件的负载字段。
## 事件常量
所有事件名集中在 `TransformGizmo.events.GizmoEvent`,避免拼写错误:
```python
from src.TransformGizmo.events import GizmoEvent
GizmoEvent.DRAG_START # "drag_start"
GizmoEvent.DRAG_MOVE # "drag_move"
GizmoEvent.DRAG_END # "drag_end"
GizmoEvent.ALL # ("drag_start", "drag_move", "drag_end")
```
## 基础用法示例
在构造 `TransformGizmo` 时传入 `event_hooks`,按 handle 类型分组(`"move"`, `"rotate"`, `"scale"` 或对应 `TransformGizmoMode` 值),每组里是事件名到回调列表的映射:
```python
from src.TransformGizmo.transform_gizmo import TransformGizmo, TransformGizmoMode
from src.TransformGizmo.events import GizmoEvent
def on_move_start(info):
print("[move] start", "axis", info["axis"], "plane", info["plane"])
def on_move_drag(info):
print("[move] pos ->", info["new_pos"])
def on_rotate_drag(info):
print("[rotate] delta_deg =", info["delta_deg"])
def on_scale_end(info):
print("[scale] final_scale =", info["final_scale"])
hooks = {
TransformGizmoMode.MOVE: {
GizmoEvent.DRAG_START: [on_move_start],
GizmoEvent.DRAG_MOVE: [on_move_drag],
},
TransformGizmoMode.ROTATE: {
GizmoEvent.DRAG_MOVE: [on_rotate_drag],
},
TransformGizmoMode.SCALE: {
GizmoEvent.DRAG_END: [on_scale_end],
},
}
# world: 你的 Panda3DWorld 实例
gizmo = TransformGizmo(world, event_hooks=hooks)
```
### 运行时追加 / 移除
初始化后也可以直接操作子 gizmo 的钩子列表:
```python
from src.TransformGizmo.events import GizmoEvent
gizmo.move_gizmo._event_hooks[GizmoEvent.DRAG_MOVE].append(on_move_drag)
# 移除同理,用 list.remove(on_move_drag)
```
## 回调负载字段
各事件都会传入一个 `dict`,常见字段如下(不存在的字段将为 `None` 或缺省):
### Move
- `axis`0/1/2X/Y/Z平面拖拽时为 `None`
- `plane`0/1/2XY/YZ/ZX轴拖拽时为 `None`
- `mouse``Point2`,拖拽开始/过程中鼠标 NDC 坐标
- `start_pos` / `new_pos` / `final_pos`:世界坐标 `Vec3`
- `target`:当前绑定的 `NodePath`
- `gizmo`:字符串 `"move"`
### Rotate
- `mode``"axis"` 或 `"trackball"`
- `axis`0/1/2X/Y/Z轨迹球时为 `None`
- `delta_deg`:本次 `drag_move` 的角度增量(度)
- `start_quat`:拖拽开始时的世界四元数
- `final_hpr`:拖拽结束时的世界 HPR`drag_end`
- `center`gizmo 中心点(世界坐标)
- `axis_world`:当前旋转轴的世界方向
- `mouse``Point2`
- `target``gizmo` 同上
### Scale
- `axis`0/1/2 对应 X/Y/Z3 表示中心均匀缩放
- `scale_factor`:本次 `drag_move` 计算出的缩放倍率
- `start_scale` / `new_scale` / `final_scale``Vec3`
- `mouse``Point2`
- `target``gizmo` 同上
## 小贴士
- 事件字典的键可以用字符串 `"move"`/`"rotate"`/`"scale"`,也可以用 `TransformGizmoMode` 的对应值,内部都会匹配。
- 每个事件支持多个回调(列表),内部对单个回调异常做了 try/except互不影响。
- 如果只想监听部分事件,留空即可,内部会自动填充为空列表。