Mixed-reality finger painting on your real room, with vibrotactile texture feedback.
TactiPaint is a Meta Quest 3 / Quest 3S experience where you paint directly onto your physical environment — your desk, your walls — using nothing but your fingers. The room is scanned by the headset's depth sensors, your index fingers become brushes, and a pair of bHaptics TactGloves lets you feel what you paint: rock crackles under your fingertip, tile grout clicks as you cross it, ripples pulse as you sweep across them.
Built with Unity 6, the Meta XR SDK and MRUK (Mixed Reality Utility Kit).
- Right index finger paints color, left index finger paints surface relief (normal-map textures: rock, domed blobs, tile grid, waves — or smooth, which flattens relief away).
- Paint lands exactly on the scanned surface plane — strokes lock to the touched face (scene-anchor boxes or the room mesh), so painting on a table stays at one consistent height no matter how your finger wobbles.
- Color and relief compose: paint purple, rub relief over it and the purple gains bumps; recolor a textured area and it keeps its texture.
- Strokes are generated as real-time blob meshes (no LineRenderers), batched into one mesh per color/texture combination.
- Each relief texture has a distinct vibrotactile profile, designed around contrast (silence between sharp events): irregular crackle for rock, regular pops for blobs, hard sparse clicks for tile lines, fast directional ripples for waves.
- Feel mode: touch anything you've painted with any of your ten fingers and each finger independently plays the haptic profile of the texture under it.
- Haptics fire only while a finger is moving — a resting finger is silent, like real touch.
- Interface events have their own haptic vocabulary: wrist buzz for the menu toggle and slider, fingertip clicks for buttons and palette picks.
- Left inner wrist: menu button → mode panel (Feel / Paint / Erase / Clear-all).
- Right inner wrist: stroke-width slider with haptic detents.
- Paint mode palettes hover over your fingertips — colors on the left hand, normal-map spheres (showing actual lit relief) on the right. Touch a swatch with the other index finger to select; a small sphere on each painting fingertip shows the current selection.
- Everything is palm-gated: menus appear only while that palm faces you.
- A floating intro panel (with video) lazy-follows the user and dismisses with a fingertip touch.
- Take the headset off, hand it to the next person: on re-mount the scene wipes, defaults restore, and the intro menu + video restart automatically.
- Multimodal hand + controller tracking is enabled, so a Logitech MX Ink stylus can be used alongside hand tracking.
- Editor preview tool (
GameObject > FingerPaint > Hand Menu Preview) to tweak the hand-menu layout without deploying.
| Item | Notes |
|---|---|
| Meta Quest 3 or Quest 3S | depth-sensor room scanning (Space Setup) |
| bHaptics TactGlove (pair) | texture + UI haptics; app works without them, silently |
| Logitech MX Ink (optional) | tracked stylus, works alongside hands |
- Clone the repo:
git clone https://github.com/<your-username>/mixed-reality-tacti-paint.git - Unity 6000.3.x with Android build support.
- Open the project — key packages (Meta XR Core SDK v203, Meta XR Interaction SDK,
MRUK, bHaptics SDK2) restore via the Package Manager / are included in
Assets. - bHaptics key:
Assets/Bhaptics/SDK2/Resources/BhapticsSettings.assetis git-ignored (it holds a per-developer App ID / API key). Create an app in the bHaptics Developer Portal and enter your App ID + API key in that asset via the Unity inspector. - On the headset: run Space Setup (Settings → Physical Space) so a room scan with anchors (desk, walls) exists, and install the bHaptics Player app and pair your TactGloves to the headset.
- Open the scene
Assets/FingerPaintMesh.unity, Build & Run for Android. - First launch: grant the spatial data and Bluetooth permissions.
Assets/
FingerPaintMesh.unity main mixed-reality painting scene
Scripts/
FingerPaintMeshBootstrap.cs one-stop runtime setup (room mesh, brushes, rigs, menus)
FingerTipContact.cs fingertip surface detection (plane lock, collider preference)
FingerTipPainter.cs paint / erase per mode
FingerTipHaptic.cs per-texture vibrotactile profiles, motion-gated
MeshStampBrush.cs blob-mesh paint generation, coverage grid, eraser
HandPaintRig.cs per-hand fingertip rig (index paints, all fingers feel)
HandToolMenu.cs wrist menus, palettes, slider, selection indicators
HandMenuPreview.cs edit-mode layout preview
PaintModeManager.cs global mode / color / texture / width state
FloatingMenuController.cs head-following intro panel
Icons/ menu button icons
normalMap1.jpg + textures relief normal maps
This project was developed by Team TBD at the IVE Winter School 2026: Haptics in XR, held 13–17 July 2026 at the Mawson Lakes Campus of Adelaide University, Adelaide, Australia.
Team TBD:
- Mohamed Fareed
- Awnili Shabnam
- Forhad Hossain
- Rodrigo Dias Takase
- Rob Teather
The Winter School is a free five-day intensive short course offered by the Australian Research Centre for Interactive and Virtual Environments (IVE), exploring haptics and its applications in XR through expert talks, demonstrations of cutting-edge haptic technologies, hands-on learning activities, and collaborative team projects focused on real-world haptics applications. TactiPaint is Team TBD's team project from the program.
- Meta XR SDK, MRUK — Meta Platforms (Oculus SDK License).
- bHaptics SDK2 — bHaptics Inc.
- Built as a research prototype for tangible mixed-reality interaction.