
# Movable

The `Movable` component wraps objects to make them draggable and repositionable.
This is essential for:
- Creating interactive robot teleoperation interfaces
- Building drag-and-drop 3D editors
- Allowing users to reposition objects in VR/AR
- Implementing interactive demonstrations

## Basic Usage

A minimal example that creates a draggable gripper:

```python
import asyncio
from vuer import Vuer, VuerSession
from vuer.schemas import DefaultScene, Movable, Gripper, Sphere, OrbitControls

app = Vuer()

@app.add_handler("OBJECT_MOVE")
async def handler(event, session):
    print(f"Movement Event: key-{event.key}", event.value)

@app.spawn(start=True)
async def main(session: VuerSession):
    session.set @ DefaultScene(
        Movable(
            Gripper(key="gripper"),
            Sphere(args=[0.15], position=[0.3, 0, 0], key="sphere"),
            key="movable-gripper",
            position=[0, 0.5, 0],
        ),
        bgChildren=[OrbitControls(key="OrbitControls")]
    )

    while True:
        await asyncio.sleep(1.0)
```

## Key Parameters

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `key` | str | - | Unique identifier for the movable wrapper |
| `offset` | list | `[0,0,0]` | Optional [x, y, z] offset from the position |
| `position` | list | `[0,1,-1]` | Initial [x, y, z] position in world coordinates |
| `quaternion` | list | - | Optional [x, y, z, w] quaternion rotation |
| `rotation` | list | - | Optional [x, y, z] Euler rotation |
| `scale` | float/list | `0.1` | Float or [x, y, z] scale factor |
| `handle` | float/list | - | Optional handle size (overrides scale for handle geometry) |
| `showFrame` | bool | `True` | Show coordinate frame visualization |
| `wireframe` | bool | `False` | Enable wireframe rendering |
| `localRotation` | bool | `False` | Use local rotation instead of world rotation |



> **Detecting Movement**
>
> Listen to the `OBJECT_MOVE` event to track object movements:
> 
> **Event structure:**
python
{
    "key": "movable-gripper",
    "position": [x, y, z],
    "rotation": [rx, ry, rz, rw],  # Quaternion
}
```

