___ ___ ___ ___ ___ ___ ___ ___ ___ ___ _____ ___
/ /\ /__/\ / /\ /__/\ / /\ / /\ / /\ /__/| / /\ / /\ / /::\ / /\ ___
/ /:/ \ \:\ / /::\ \ \:\ / /::\ / /::\ / /::\ | |:| / /:/_ / /::\ / /:/\:\ / /:/_ /__/\
/__/::\ \__\:\ / /:/\:\ \ \:\ / /:/\:\ / /:/\:\ / /:/\:\ | |:| / /:/ /\ / /:/\:\ / /:/ \:\ / /:/ /\ \ \:\
\__\/\:\ ___ / /::\ / /:/ \:\ _____\__\:\ / /:/~/:/ / /:/~/::\ / /:/~/:/ __| |:| / /:/ /:/_ / /:/~/:/ /__/:/ \__\:| / /:/ /:/_ \ \:\
\ \:\ /__/\ /:/\:\ /__/:/ \__\:\ /__/::::::::\ /__/:/ /:/ /__/:/ /:/\:\ /__/:/ /:/___ /__/\_|:|____ /__/:/ /:/ /\ /__/:/ /:/___ \ \:\ / /:/ /__/:/ /:/ /\ ___ \__\:\
\__\:\ \ \:\/:/__\/ \ \:\ / /:/ \ \:\~~\~~\/ \ \:\/:/ \ \:\/:/__\/ \ \:\/:::::/ \ \:\/:::::/ \ \:\/:/ /:/ \ \:\/:::::/ \ \:\ /:/ \ \:\/:/ /:/ /__/\ | |:|
/ /:/ \ \::/ \ \:\ /:/ \ \:\ ~~~ \ \::/ \ \::/ \ \::/~~~~ \ \::/~~~~ \ \::/ /:/ \ \::/~~~~ \ \:\/:/ \ \::/ /:/ \ \:\| |:|
/__/:/ \ \:\ \ \:\/:/ \ \:\ \ \:\ \ \:\ \ \:\ \ \:\ \ \:\/:/ \ \:\ \ \::/ \ \:\/:/ \ \:\__|:|
\__\/ \ \:\ \ \::/ \ \:\ \ \:\ \ \:\ \ \:\ \ \:\ \ \::/ \ \:\ \__\/ \ \::/ \__\::::/
\__\/ \__\/ \__\/ \__\/ \__\/ \__\/ \__\/ \__\/ \__\/ \__\/ ~~~~
___ ___ ___ ___ ___ ___ ___ ___ ___ ___
/__/\ / /\ / /\ / /\ / /\ / /\ / /\ / /\ /__/\ / /\
\ \:\ / /::\ / /::\ / /:/_ / /:/ / /::\ / /:/_ / /:/_ \ \:\ / /:/_
\__\:\ / /:/\:\ ___ ___ / /:/\:\ / /:/ /\ / /:/ / /:/\:\ / /:/ /\ / /:/ /\ \ \:\ / /:/ /\
___ / /::\ / /:/ \:\ /__/\ / /\ / /:/ \:\ / /:/ /::\ / /:/ ___ / /:/~/:/ / /:/ /:/_ / /:/ /:/_ _____\__\:\ / /:/ /::\
/__/\ /:/\:\ /__/:/ \__\:\ \ \:\ / /:/ /__/:/ \__\:\ /__/:/ /:/\:\ /__/:/ / /\ /__/:/ /:/___ /__/:/ /:/ /\ /__/:/ /:/ /\ /__/::::::::\ /__/:/ /:/\:\
\ \:\/:/__\/ \ \:\ / /:/ \ \:\ /:/ \ \:\ / /:/ \ \:\/:/~/:/ \ \:\ / /:/ \ \:\/:::::/ \ \:\/:/ /:/ \ \:\/:/ /:/ \ \:\~~\~~\/ \ \:\/:/~/:/
\ \::/ \ \:\ /:/ \ \:\/:/ \ \:\ /:/ \ \::/ /:/ \ \:\ /:/ \ \::/~~~~ \ \::/ /:/ \ \::/ /:/ \ \:\ ~~~ \ \::/ /:/
\ \:\ \ \:\/:/ \ \::/ \ \:\/:/ \__\/ /:/ \ \:\/:/ \ \:\ \ \:\/:/ \ \:\/:/ \ \:\ \__\/ /:/
\ \:\ \ \::/ \__\/ \ \::/ /__/:/ \ \::/ \ \:\ \ \::/ \ \::/ \ \:\ /__/:/
\__\/ \__\/ \__\/ \__\/ \__\/ \__\/ \__\/ \__\/ \__\/ \__\/
Um cockpit de telas-holograma flutuando em 3D, renderizado no seu monitor comum — navegado pelo giroscópio do celular, pelo rosto via webcam, ou pelo mouse. Como usar um headset de VR sentado (estilo Immersed / Virtual Desktop), só que sem headset nenhum.
Você dispõe várias "telas" num arco/cilindro ao seu redor, coloca em cada uma um app capturado, um vídeo do YouTube, um GIF, um site ou um widget — e passeia entre elas movendo o celular ou a cabeça, com zoom, foco e efeito de brilho ambiente (ambilight).
⚠️ Plataforma: o app roda no Windows (a ponte de captura/foco de janelas e os widgets de sistema usam PowerShell + APIs do Windows). O renderer 3D é web (Three.js) e roda em qualquer navegador Chromium (Chrome/Edge/Brave).
O ambiente virtual em ação — telas-holograma dispostas em 3D ao redor do usuário:
- 🖥️ Telas em 3D — quantas quiser (até 8), dispostas num arco/cilindro ao seu redor.
- 📱 Controle por giroscópio — abra uma página no celular e mova o aparelho pra olhar em volta.
- 📷 Head tracking pela webcam — mova a cabeça pra mover a câmera (MediaPipe FaceLandmarker).
- 🖱️ Controle por mouse — arraste pra olhar, scroll pra zoom (fallback sem celular).
- 🪟 Captura de apps — coloque qualquer janela/app/monitor ao vivo dentro de uma tela.
▶️ YouTube — pesquise (sem API key) e assista vídeos embutidos e interativos.- 🖼️ Mídia — fotos e GIFs animados (por URL ou arquivo local).
- 🌐 Web screens — sites/dashboards interativos via iframe em 3D.
- 🕒 Widgets — relógio e monitor de sistema (CPU / GPU / RAM + clima).
- 🎯 Entrar na tela — traz a janela real pra frente pra você usar com mouse/teclado nativos.
- 🔀 Reordenar arrastando + adicionar/remover telas no painel.
- 🎨 19 temas (dia/tarde/noite, neon, vaporwave, aurora…) + modo chuva com som procedural.
- ✨ Glow ambilight — cada tela emite um halo com as cores do próprio conteúdo.
- 💾 Persistência — telas, temas e layout voltam após o F5.
- 💻 Tela de abertura com arte ASCII e "carregando".
- Windows 10/11
- Node.js (versão 18 ou superior)
- Um navegador Chromium (Chrome, Edge ou Brave) — necessário pra captura de tela
- PC e celular na mesma rede Wi-Fi (se for usar o controle por celular)
# 1. clone o repositório
git clone https://github.com/thomasnrs/holo-screenVR.git
cd holo-screenVR
# 2. instale as dependências
npm install
# 3. suba o servidor (gera o certificado HTTPS na 1ª vez)
npm startO terminal vai mostrar dois endereços:
No PC (monitor): https://localhost:8443/
No celular: https://192.168.0.X:8443/phone
- No PC: abra
https://localhost:8443/no Chrome/Edge/Brave. - No celular (mesma Wi-Fi): abra o endereço
/phone— comhttps://e a porta:8443. - Como o certificado é autoassinado, o navegador vai avisar → Avançado → Prosseguir (faça isso nos dois dispositivos).
- No celular, toque em Ativar sensores e comece a mover o aparelho. 🎉
💡 Se o celular der timeout, libere a porta no Firewall do Windows (PowerShell como Admin):
New-NetFirewallRule -DisplayName "Holo-Screens 8443" -Direction Inbound -Protocol TCP -LocalPort 8443 -Action Allow
| Tecla | Ação |
|---|---|
G |
Alterna giroscópio / mouse |
F |
Liga/desliga head tracking pela webcam |
R |
Recentraliza a "frente" (e recalibra o rosto) |
Tab |
Alterna navegar ↔ interagir (clicar em vídeos/sites) |
Enter |
Entra na tela central (traz a janela real pra frente) |
B |
Próximo tema |
C |
Liga/desliga a chuva 🌧️ |
H |
Esconde/mostra o HUD |
| scroll | Zoom (aproxima/afasta) |
| arrastar | Olhar em volta (modo mouse) |
- Mover o aparelho → olha em volta · Pinça (2 dedos) → zoom
- Sensibilidade (slider) · Recentralizar · Entrar na tela / Cockpit
- Tela N ▸ capturar — escolhe a janela/app pra exibir
- + adicionar tela · + relógio 🕒 · + sistema 📊 · + mídia 🖼️ · + youtube
▶️ - Arraste uma linha sobre outra pra reordenar · × remove a tela
Por padrão, você captura janelas/apps que já estão no seu monitor. Mas dá pra ir além: criar monitores virtuais (telas extras headless, sem painel físico) e jogar os apps neles. Assim o cockpit 3D fica no seu monitor real enquanto os apps "moram" em telas off-screen dedicadas — você os vê no 3D e os controla com mouse/teclado nativos, sem nunca sair do cockpit.
Isso usa um driver de display virtual (IddCx). O mais usado e gratuito é o Virtual Display Driver (VDD), controlado pelo app VDC (Virtual Driver Control).
⚠️ É um driver de kernel — exige permissão de administrador e um reboot. Instale por sua conta e risco. Desinstale o VDD antes de atualizar drivers de GPU (evita tela preta).
- Instale o app de controle (PowerShell como Administrador):
winget install --id=VirtualDrivers.Virtual-Display-Driver -e
Precisa do Microsoft Visual C++ Redistributable (já vem na maioria dos PCs). Alternativa: baixar o VDC na página de releases.
- Reinicie o PC.
- Abra o VDD Control:
(ou procure por VDD Control no menu Iniciar)
"%LOCALAPPDATA%\Microsoft\WinGet\Links\VDD Control.exe" - Clique em Install Driver e aprove o UAC — isso cria o adaptador de vídeo virtual.
- Ainda no VDC, defina quantos monitores virtuais quer (ex.: 4) e deixe-os habilitados
(também dá pra editar
C:\VirtualDisplayDriver\vdd_settings.xml). A tela pode piscar — normal. - Confirme que apareceram (na pasta
holo-screens):Você deve verpowershell -File "server\winbridge.ps1" -Action monitors
DISPLAY2,DISPLAY3… além do seu monitor real. - Mova os apps para os monitores virtuais (
Win+Shift+←/→, ou arrastando) e capture cada monitor numa tela do cockpit (painel Tela N ▸ capturar → escolha o monitor).
ℹ️ Como o Windows tem uma única fila de input, você controla um monitor por vez (igual a uma área de trabalho estendida normal) — perfeito pra olhar tudo no 3D e interagir com um foco.
┌─────────────────┐ WebSocket (HTTPS) ┌──────────────────────────┐
│ CELULAR │ ── orientação + gestos ──► │ SERVIDOR (Node) │
│ (giroscópio) │ │ relay + ponte Windows │
└─────────────────┘ └──────────┬───────────────┘
│ captura/foco de
┌─────────────────┐ │ janelas, stats…
│ PC / MONITOR │ ◄── posição da câmera, conteúdo ──────┘
│ Three.js 3D │
│ telas no arco │ captura de tela via getDisplayMedia (navegador)
└─────────────────┘
pc/— renderer Three.js que roda no monitor (cena, câmera, telas, widgets, efeitos).phone/— página de controle do celular (giroscópio + toques).server/— servidor HTTPS + relay WebSocket + ponte com o Windows (PowerShell).
Three.js vem via CDN (importmap) — não há etapa de build.
- Three.js — renderização 3D (WebGL + CSS3D)
- ws — WebSocket (Node)
- MediaPipe Tasks Vision — head tracking
- PowerShell / Win32 — captura, foco de janelas e stats de sistema
- getDisplayMedia — captura de telas/janelas no navegador
- Captura de tela só funciona em navegadores Chromium (não no navegador embutido do VS Code).
- Após o F5, o vídeo ao vivo das capturas precisa de 1 clique pra reativar (segurança do navegador) — a associação de controle persiste; só o stream visual precisa do reclique.
- Mídia por arquivo local não persiste no F5 (vira
blob:); use URL se quiser que volte. - Web screens só abrem sites que permitem iframe (muitos bloqueiam via
X-Frame-Options). - Head tracking precisa de boa iluminação e consome CPU/GPU.
MIT — use, modifique e divirta-se. 🛸

