On Mouse Move
Tipo: Branch (Moving / Still)
Categoría: EVENT
Detecta movimiento del cursor del ratón comparando su posición entre frames. Expone los deltas de movimiento en X e Y como sockets de datos.
Propiedades
| Propiedad | Tipo | Por defecto | Descripción |
|---|---|---|---|
| Threshold | Float (0.0001–0.1) | 0.001 |
Movimiento mínimo para considerar que el ratón se está moviendo |
Sockets
| Socket | Dirección | Tipo |
|---|---|---|
| In | Entrada | Exec |
| Moving | Salida | Exec (movimiento > threshold) |
| Still | Salida | Exec (sin movimiento) |
| Delta X | Salida | Data (Float) |
| Delta Y | Salida | Data (Float) |
Comportamiento
if not hasattr(self, '_mm_last'):
self._mm_last = Range.logic.mouse.position
_mm_cur = Range.logic.mouse.position
_mm_dx = _mm_cur[0] - self._mm_last[0]
_mm_dy = _mm_cur[1] - self._mm_last[1]
self._mm_last = _mm_cur
if abs(_mm_dx) > threshold or abs(_mm_dy) > threshold:
# → Moving
else:
# → Still
Sistema de coordenadas
Range.logic.mouse.position devuelve valores normalizados en el rango [0, 1]:
- (0, 0) = esquina superior izquierda
- (1, 1) = esquina inferior derecha
Los deltas también están normalizados. Para convertir a píxeles, multiplicar por la resolución de pantalla.
Variables de datos expuestas
Los sockets Delta X y Delta Y exponen las variables locales _mm_dx y _mm_dy. Se pueden leer en nodos de dato conectados:
# En un BTCustomTask conectado después:
dx = _mm_dx # disponible como variable local
dy = _mm_dy
Uso típico
Rotar cámara con el ratón
[On Update] → [On Mouse Move: Threshold=0.001]
└── Moving ──► [BTCustomTask]
# BTCustomTask:
cam = self.own.scene.active_camera
cam.applyRotation((0, 0, -_mm_dx * 0.5), False)
cam.applyRotation((_mm_dy * 0.5, 0, 0), True)
Detectar inactividad del ratón
[On Update] → [On Mouse Move]
├── Moving ──► [BT Set Blackboard: mouse_idle_timer = 0]
└── Still ──► [BTCustomTask:
self._bt_bb['mouse_idle_timer'] = self._bt_bb.get('mouse_idle_timer', 0) + Range.logic.deltaTime()]
Activar cursor visual al mover
[On Update] → [On Mouse Move]
├── Moving ──► [BTCustomTask: show_cursor()]
└── Still ──► (cursor ya visible, no hacer nada)
Ajuste del Threshold
| Threshold | Sensibilidad |
|---|---|
0.0001 |
Muy sensible — detecta movimientos mínimos (tembladera) |
0.001 |
Normal — ignora micro-vibraciones del sensor |
0.01 |
Poco sensible — solo movimientos amplios |
Notas
- El primer frame siempre va a
Still(la posición inicial se inicializa igual a la actual → delta = 0). - Si el cursor está bloqueado en el centro de la pantalla (modo FPS), los deltas seguirán funcionando porque
mouse.positionreporta la posición antes del recentrado. - Los deltas son siempre en espacio de pantalla normalizado — no dependen de la resolución.
- Para scroll del ratón (rueda), usar un nodo de la categoría MOUSE o leer
Range.logic.mouse.wheel.