Primo impatto con Alexa / Amazon Echo

Ho recentemente testato Amazon Echo / Alexa (in particolare un Echo Plus e un Echo Spot) per la mia domotica (una domotica che nel mio piccolo considero ‘seria’, non semplicemente du’ device IoT tipo le luci Ikea o Hue).

In linea generale, è un ottimo prodotto. Mi sto attrezzando per piazzare diversi Echo in giro per casa per un’ampia copertura, per cui ho gradito così tanto il prodotto che NON indagherò se la soluzione Google è meglio o peggio. Feedback molto graditi comunque.

E’ un’intelligenza artificiale?

No. Qualsiasi frase fuori dai suoi pattern-matching non funziona.

>Alexa, sei meglio di Cortana?
>Mi piacciono tutte le intelligenze artificiali.

>Alexa, sei un’intelligenza artificiale?
>Purtroppo non trovo la risposta alla domanda.

>Alexa, quanto fa 2+2?
>2 più 2 uguale 4

>Alexa, quanto fa 5-20%?
>Il risultato del calcolo è -1.995.

(sia Wolfram Alpha che -bada bene- Windows Calc.exe rispondono 4.)

E’ un sistema di controllo per domotica?

Attualmente no.
Forse può essere considerato un sistema minimo in tal senso. Meglio considerarlo un’estensione, un helper di un sistema terze-parti di domotica.

Pare limitato e pensato per chi ha un numero di device che si contano con le dita, pochissime tipologie, pochissime feature supportate.
A spanne pare più una scelta di target che un peccato di gioventù.
Nel mio caso specifico ho oltre 70 devices listati nell’app Alexa: li elenca in ordine alfabetico, senza alcuna organizzazione tipica di altri sistemi di domotica (stanze, aree etc).
Usabilità UI scarsissima. Per dire, per rimuoverle tutte durante le prove, ho dovuto cliccarle una ad una, oltre a crash vari.

A titolo di esempio, la gestione termostato: accetta un

>Alexa, imposta termostato a 20

oppure

>Alexa, alza la temperature di 3 gradi

e qualcosa su modalità e scheduling. Nient’altro.

Non mi risulta sia preso in considerazione abitazioni con più termostati (per dire uno per piano), figuriamoci la gestione di temperature diverse a livello di singola stanza (generalmente gestiti con valvole di regolazione radiatori termici, a livello di calorifero o a livello di collettori nei riscaldamenti a pavimento). Roba che una qualsiasi centrale z-wave (da Fibaro a domoticz su Raspberry) gestisce facilmente.

Se avete un termostato di quelli supportati, fatemi sapere nei commenti o su Twitter se esiste un modo per chiedere la temperatura impostata o chiedere la temperatura rilevata, che non sia un’invocation a skill esterne.
Un

>Alexa, chiedi a Nest la temperatura impostata”

può essere accettabile, ma significa che Alexa non lo supporta di suo (come feature Smart Home).

E’ vera domotica? Funziona senza internet?

No. Il che a mio avviso lo rende totalmente e perennemente NON catalogabile come “sistema di gestione domotica”.
Nessun altro sistema di domotica closed (Fibaro per dire) o open (Konnex, Domoticz, OpenHab per dire) richiede internet per forza, funzionano ovviamente in lan.
Di fatto, è un helper, un gateway, niente di più.

Oltre al suo funzionamento di base, che richiede un riconoscimento vocale lato cloud, anche tutte le Skill per estenderlo sono necessariamente cloud-based.
Se avete un device IoT o generalmente un hardware comandabile in casa (per dire, una caldaia via seriale o modbus) dovete sperare che il produttore supporti Alexa (via cloud per forza) o implementarlo voi (in bocca al lupo).

Per me è inconcepibile che un sistema di domotica che deve funzionare IN CASA MIA debba dipendere da qualcosa ESTERNO A CASA MIA.
Ci si ritrova a dover avere un sistema di backup per forza (immaginate il dover aprire un cancello in mancanza di connessione internet).

Per capirci, neanche una lampadina Philips Hue o Ikea che controlla una lampadina dentro una plafoniera è domotica vera: se non si può riaccendere via app dopo aver premuto il pulsante a parete, trattasi di giocattolo, non domotica. Imho.

Personalizzazioni, adattamento a sistemi di domotica custom

Racconto la mia necessità.
Come già raccontato qui, ho un sistema custom, realizzato personale per hobby solo per casa mia, principalmente basato su uno standard hardware open chiamato Konnex, che -incredibilmente- Alexa non supporta di suo (ed è lo standard per eccellenza di domotica, supportato dalla maggior parte dei produttori di componentistica elettrica).

Per cui l’integrazione tra Alexa e il mio sistema di domotica è necessariamente (o banalmente…) che Alexa sia un’interfaccia per richieste REST/API via http a un mio Raspberry locale che gestisce a sua volta tutto (compreso Konnex).

Ci sono fondamentalmente due approcci (distinti): una Custom Skill o una Smart Home Skill.

  • Una Custom Skill permette potenzialmente qualsiasi interazione, ma necessita di essere invocata esplicitamente per nome.
  • Una Smart Home Skill permette di controllare devices (solo quelli previsti, da elencare preventivamente) senza invocazione, ma supporta pochissimi comandi.

Per farvi un’idea, Fibaro li supporta entrambi, per cui ha dovuto creare due skill distinte, la Smart Home per i comandi base e la Custom per tutti gli altri comandi.

La mia Custom Skill


Output di linux “uptime” via Custom Skill, “Raspberry” come invocation

Una Custom Skill significa dare un nome alla propria skill (nel mio caso Memole) e invocarla.
L’ho chiamata “Memole” per rendere la gestione della mia domotica user-friendly, famiglia-compatibile. Ho seriamente pensato di mettere un pupazzetto di Memole sopra ogni Alexa, per dargli un senso.
D’altro canto, che alternative mi permettono? “Raspberry”, “Casa” sarebbero nomi peggiori come invocation (Chiedi a Casa la temperatura? … madò).
Quindi:

> Alexa, chiedi a Memole la temperatura in cucina

significa implementare in Alexa Developer Console una skill Memole, un intent MyGetTemperature, e infine il match di un utterance, una frase che Alexa può riconoscere, tipo

> Alexa, chiedi a {skill-name} la temperatura in {parametro}

Così posso ottenere che mi chiama un url del mio Raspberry passandomi l’intent GetTemperature e parametro=cucina
Questo per OGNI pattern che voglio gestire.

  • Non c’è verso che l’url sia lan. Deve essere raggiungibile da AWS. Deve essere sotto HTTPS valido, e -incredibile ma vero- LetsEncrypt non è accettato. Nel mio caso, ho configurato un reverse-proxy dal mio dominio al mio raspberry di casa.
  • Non c’è verso di ricevere la frase intera chiesta ad Alexa. Di più, i parametri devono essere dei tipi specifici. Pare che supportavano un generico AMAZON.Literal a mò di stringa, per permettere un

    > Alexa, chiedi a Memole {stringa Amazon.Literal}

    in modo da smazzarmi raspberry-side richieste generiche, ma è stato deprecato, perchè Amazon pretende che le varie utterance siano il più possibile esplicite nel loro cloud.

La mia Smart Home Skill

Lo scopo è poter dire ad Alexa

Alexa, accendi luce cucina

il che significa che, come minimo:

  • Alexa dovrà chiamare un url sul mio raspberry per l’accensione
  • Alexa dovrà chiamare un url per sapere lo stato attuale

Gli step sono i seguenti:

  • Creare una skill Smart Home su Alexa Console
  • Creare una funzione lambda su AWS
  • Collegare la skill Alexa con la funzione lambda su AWS (e tutta la configurazione di autorizzazioni, oauth2, AWS role etc…)
  • Attivare la skill sul mio Alexa

A questo punto, parte una procedura chiamata Discovery: La funzione lambda chiama il mio raspberry per avere un elenco di devices, in modo che Alexa sappia quali capabilities supporta e come invocarle. L’elenco è qui.

Non mi dilungo per ora sull’implementazione della funzione lambda, mi limito a qualche perplessità:

  • Tutti i device generalmente on/off (luci o prese comandate) è solo questione di manovalanza.
  • Idem le luci dimmerabili o RGB, anche se non le ho ancora affrontate.
  • Ad oggi non ho ancora capito qual’è il Controller raccomandato/equivalente a un semplicissimo e banale click. Per dire, il The Button Fibaro.
    Ad esempio, il mio cancello elettrico, posso solo dargli un impulso “Apriti”, ma non è uno switch on/off e non posso saperne lo stato, e ad oggi non ho idea di come gestirlo con Alexa.
  • Non ho ancora capito come gestire motori. Di solito nella domotica generale han funzioni “avvia/ferma/direzione(apertura/chiusura)”. Forse devo usare un LockController, ma non ci sono ancora riuscito.
    Ad esempio, per un vasistas una funzione base è avviare l’apertura, e potergli dire ‘stop’ al momento giusto. Discorso simile basculanti garage.

Bon, per ora mi fermo qui, se avrò feedback magari estenderò qualche spiegazione.

Ciao!

My Home Automation – Memole

Aggiornato in dicembre 2019.

Qui racconto le soluzioni di home-automation che ho adottato in casa mia, progetto perennemente in corso. E’ sempre stato un sogno nel cassetto realizzare un prodotto (hardware+software) user-friendly e open-source dedicato alla home-automation, anche se non ho mai rilasciato nulla perchè ancora oggi sto usando casa mia come caso di studio e sviluppo :P.

Nel leggere il progetto di Francesco Tucci : La domotica fai da me mi è venuta voglia di raccontarvi il mio, molto simile come motivazione di base.

Premessa: NON mi occupo di questo per lavoro, l’ho realizzato negli anni SOLO per casa mia SOLO per hobby, anche se è sempre stato un sogno nel cassetto realizzare un prodotto per home-automation user-friendly  e open-source.

Come dice Francesco,

“Non sono dipendente da servizi che potrebbero fallire o chiudere”

il mio sistema di domotica è nato dal rifiuto di volermi appoggiare su progetti commerciali di terze parti. Casa mia dovrà funzionare anche tra trent’anni quando sarò un vecchio rimbambito. E magari non essere costretto a usare App Android separate tra loro e poter liberamente scrivere script di interoperabilità.

Non sempre è possibile, la domotica/IoT è piena di soluzioni cloud-only, tendenzialmente capita che uso queste soluzioni al fine di capire le mie necessità, per poi (col tempo) migrarle a soluzioni open.
Il riconoscimento vocale in casa, lo faccio con degli Alexa, perchè una soluzione non-cloud affidabile ancora non esiste.

Memole, la centralina di controllo

Un Raspberry PI principale, chiamato Memole, l’assistente di casa, quasi un membro della famiglia.

Memole gestisce tutta la casa. DHCP & DNS per la rete privata (con blocco anti-ads e anti-malware a monte via PiHole), ha UI (tablet in casa) e chatbot (Telegram), gestisce la casa e comanda tutti gli altri hub.

  • Ha un unico file config.json con tutte le opzioni specifiche di casa mia: temperature volute, widgets da mostrare nella UI, mappa mac-address>plugin, etc.
  • Riempie un unico file data.json con tutti i dati che raccoglie.
  • Raccoglie dati via nmap sui devices in rete. Questo per avere un’elenco dei devices in rete locale. Shot di UI
  • Nel file config.json ci sono tutti i map mac-address->plugin, ad esempio c’è
    "C8-FF-77-D8-FE-C5": {                
    	"name": "Dyson Camera",                
    	"type": "dyson-pure-cool",                
    	"category": "Domotics",                
    	"dyson_name": "Camera",
    },

    Memole dopo aver verificato quali devices sono online, se al device corrisponde un plugin (nel caso di esempio “dyson-pure-cool”) lancia lo script che lo controlla per raccogliere dati
    (nel caso di esempio temperatura, umidità etc).

  • Monta un webserver (nginx) con un’interfaccia jQuery tutta in ajax che legge il data.json e genera la UI.
    Ovviamente la vedo da smartphone.
    In casa, ho dei tablet in modalità Kiosk che mostrano l’interfaccia.
    La vedo da remoto via port-forwarding su una VPS mia su Amazon EC2.
    Ad esempio, un widget in config.json così

    "riscald_primo": {
                    "x": 55,
                    "y": 16,
                    "width": 18,
                    "height": 10,
                    "title": "Riscaldamento Primo",
                    "text": "[field=devices.B8-27-EB-7A-26-B9.caldaiaRelayPrimo,format=bool] [field=devices.B8-27-EB-7A-26-B9.temperature_detected_primo]\u00b0 [fontawesome]f18e[\/fontawesome] [field=config.temperature_target_primo]\u00b0"
                },

    viene renderizzato in html così:

  • Uso anche un bot Telegram per interazione. Ad esempio, se tiro il campanello di allarme della sauna, l’avviso arriva dal bot Memole. Risponde a comandi quali “accendi studio”, “spegni tutte le luci”, “dimmi lo stato uso corrente”, “accendi camino elettrico” etc.
  • Memole interroga anche gli altri Raspberry dislocati in casa, generalmente usati come sensori (temperature, umidità etc) o come interfaccie cablate ad altri sistemi (ad esempio ho un raspberry in caldaia che traduce comandi di Memole in comandi seriali via modbus alla pompa di calore).
  • La maggior parte dei pulsanti fisici (i ‘frutti’) sono pulsanti che Memole sente, e comanda altri device correlati.
    Ad esempio, in mansarda ho dei pulsanti tradizionali, che se premuti accendono delle fascie di led di Philips Hue. Se doppio-click, cambiano preset di colori.

Konnex

Ho un sistema Instabus/EIB/Konnex, uno standard open che permette l’interoperabilità di componenti elettriche.
In pratica quando ho costruito casa, ho fatto mettere una canalina che contiene un bus-dati EIB.
In un sistema elettrico normale ogni interruttore è collegato a una luce fisicamente, io invece in OGNI interrutture di casa ho un modulo che manda un telegramma “è stato premuto” e basta, e una centralina che reagisce in base alla configurazione, tipicamente un “accendi la luce X”.
Questo mi permette via API di controllare tutto (per dire, aprire il garage o il cancello elettrico dalla mia UI).
Permette anche la creazione di scenari, tipo “Se premo il bottone vicino all’uscita, spegni tutte le luci e chiudi tutti i vasistas”.

Uso il software ETS5.5 per la configurazione e debugging, e un Gira Ethernet per il controllo dai miei scripts.

Autoalimentazione elettrica

Ho diverse soluzioni semi-funzionanti per rilevare l’uso della corrente elettrica.
L’ultimo in uso oggi sono le API di TeslaWall2 (qui un esempio di output json), che mi permettono di leggere in realtime il consumo di casa, quanto produce il fotovoltaico, quanto è coperto dalla batteria di accumulo, quanto compro da Enel.

Ho un fotovoltaico da 18 kW, una batteria di accumulo da 13.5 kW (sto valutando se metterne altre due), il tutto in un trifase con stabilizzatore di tensione.

In estate ho un’autoalimentazione da oltre il 90%, in inverno con il riscaldamento una percentuale molto più bassa.

Riscaldamento

Questo è stato uno dei primi obiettivi del mio sistema, in quanto per scelta NON ho alcun termostato in casa e se il riscaldamento funziona male mia moglie giustamente sclera.

Attualmente ho tre Raspberry che rilevano temperatura e umidità per piano.
Il raspberry centralina li interroga, e in base a un’algoritmo scritto in uno script determina se comunicare ad un quarto Raspberry collegato via modbus alla caldaia l’attivazione dei relè.
Praticamente ho un termostato software.

Cerco di usare una caldaia a gas SOLO come sistema di backup, ma a regime il riscaldamento a pavimento è alimentato da una pompa di calore, un Hybrid Cube Daikin per l’acqua calda, otto splitter e altre tre macchine esterne degli splitter. Via modbus ho i dati in realtime dello stato caldaia e delle temperature (water inlet, leaving, outside, tank etc).

Al fine di aumentare l’autosostenimento, applico regole tipo il cercare di alzare la temperatura finchè il fotovoltaico produce evitando se ragionevole l’uso della corrente di notte.

Alexa – Amazon Echo

Come interfaccia di gestione vocale, per la copertura della maggior parte delle aree di casa, son costretto ad usare degli Echo (ne ho un po’, a memoria 8). Lo so, discutibile come privacy, e cloud-based.
Ma NON uso alcuna skill per la domotica. Mi son scritto la mia skill (Lambda su AWS), in modo che Alexa funzioni da gateway traslando comandi vocali per passarli a Memole.
Quindi un domani mi basterà trovare un’equivalente che faccia un riconoscimento e TextToSpeech. Ad oggi, con un Raspberry e soluzioni non-cloud, il riconoscimento di testo libero (senza esercitazione su word specifiche) è tragico.

Piscina

Uso un Blue Connect (cloud-based) come aiuto nella gestione, perchè è parecchio complicato gestire il PH, la salinità etc, ma il resto della gestione (come la schedulazione della pompa di filtraggio o il riscaldamento) è anch’essa gestita direttamente da Memole.

Rete lan

Ho 15 punti lan e diversi router wifi. La casa è ampia, è l’unico modo per avere una copertura decente da ogni punto della casa.
Sto testando l’uso di Ubiquiti con punti mesh per risolvere il problema di copertura con un’unico SSID.
Uso un Vigor 2760 come router primario per l’ADSL, QoS etc, principalmente perchè il mio ISP mi ha dato una configurazione IPv6 strana che riesco a far andare solo con quello. Ai tempi della richiesta IPv6, diversi anni fa, a detta del mio ISP fui il primo a chiederlo…

Antifurto

No. Cioè, c’è l’antifurto, un TecnoAlarm, ma per scelta è totalmente manuale e separato dalle mie diavolerie DIY.

Altri agganci con hub IoT

Memole interagisce con diversi hub di altre soluzioni domotiche (alcune cloud-based). Ribadisco, Memole è l’interfaccia primaria, i seguenti hub sono usati come ‘helper’ da Memole, mai direttamente.
Attualmente come gateways ho:

  • Un hub Z-Wave Fibaro con cui controllo qualche presa comandata e gestisco gli occhietti Fibaro
  • Un hub Philips Hue per diverse luci RGB.
  • Un Fingbox anche se sto cercando di abolirlo

Quindi attualmente quando devo agganciare un devices IoT, posso scegliere se Konnex, Z-Wave (via Fibaro), Zigbee, o perlomeno scelgo un device che potrò controllare direttamente da Memole via LAN (via API), o se ha un’interfaccia almeno seriale (modbus ad esempio), gli piazzo un Raspberry che Memole controllerà.

Altri devices agganciati

  • Un Lametric Time come UI per l’output di qualche valore
  • 4 Dyson Pure Cool, per rilevamento e pulizia qualità dell’aria in casa.
  • Un videocitofono Biticino (che odio, prima o poi lo costruisco da solo).
  • Una sauna Jacuzzi MI. La elenco qui perchè ho fatto io l’aggancio con Alexa per comandare Memole da dentro la sauna e per la gestione di musica d’ambiente e cromoterapia.
  • Una shower toilet Ghroe Sensia Arena , praticamente un bagno stile giapponese. Non è ancora collegata a Memole, non c’è motivo, ma lo riporto qui perchè è comunque un device tecnologico parte della casa.

Altri devices tecnologici in casa, non legati a IoT

  • Diversi sistemi di home-theater, nelle varie aree (cinema con proiettore in taverna, salotto, camere, palestra) di cui non sto a elencare hardware. Generalmente Android.
  • Sono un gran fan delle tecnologie VR. Ho 2 aree distinte, tantissimi headset, soprattutto una postazione gaming che cerco di tenere tecnologicamente all’avanguardia.
  • Un cabinato da bar originale Jamma ristaurato con una collezione di giochi arcade pre-anni-90. Mame, C64, Amiga, GameBoy e laser-disc emulation via Daphne. Monta un catodico originale, una scheda VGA custom per riprodurre il feeling esatto a 15 khz e risoluzione esatta nativa (Bubble Bobble per dire gira a 256×224, 256 colori), crediti inserendo monete.
  • Un laghetto per tartarughe (con pompa e cascata) controllato da Memole.

Fine

Bon, per ora mi fermo, magari se l’argomento piace integrerò qualche altra spiegazione.
Ciao!

Nausea (Motion Sickness) in VR

Scrivo una articolo sul problema nausea nel VR (Virtual Reality), basandomi sulla mia esperienza.

E’ un problema molto importante per questa tecnologia. Quelli che pensano che sia il limite di QUESTA generazione di tecnologia VR sbagliano, il problema è più complesso e non è generalmente legato all’hardware in uso.

La nausea nel VR viene quando i sensori naturali del corpo umano trasmettono delle informazioni contraddittorie. Il vostro cervello pensa siate malati, e attiva una strategia di sicurezza: la nausea per vomitare.

Inoltre, più tempo si usa un sistema VR, più la nostra mente & corpo si abitua. Personalmente, uso prototipi VR da 3-4 anni, e non c’è più quasi nulla che mi provoca nausea.

Credo ci sia qualcosa anche legato all’età. Faccio provare i miei sistemi VR a parecchi amici (che mi chiedono spiegazioni, altro motivo di questo articolo). Non ho mai riscontrato alcun problema di nausea in ragazzi/e sotto i 16 anni, che riescono a giocarci anche per ore. Probabilmente un’adattamento più rapido del loro sistema vestibolare.

Parliamo di sistemi così evoluti (finalmente) che cercano di ingannare il cervello umano per fargli credere di essere davvero in un ambiente non reale. Il paragone delle tecnologie VR vs occhialini 3D mi fà rabbrividire ogni volta che lo sento.

Riassumo qui sotto le soluzioni software e hardware attualmente in uso che conosco. I link ai titoli di videogiochi sono i trailer su YouTube.

Soluzioni Software

  • Evitare completamente un movimento che non avviene nella realtà.

    Nella maggior parte dei casi richiede una configurazione dello spazio dedicato al sistema VR chiamato Room space.
    L’azione nel gioco può avvenire interamente nell’area fisica dedicata al VR. Fantastic Contraption è stato praticamente il primo titolo di questo genere.
    Ma non è strettamente necessario, in The Climb si può esplorare interi ambienti senza alcun movimento artificiale.

  • Collocare il giocatore in un ambiente virtuale fisso

    Se il giocatore è all’interno di un veicolo (una macchina, un’astronave, un mech) la nausea da movimento è ridotta. Anche perchè generalmente la vista periferica è statica (vedi Tunneling più avanti).

  • Anticipare la traiettoria di movimento

    Il movimento del giocatore nell’ambiente è prestabilito. Tipo una corsa su vagoni delle giostre.
    Metodo scelto da Until Dawn Rush Of Blood, Archangel e molti altri.
    Il sapere a priori quale sarà il movimento che sta per avvenire, riduce notevolmente la reazione negativa del sistema vestibolare. Se la velocità di corsa è alta, è consigliato mostrare graficamente il percorso per permettere al cervello di anticipare il movimento.

  • Teleporting

    Teleporting con orientamento

    Non è molto amato dai giocatori, perchè (oltre a essere innaturale ovviamente) nella maggior parte dei casi dopo il teleporting ci vuol del tempo perchè il giocatore si renda conto della nuova posizione (tipicamente l’orientamento).
    In Robo Recall han cercato di risolvere chiedendo al giocatore di impostare il futuro orientamento a priori.
    Deve inoltre essere introdotto con una dissolvenza (fade in/out), che anche questo spezza l’esperienza.
    Infine è ovviamente scorretto se usato per schivare nemici.

  • Tunnelling

    Tunneling: Comfort Mode in Google Earth VR

    Si tratta di nascondere la vista periferica durante il movimento, anche come segnale di movimento in corso.

    E’ il metodo scelto da Google Earth VR, chiamato “Comfort Mode” (disattivabile).

  • Ridurre o rimuovere al minimo le accelerazioni
    Le accelerazioni provocano nausea. Nel VR è meglio passare a una velocità di movimento secca al volo.
  • Ridurre al minimo la necessità di rotazione manuale (tipico Mouse Yaw, o la rotazione negli FPS muovendo orizzontalmente il thumbstick destro).Alcune esperienze VR sono chiamate forward-only, ad esempio Farpoint, se concepiti in modo da non richiedere MAI una rotazione manuale del giocatore, e quindi compatibili anche con ambienti VR da 180° e non 360°.

    Se la rotazione manuale è indispensabile, deve avvenire a step (45° o 90° tipicamente), e non in maniera fluida come avviene in qualsiasi gioco 2D.

Best practice

Se un gioco è nato per il 2D, o se deve supportare sia 2D che VR, ci sono diversi accorgimenti che van sistemati o radicalmente disattivati. Ne cito solo qualcuno come esempio.

  • Spesso elementi grafici nel 2D non sono reali oggetti nella scena, ma ‘overlay’ o come risultato di post-processing 2D. Un tipico esempio è la luce volumetrica da finestre. Questi elementi van corretti o rimossi nella versione VR.
  • Ci sono dei movimenti del giocatore che nel 2D sono tipici, ma nel VR vanno rimossi, ad esempio il bobbling (il fatto che nei giochi 2D mentre si cammina, la testa ondeggia per aumentare l’effetto), o l’ondeggiare nel salire una scala, etc.
  • Effetti di blur, soprattutto se di simulazione della messa a fuoco su un momento importante di una scena.

Se l’adattamento al VR è fatto male (anche semplicemente ombre sbagliate etc), il cervello reagisce male e fa scattare la nausea.

E’ sbagliato pensare che qualsiasi gioco in soggettiva possa essere adattato al VR con poco sforzo.

Soluzioni Hardware


La mia postazione Project Cars.
Una postura corrispondente
all’esperienza VR
aiuta ad evitar
la nausea
  • PC: Assicurarsi che il software giri constantemente al massimo degli FPS (90 nel caso di Oculus Rift e HTC Vive).

    Se il framerate scende, uno ‘scatto’ nel semplice movimento della testa provoca nausea.
    Questo è in assoluto l’accorgimento più importante che TUTTI devono verificare/sistemare prima di usare un sistema VR.

  • Headset: in teoria prossime generazioni di caschetti dovrebbero ulteriormente limitare la nausea, introducendo ad esempio FOV più ampi.
    Ma questo sarà comunque relativo, il grosso dei problemi NON è legato all’headset e non può essere risolto dalle generazioni future di hardware VR.
  • Controller corrispondenti alla realtà virtuale: Una postazione di guida, una vera chitarra in Rock Band VR, impugnare un fucile con Farpoint.
  • Esistono strumenti che usano un processo chiamato neuromodulation, impulsi elettrici che tentano di regolare il ritmo gastrico.
    Ad esempio Reliefband. Non ho idea se funzionano, mai provati.
    Ovviamente, soluzione correlata, farmaci per prevenire la nausea. Personalmente non prenderò mai un farmaco per giocare a un videogioco.
  • Treadmill Simulator: Hardware per simulare il movimento. Il più famoso credo sia il Virtuix Omni.
    Si indossano scarpe scivolose, che riportano il piede in posizione centrale per procedere con il passo successivo.
    https://www.youtube.com/watch?v=WDmwu5KQT7k

    Personalmente, mai provato nessuno. Che io sappia, non ci sono neanche titoli AAA che li supportano nativamente.
    Generalmente non fan nient’altro che simulare il tasto W della tastiera per il movimento del giocatore.

Per ora non mi viene in mente nient’altro. Aggiornerò l’articolo se mi salta in mente qualcos’altro, o scrivetemi nei commenti. Ciao!

#Hack5Stelle – Riassunto

Provo per diletto a riassumere la vicenda “Hacking beppegrillo.it/Rousseau”, basandomi su quel che so dai blog e dalle persone che seguo su Twitter.

  • Per scrivere una sequenza temporale degli eventi.
  • Come riferimento di links per chi vuole approfondire.
  • Magari per spiegare a chi non è competente in materia cosa è successo, cercando di usare un linguaggio non tecnico ove possibile.

Premessa: Non ho MAI tentato un hacking, né cercato vulnerabilità attivamente. Tutto quello che dichiaro l’ho semplicemente dedotto da informazioni pubbliche.

Gennaio 2017

Notai che il certificato SSL (l’accesso https://) di beppegrillo.it era scaduto da 5 giorni.
Nessuno si era accorto, quindi nessuno lo usava.
Accedere ad un sito web senza crittografia significa essere esposti a un attacco chiamato MITM (Men-In-The-Middle, ‘Uomo nel mezzo’).
Ad esempio se qualcuno, collegato ad un WiFi di un albergo, digita in un sito web senza https:// una login e password, chiunque ha accesso al router dell’albergo vede e può alterare questi dati in chiaro.

Se andate su http://www.beppegrillo.it/login.php , noterete che ormai qualsiasi browser moderno segnala il problema.

Claudio d’Angelis notò che in realtà l’accesso https:// non funzionava proprio.
https://twitter.com/daw985/status/818212208945545218
E’ quindi certo che nessuno lo usava.

Poi, per curiosità, avevo usato un test online di controllo sicurezza e configurazione di siti protetti, Qualys SSL Labs.
Se volete provare, basta andare qui: https://www.ssllabs.com/ssltest/ e inserire

https://www.beppegrillo.it

L’esito, a gennaio 2017, non solo mostrava una mal-configurazione di SSL (che di per sè non era così grave, tanto non era usato), ma evidenziava che era vulnerabile a un attacco chiamato POODLE.
Ok, impossibile da usare come vettore di attacco essendo SSL non usato. Ma evidenziava che, evidentemente, il server non era più stato aggiornato perlomeno dal 2014.

Paolo Attivissimo segnalò allo staff di Grillo il problema che avevo sollevato:

Inoltre, il webserver era un Apache 2.2.15, molto molto vecchio (2010). Brutto segno.

2 agosto 2017, 11:40 (OTTO mesi dopo).

Evariste Gal0is apre un sito web, chiamato hack5stelle, in cui evidenzia come imporre un limite MASSIMO di 8 caratteri per una password sia RIDICOLO. Ed evidenzia una serie di vulnerabilità di tipo SQL injection. Sono un tipo di vulnerabilità che permettono di leggere arbitrariamente i dati dal database, anche quelli riservati. Altamente probabile che siano anche alterabili.
Non divulga alcun dettaglio su come sfruttare tali vulnerabilità, e dice che ha informato i responsabili del sito web.

E’ in gergo un WhiteHat, un ricercatore che cerca vulnerabilità nei siti web al solo scopo di aiutare.
Ha al suo attivo centinaia di segnalazioni utili, come si evince dal suo profilo su OpenBugBounty.
Perchè lo fa? Per passione. Per aiutare i webmaster. Per difendere gli utenti. Per imparare. Per farsi conoscere, perchè magari un domani possa diventare un lavoro a tempo pieno.
Lo fa gratis o qualcuno lo paga? Gratis. Non diverso dagli sviluppatori di software open-source che usate tutti quanti. Ricordatelo, grazie.

Già inizia a pentirsene poco dopo, ore 23:51

3 agosto 2017, 18:44

L’Associazione Rousseau pubblica sul blog di Beppe Grillo un post intitolato La sicurezza di Rousseau.

Di notevolmente ridicolo scrivono

Sono già state messe in atto tutte le azioni necessarie per impedire il ripetersi di intrusioni informatiche come questa.

(verranno smentiti successivamente)
e

In ogni caso il suo sito è già scomparso così come i suoi account social, segno che le contromisure contro questi reati funzionano e siamo lieti che siano state così tempestive.

(verranno smentiti successivamente)
ma soprattutto attaccano/minacciano Evariste Gal0is:

Valuteremo l’azione legale da intraprendere nei confronti dell’hacker, il cui attacco è assolutamente da condannare, anziché osannare come fanno i giornali.

Minacciare un WhiteHat è assurdo, stupido, gravissimo.
Oltre che ridicolo…


https://twitter.com/evilsocket/status/893827654562050049

Personalmente non mi pare coerente minacciare un WhiteHat e contemporaneamente sostenere progetti come WikiLeaks (cosa pensano che facciano?) o persone come Julian Assange.
Fantastico l’hashtag #solowikileaksvabene di David Puente.

3 agosto 2017, ore 22:40

Su Twitter l’utente @r0gue_0 dichiara di aver l’accesso al server o ai servers da mesi, e inizia a pubblicare dati come dimostrazione.
E’ un BlackHat, “cappello nero”, diciamo ‘un hacker cattivo’. Ma ‘hacker’ è un parolone per questo tizio.
Afferma e dimostra di poter scrivere nel database, oltre a leggerlo.
Insulta il whitehat Evariste Gal0is, colpevole a suo dire di aver attirato l’attenzione sulla disastrosa situazione intaccando i suoi interessi.
Personalmente, penso che r0gue_0 fosse in attesa di un momento politico più favorevole per sfruttare il suo accesso.
In una successiva intervista a Wired rilascerà dichiarazioni importanti come

“Io li dentro ci stavo già, e da molto tempo. Ho dato due esempi di tabelle molto diverse solo per fare capire il lasso di tempo, come che gli host violati erano diversi. Se non era per il vostro amico wannabe, che ha voluto mettere il cappello bianco e provare a diventare famoso, non si veniva a conoscenza nemmeno della mia esistenza. Non avreste mai visto nulla, e io sarei rimasto lì indisturbato a continuare gli affari miei. Per tutto questo casino potete dunque ringraziare lui”.

Non mi soffermo sulla tipologia di dati divulgati, sui singoli tweet o quant’altro di questo stronzo (scusate il francesismo).

r0gue_0 ha anche messo in vendita tutti i dati trafugati, per poco meno di 1000$. Non si sa chi o quante persone han acquistato questi dati.

Confido che prima o poi ci sarà la ciliegina sulla torta: qualcuno li pubblicherà su WikiLeaks, che il M5S tanto apprezza.

Rimando agli articoli di David Puente per altri dettagli sulle gesta di r0gue_0:

Violato Rousseau! Hacker R0gue0 pubblica su Twitter dati prelevati dalla piattaforma del M5S

Le nuove informazioni di R0gue_0 prelevate dalla piattaforma Rousseau: le email della “call to action”

R0gue_0 e il database di Rousseau: Matteo Renzi ha donato 1 milione di euro al M5S? Ma anche no!

Non solo Rousseau, R0gue_0 ha bucato anche BeppeGrillo.it e Il Blog delle Stelle

5 agosto

Evariste Gal0is torna online. Si era preso una pausa perchè non ha gradito la popolarità.

Smentisce il post dell’Associazione Rousseau relativamente alle contromisure:


Condanna il gesto di r0gue_0:


Avverte che i problemi persistono:


E, nonostante le minaccie ricevute, continua il suo operato da whitehat:


A me ha risposto:

Da ammirare.

6 agosto 2017

Di Maio dichiara:

Il problema non siamo noi ma la sicurezza informatica di questo Paese

.

Gloriosa supercazzola.


https://twitter.com/evilsocket/status/894309046144126976

7 agosto 2017

Matteo Flora riassume la vicenda con un video su YouTube:
Attacco a #Rousseau del Movimento 5 Stelle: tutto quello che dovete sapere

8 agosto 2017, ore 12:14

Evariste Gal0is ed Antonio Sanso pubblicano una nuova analisi: #Hack5Stelle – Parte 1: dump e le password.

Scoprono che il software installato è una versione obsoleta di Movable Type, la versione 4.2.

Esistono dei database contenenti l’elenco delle vulnerabilità dei software, ad esempio i CVE.
Normalmente, quando una vulnerabilità nuova viene scoperta, viene segnalata all’autore del software, che può correggerla. Passato tot tempo (generalmente qualche mese), viene resa pubblica (disclosure), a volte anche con istruzioni dettagliate su come sfruttarla.
La disclosure della versione di un software in uso, soprattutto se obsoleto, equivale a un il mio punto debole è qui, se mi colpisci -per di più così- mi fai male.

Scoprono inoltre che le password, laddove non conservate in chiaro, sono facilmente decifrabili a causa di un algoritmo che risale alla preistoria informatica: DES / Crypt.

E’ altamente probabile che l’Associazione Rousseau abbia installato Movable Type tanti anni fa,
l’hanno adattato alle loro esigenze ottenendo di fatto un fork, e ora non possono più aggiornarlo senza rifare tutti gli adattamenti.
E’ un tipico errore di webmaster incompetenti.

8 agosto 2017

Paolo Attivissimo accenna la vicenda: Due parole sulle vulnerabilità di Rousseau

8 agosto 2017

Evariste Gal0is rilascia un’intervista a David Puente: Intervista a Evariste Gal0is: non era un attacco politico e non sono R0gue_0. Segnalate falle anche nel nuovo Rousseau

Scrive un ultimo articolo: #Hack5Stelle – Parte 2: fix che non lo erano..
Si evince che il team tecnico dell’Associazione Rousseau non è in grado di sistemare decentemente neanche i problemi segnalati.
Non sa come sistemarli, quindi hanno improvvisato cercando di tappare le falle senza alcun know-how sull’argomento. Fallendo, ovviamente.
Niente, pare che rivolgersi a un esperto non sia considerato una priorità.

Evariste Gal0is dichiara che non vuol più occuparsi della vicenda:


(e fa bene, imho).

11 agosto

Leggo dal blog di David Puente l’articolo Cosa devono risolvere e rimuovere da Beppegrillo.it per la loro sicurezza che han lasciato un file chiamato mt-check.cgi.

Funziona così: per poter installare il CMS (Content-Management-System), cioè il software ‘motore’ del sito web, han piazzato un file che serve SOLO a verificare se il server è in grado di ospitare il software.
Non per niente la pagina finisce con “You’re ready to go! … Continue with the installation instructions.”.
Qualunque webmaster sa che quel tipo di file DEVE essere cancellato dopo l’installazione.
Perchè contiene dettagli su come il server è configurato e le versioni dei software che ha, in tempo reale.
Non serve a nient’altro. Tempo richiesto per risolvere il problema: un secondo, cancellare quel file.
Come spiegato prima, sono i dettagli che servono per correlare ricerche nei database di vulnerabilità note (CVE in primis).

Nello stesso post, David Puente fa anche notare che la password viene inviata in chiaro via mail in fase di richiesta recupero (molto male!) confermando ulteriormente che usano un software obsoleto.

15 agosto 2017, 09:50

L’Associazione Rousseau pubblica sul blog di Beppe Grillo un post intitolato I sicari informatici non fermeranno il MoVimento 5 Stelle.

Condannano l’operato di R0gue_0. D’accordo.

Confermano che

Purtroppo non sono stati colti in flagrante

e che quindi R0gue_0 ha accesso al server da tempo indeterminato. Ricordo che aveva potere di scrittura nel db.

Di notevolmente ridicolo:

I dati che sono stati divulgati dall’hacker si sono dimostrati comunque privi di fondamento

No. Erano dati personali veri e confermati.

e ovviamente di nuovo un

In questo momento stiamo prendendo tutte le misure necessarie affinché non si ripetano situazioni del genere e siamo al lavoro anche in questo giorno di festa.

Ora, 15 agosto 2017 ore 21:50, mentre scrivo questo post

Il server è ancora vulnerabile al POODLE attack (2014) e monta ancora Apache/2.2.15 (2010). Snapshot su archive.is Test in realtime

Il file mt-check.cgi c’è ancora. Snapshot su archive.is

Personalmente, correlando versioni e report CVE, penso di aver identificato una vulnerabilità di tipo remote-code-execution.
Significa che a mio avviso c’è una vulnerabilità che permette a chiunque la sfrutti di leggere e scrivere qualsiasi dato sul server, lanciare qualsiasi comando, e di installare una back-door, ovvero un accesso secondario segreto che sarà attivo anche se il server verrà sistemato.

Dovrei verificarla per poi segnalarla? L’Associazione Rousseau ha dichiarato che non gradisce.

Inoltre, si risolve automaticamente sistemando un’altro problema già citato in questo articolo, quindi gli basta rivolgersi a qualcuno di competente prima o poi.

Tralascio volutamente ogni considerazione legale sull’operato dell’Associazione Rousseau, non ne capisco abbastanza da permettermi un’opinione.
Ho letto che il Garante della Privacy ha aperto un’istruttoria.

Spero di non aver dimenticato nessun fatto importante, in caso contrario segnalatemelo via Twitter, grazie.

Aggiornamento 16 agosto 2017

Han rimosso finalmente il file mt-check.cgi. Non han colto minimamente cosa avevano sbagliato, perchè il problema persiste in altri files simili.

Accesso crittografato in siti web di partiti politici

Visto l’interesse per l’argomento, riassumo lo stato dell’accesso protetto da crittografia di 5 siti web di partiti politici.
Di questi, solo il sito web del Partito Democratico ha un accesso crittografato in maniera sicura. Accettabile con riserva.
Il Movimento 5 Stelle ha un ottimo sistema, Rousseau, ma non tutto è in sicurezza. Fratelli d’Italia, Forza Italia e Lega Nord, totalmente assente.

Unico pensiero politico da parte mia (prendetelo in maniera costruttiva): mi aspettavo maggiore cura dal Movimento 5 Stelle considerando che la rete è il suo cavallo di battaglia.

Immaginate ad esempio che un utente visiti quei siti web da un accesso pubblico (wifi pubblico, albergo, aeroporto etc). Un attaccante potrebbe:

  • intercettare in chiaro le credenziali (tra cui in chiaro le passwords, spesso riutilizzate).
  • reindirizzare la richiesta (alterando il form html) verso siti web malevoli.
  • alterare la risposta di ritorno, inserendo un javascript che funziona da keylogger in modo da intercettare poi ogni possibile interazione anche futura.

Questi ESEMPI di potenziali attacchi valgono per tutti, PD compreso, dato che non ha attivato alcuna forzatura alla versione sicura nei form di credenziali.

La maggior parte di produttori di browser hanno piani a lungo termine per l’abolizione delle connessioni in chiaro (es. Firefox), e i primi passi imminenti sono l’implementazione di warning di sicurezza (es. FireFox, Chrome).

Chrome pubblico usato dalla gente comune è la versione 55. La versione che notificherà che i siti web sopra-citati sono insicuri sarà la 56. E’ davvero molto imminente, imho.


Movimento 5 Stelle / Beppe Grillo

Rousseau https://rousseau.movimento5stelle.it è ottimamente configurato.
Certificato hash algorithm sha256 ok, rating ssl-labs: A+ altissimo (il massimo, abbastanza raro),
ottimo l’uso di HSTS che garantisce a monte che il sito sia interamente sotto crittografia. Versione web-server nascosta.

Una pesante pecca: l’iscrizione punta ad un’altra macchina, malmessa a livello di configurazione:

  • Riporta un vecchio Apache/2.2.15, che ha parecchie vulnerabilità note.
    Può essere che alcune vulnerabilità siano chiuse (ad esempio come i package debian in repo stable su distro LTS), non ho investigato sulle singole vulnerabilità.
    Dei penetration-testing sono più impegnativi di questa mia ricerca da tempo libero.
  • Restituisce un certificato scaduto da diversi giorni.
  • common-name errato (www.beppegrillo.it), che porta a una pagina web inesistente (404).
  • hash algorithm sha1, male.
  • Vulnerabile a POODLE e weak cipher.
  • Scelta incredibile. Di solito è accettabile avere un sito in chiaro con la sezione di autenticazione (login/register) sotto crittografia. Ma avere Rousseau protetto e registrazione in chiaro è tutto il contrario.

L’iscrizione quindi è obbligatoriamente in chiaro, perchè usare un accesso scarso di rating ssl-labs: T equivale a non usarlo.

Vedo ottime premesse, a spanne basta che il team di Rousseau prenda in carico anche l’altra macchina malconfigurata.


Partito Democratico

Buono, non ottimo.

Accesso crittografato https://www.partitodemocratico.it/ è OK.

La pecca è che la versione in chiaro funziona, potrebbe redirigere direttamente alla versione crittografata, o meglio ancora implementare HSTS come Rousseau.
E’ una pecca importante perchè la versione di login funziona anche da accesso non crittografato.
Obiettivamente se un accesso è insicuro e la versione sicura esiste, non è possibile venire incontro alla vita agli utenti che non conoscono la differenza o manco sanno che possono scegliere?

Piccola pecca, https://partitodemocratico.it restituisce ERR_BAD_SSL_CLIENT_AUTH_CERT. Pare solo mal-configurato il terzo livello “www.”.

Certificato SSL, ok per sha256. ssl-labs: B migliorabile, degli accessi con cipher weak andrebbero chiusi. Rousseau è configurato meglio.

Pare usino Apache 2.2.22 su FreeBSD. Non conosco decentemente FreeBSD.

Curiosità: Dal sito web, cliccare Accedi porta a un url da 3228 caratteri/bytes. Tutti fondamentali eh. (ironico).


Fratelli d’Italia

In http://www.fratelli-italia.it praticamente l’accesso cifrato non esiste.

Tesseramento e login solo in chiaro.

La versione cifrata del tesseramento mostra un 503 Service Unavailable, con un certificato self-signed che non corrisponde neanche come common-name.

ssl-labs: F. Vulnerabile al POODLE attack, weak cipher, etc.

Se non altro, nascondono che software web-server usano.


Forza Italia

http://www.forzaitalia.it è solo in chiaro, l’accesso crittografato per il sito principale non risponde.

La login è in chiaro.
L’accesso crittografato per il login spara pagina non trovata (HTTP 404).
Certificato SSL self-signed, scaduto 3 anni fa. 1024 bits. In pratica come se non ci fosse.

ssl-labs: F Tutto weak. Due diverse vulnerabilità, POODLE e CVE-2016-2107.

Praticamente l’accesso crittografato non esiste.

Apache/2.2.25 Amazon.


Lega Nord

http://www.leganord.org/ tutto in chiaro. L’accesso crittografato non esiste.

Apache 2.4.10 su Fedora.

https://www.beppegrillo.it e disclosure

Recentemente ho notato che il certificato SSL di https://www.beppegrillo.it è scaduto.

La cosa mi ha incuriosito perchè quel sito web è uno dei più frequentati d’Italia, e mi è parso strano che nessuno nell’arco di 5 giorni si sia indignato di dover inserire una password in una connessione in chiaro (esempio).
Anche perchè la figura di m. è imminente, le beta o candidate-release di browser moderni mostrano degli avvisi espliciti laddove è richiesta una password in una connessione non cifrata. Vedi ad esempio https://blog.mozilla.org/tanvi/2016/01/28/no-more-passwords-over-http-please/

Ieri sera l’ho fatto notare a Paolo Attivissimo via Twitter:

Poco dopo, Paolo ha twittato:

Immediatamente ho precisato che un certificato SSL non scaduto per il dominio www.beppegrillo.it esiste, ma non è configurato sulla macchina relativa:

Claudio d’Angelis mi ha fatto notare che l’approccio non è proprio professionale, dato che normalmente il protocollo non dovrebbe determinare il tipo di contenuti, mentre invece pare evidente che il blog sia necessariamente in chiaro, e la crittografia riservata ad altro (non so di più, mai frequentato il sito di Grillo).

A questo punto ho indagato (parolone…) altri 5 minuti (neanche), e ho notato che il webserver risponde fornendo informazioni sulla versione di Apache installata

Non che questo sia grave di per sè, ma di solito i professionisti evitano di fornire questo genere di info per rendere almeno un pelo più difficile la ricerca di vulnerabilità.

Un veloce controllo su SSL-Labs ha evidenziato vulnerabilità note (PODDLE), cipher weaks e altre varie.

Cosa prevedibile con un Apache 2.2.15, che è un po’vecchiotto. POODLE confermato anche dallo scan online di Comodo.

Più di una persona su Twitter fa notare che il sito di gestione del Movimento è su un’altra macchina, https://rousseau.movimento5stelle.it/ , che a una prima occhiata pare ben configurata.
Ma obiettivamente in questo settore non è che se un qualcosa è obsoleto lo si abbandona senza aggiornamenti, anche perchè se quell’accesso presenta vulnerabilità da remote-code-execution, significa accesso all’intera macchina (ed eventualmente al database annesso).

E qui arriviamo al motivo di questo riassunto.
Mi preme precisare che ho usato il termine colabrodo perchè è evidente la situazione, ma NON ho MAI detto che è una situazione grave.
Mi ritengo un professionista nel mio settore (sicurezza IT), ma qui sono sempre rimasto a livelli di chiacchere da bar.
Stabilire la gravità di noncuranze richiederebbe un’analisi più accurata, dei penetration-testing, notifiche private, disclosure concordate etc.
Potrebbe anche essere che la macchina in questione è solo un vuoto reverse proxy o un load-balancer a una macchina di backend meglio configurata, per dire.

Estote parati! (@lastknight docet)

(Editato in seguito per correggere il mio italiano..)

Sample ODS video

I rendered with POV-Ray (using my approach) a sample 360 degree, omnidirectional, stereo video (top/bottom).
Can be used for stress testing VR Video players, HMD etc.

It’s a 120 frame animation, loopable. It mean one seconds at 120 FPS (for example PSVR), 1.25 seconds at 90 FPS (Oculus Rift, HTC Vive), etc.

YouTube Preview:

Real plain preview:

It took around 4 days for rendering on my i7 with eight cores.
Every frame have 7680 x 7680 pixels resolution (Stereo top/bottom), around 32 MB PNG each.
I encoded it in different FPS and resolution. As explained in my other post about ODS, x264 don’t support highest framerate at highest resolution.

ffmpeg command-line encoding:

ffmpeg\bin\ffmpeg.exe -framerate 60 -i sample%03d.png -c:v libx264 -preset veryslow -vf scale=1280:720 -x264-params crf=18 -c:a aac -strict experimental preview.mp4

Download links

Image:
Single shot image, 7680 x 7680 pixels (9370 KB)
Videos:
x264 – 30 FPS – 4K UHD
x265 – 60 FPS – 4K UHD
x265 – 90 FPS – 4K UHD
x265 – 90 FPS – 4K DCI
x265 – 90 FPS – 8K
x265 – 120 FPS – 8K

POV-Ray source code: .pov, .ini.

Omni­directional stereo (ODS) with POV-Ray

Omni­directional stereo (ODS) is a projection model for stereo 360 degree videos
It’s designed for VR viewing with a head­mounted display (HMD).
More information here.

I developed and tested for fun an approach for raytracing, open-source POV-Ray software.

How to render

Currently (2016-03-11), render ODS image require an alpha version of POV-Ray, that support user_defined camera. Download from here
Or use my POV-Ray fork. More information on this below.

With POV-Ray official (Alpha),
Use the following code for an ODS top-bottom (left eye on top, right eye on bottom):

// ODS Top/Bottom - Docs: https://www.clodo.it/blog/?p=80
#declare odsIPD = 0.065; // Interpupillary distance
#declare odsVerticalModulation = 0.2; // Use 0.0001 if you don't care about Zenith & Nadir zones.
#declare odsLocationX = 0;
#declare odsLocationY = 0;
#declare odsLocationZ = 0;
#declare odsHandedness = -1; // "-1" for left-handed or "1" for right-handed
#declare odsAngle = 0; // Rotation, clockwise, in degree. 

camera {
  user_defined
  location {
    function { odsLocationX + cos(((x+0.5+odsAngle/360)) * 2 * pi - pi)*(odsIPD/2*pow(abs(sin(select(y, 1-2*(y+0.5), 1-2*y)*pi)), odsVerticalModulation))*select(-y,-1,+1) }
    function { odsLocationY }
    function { odsLocationZ + sin(((x+0.5+odsAngle/360)) * 2 * pi - pi)*(odsIPD/2*pow(abs(sin(select(y, 1-2*(y+0.5), 1-2*y)*pi)), odsVerticalModulation))*select(-y,-1,+1) * odsHandedness }
  }
  direction {
    function { sin(((x+0.5+odsAngle/360)) * 2 * pi - pi) * cos(pi / 2 -select(y, 1-2*(y+0.5), 1-2*y) * pi) }
    function { sin(pi / 2 - select(y, 1-2*(y+0.5), 1-2*y) * pi) }
    function { -cos(((x+0.5+odsAngle/360)) * 2 * pi - pi) * cos(pi / 2 -select(y, 1-2*(y+0.5), 1-2*y) * pi) * odsHandedness }
  }
}

Use the following code for an ODS side-by-side:

// ODS Side-by-Side - Docs: https://www.clodo.it/blog/?p=80
#declare odsIPD = 0.065; // Interpupillary distance
#declare odsVerticalModulation = 0.2; // Use 0.0001 if you don't care about Zenith & Nadir zones.
#declare odsLocationX = 0;
#declare odsLocationY = 0;
#declare odsLocationZ = 0;
#declare odsHandedness = -1; // "-1" for left-handed or "1" for right-handed
#declare odsAngle = 0; // Rotation, clockwise, in degree. 

camera {
  user_defined
  location {
    function {  odsLocationX + cos(((select(x,2*(x+0.5),2*x)+odsAngle/360)) * 2 * pi - pi)*(odsIPD/2*pow(abs(sin((1-(y+0.5))*pi)), odsVerticalModulation))*select(x,-1,1) }
    function {  odsLocationY }
    function {  odsLocationZ + sin(((select(x,2*(x+0.5),2*x)+odsAngle/360)) * 2 * pi - pi)*(odsIPD/2*pow(abs(sin((1-(y+0.5))*pi)), odsVerticalModulation))*select(x,-1,1) * odsHandedness }
  }
  direction {
    function {  sin(((select(x,2*(x+0.5),2*x)+odsAngle/360)) * 2 * pi - pi) * cos(pi / 2 -(1-(y+0.5)) * pi) }
    function {  sin(pi / 2 - (1-(y+0.5)) * pi) }
    function {  -cos(((select(x,2*(x+0.5),2*x)+odsAngle/360)) * 2 * pi - pi) * cos(pi / 2 -(1-(y+0.5)) * pi) * odsHandedness }
  }
}     

Use the following code for single eye rendering:

// ODS Single Eye - Docs: https://www.clodo.it/blog/?p=80
#declare odsIPD = 0.065; // Interpupillary distance     
#declare odsVerticalModulation = 0.2; // Use 0.0001 if you don't care about Zenith & Nadir zones.
#declare odsLocationX = 0;
#declare odsLocationY = 0;
#declare odsLocationZ = 0;
#declare odsHandedness = -1; // "-1" for left-handed or "1" for right-handed
#declare odsAngle = 0; // Rotation, clockwise, in degree.              
#declare odsEye = -1; // -1 for Left eye, +1 for Right eye

camera {
  user_defined
  location {
    function {  odsLocationX + cos(((x+0.5+odsAngle/360)) * 2 * pi - pi)*(odsIPD/2*pow(abs(sin((1-(y+0.5))*pi)), odsVerticalModulation))*odsEye }
    function {  odsLocationY }
    function {  odsLocationZ + sin(((x+0.5+odsAngle/360)) * 2 * pi - pi)*(odsIPD/2*pow(abs(sin((1-(y+0.5))*pi)), odsVerticalModulation))*odsEye * odsHandedness }
  }
  direction {
    function {  sin(((x+0.5+odsAngle/360)) * 2 * pi - pi) * cos(pi / 2 -(1-(y+0.5)) * pi) }
    function {  sin(pi / 2 - (1-(y+0.5)) * pi) }
    function {  -cos(((x+0.5+odsAngle/360)) * 2 * pi - pi) * cos(pi / 2 -(1-(y+0.5)) * pi) * odsHandedness }
  }
}                               

Caveats

  • Camera Direction is actually not supported. It’s always look_at<0,0,1>. You can use the odsAngle parameter for a rotation (degree) around Y axis.
  • Zenith & Nadir Zones
    Base ODS algorithm have spiral/singularities towards the zenith and nadir points.To avoid that, i modulate the stereoscopic eye separation such that it begins at normal eye separation near the horizon, and is smoothly decreased, reaching zero by the time either the zenith or nadir points on the polar axis are visible to the user, producing a monoscopic image. 

    I use this formula:

    where 0.02 it’s the odsVerticalModulation and 0.065 the default IPD. Play with this value to understand how IPD are reduced near the Zenith (x:-0.5) and Nadir (x:0.5).

    In general, it’s recommended to avoid objects at zenith & nadir points, and use a odsVerticalModulation near 0 (0.0001), to obtain a perfect IPD / 3d effect.
    If you have objects at zenith & nadir points, use a odsVerticalModulation near 1 can be a good compromise.

    Other approach:
    Domemaster3D (Shader for 3DS Max, Mata, Softimage etc) recommend a texture to reduce the effect. link

    SolidAngle/Arnold use mixed approach. link

    Another kind of modulation: link

Best practice

  • Objects should remain at least 60cm from the camera (relative to an IPD of 6.5cm).
    Use this POV-Ray code to check (it’s auto adapt based on IPD): 

    sphere
    {
      <odsLocationX,odsLocationY,odsLocationZ>, 0.6*odsIPD/0.065
      pigment
      {
        color <1,0,0>
        filter 0.97
      }
      hollow
    }
    
  • Objects appearing directly above or below the camera should remain at least 3.5m from the camera (relative to an IPD of 6.5cm).
  • Antialiasing is very very very important on VR headset.

Recommended Resolutions

I recommend, at least for the current (year 2016) generation of VR headset (GearVR, Oculus Rift, HTC Vive), at least 6480 x 6480 pixels in top/bottom for static images. For videos, see below.

Resolution must have 2:1 aspect ratio (standard equirectangular), that become 4:1 for side-by-side or 1:1 for a top-bottom.

TL;DR;
It’s difficult to estimate a good resolution.
VR headset do a distortion for lenses, any every VR headset can have different lenses, different FOV, different panel resolution etc.

The GearVR for example has a 90° FOV on a 2560×1440 panel, but the center pixel covers 0.06° after distortion. This value is sometime called “pixel coverage” or “pixel density” or “pixel per display pixel” or “eye buffer scaling”. So, for the GearVR, 0.06° pixels means we need 360/0.06 = 6000 pixels to cover one monoscopic turn.

Rendering Animation/Video

This is actually problematic.

In theory, the resolution must be at least as explained above for images.

Any VR headset require a high frame-rate to avoid nausea.

  • Oculus Rift DK2 (Development Kit 2): 75 FPS
  • Oculus Rift CV1 (Customers Version 1): 90 FPS
  • HTC Vive: 90 FPS
  • Sony Playstation PSVR : 120 FPS

In general, future-generation VR headset: expected 120 FPS

But H264 don’t have any level profile compatible with this kind of resolution.
Also HEVC/H265 have the same problem.

But we also need a coded that is hardware-accelerated to obtain the high FPS requested, and generally only H264/H265 are optimized for this.

VR Players

Virtual Desktop – There isn’t any option about side-by-side vs top-bottom, it simply detect it from the aspect ratio: 4:1 for side-by-side, 1:1 for top/bottom.

MaxVR

Both player can’t reproduce H265 high resolution videos.

My POV-Ray fork on GIT-Hub

With a POV-Ray builded from my fork, you can simply use a spherical camera:

camera
{             
  spherical   
  //ipd 0.065
  ods 4 
  //ods_angle 0
  //ods_modulation 0.2
  //ods_handedness 1
  location <0,0,0>  
}             
  • ods: 0 for monoscopic image, 1 for left eye only, 2 for right eye only, 3 for side-by-side, 4 for top/bottom. 0 is default. 4 recommended.
  • Other parameters ipd, ods_angle, ods_modulation and ods_handedness are the same of the user_defined approach param described above.

Interesting Links

Kudos

Many, many thanks to:

Christoph Lipka, William F Pokorny, Jaime Vives Piqueres from POV-Ray newsgroup.
Joan from Oculus Forum.
Jakob Flierl (checkout is GIT-Hub repo about ODS).

Examples of rendering

Some example of rendering (6480 x 6480 pixels, Top-Bottom).

Mirrors – I made this

——————
Stacker Day – POV-Ray sample scene adapted for ODS

——————
Fractals 1 – POV-Ray sample scene adapted for ODS

——————
Fractals 2 – POV-Ray sample scene adapted for ODS

——————
Wineglass – POV-Ray sample scene adapted for ODS

——————
Axis – Test reference

I also rendered a sample video that can be used for stress-testing of VR video players.

QUICKRES.INI

Reference resolutions for POV-Ray quickres.ini

[ODS TB Quick Test - 512 x 512]
Width=512
Height=512
Antialias=Off

[ODS TB Test - 1024 x 1024]
Width=1024
Height=1024
Antialias=Off

[ODS TB Minimum - 3600 x 3600]
Width=3600
Height=3600
Antialias=On
Antialias_Threshold=0.3

[ODS TB High - 6480 x 6480]
Width=6480
Height=6480
Antialias=On
Antialias_Threshold=0.3

[ODS TB Ultra - 12288 x 12288]
Width=12288
Height=12288
Antialias=On
Antialias_Threshold=0.3

[ODS TB 1440p - 2560 x 1440]
Width=2560
Height=1440
Antialias=On
Antialias_Threshold=0.3

[ODS TB UHD-1 2160p - 3840 x 2160]
Width=3840
Height=2160
Antialias=On
Antialias_Threshold=0.3

[ODS TB DCI 4K - 4096 x 2160]
Width=4096
Height=2160
Antialias=On
Antialias_Threshold=0.3

[ODS TB 8K UHD - 7680 x 4320]
Width=7680
Height=4320
Antialias=On
Antialias_Threshold=0.3

[ODS LR Minimum - 7200 x 1800]
Width=7200
Height=1800
Antialias=On
Antialias_Threshold=0.3

[ODS LR High - 12960 x 3240]
Width=12960
Height=3240
Antialias=On
Antialias_Threshold=0.3

[ODS LR Ultra - 24576 x 6144]
Width=24576
Height=6144
Antialias=On
Antialias_Threshold=0.3
[ODS LR Low - 7200 x 1800]
Width=7200
Height=1800
Antialias=On
Antialias_Threshold=0.3

[ODS LR Normal - 12960 x 3240]
Width=12960
Height=3240
Antialias=On
Antialias_Threshold=0.3

[ODS LR High - 24576 x 6144]
Width=24576
Height=6144
Antialias=On
Antialias_Threshold=0.3

[ODS TB Low - 3600 x 3600]
Width=3600
Height=3600
Antialias=On
Antialias_Threshold=0.3

[ODS TB Normal - 6480 x 6480]
Width=6480
Height=6480
Antialias=On
Antialias_Threshold=0.3

[ODS TB High - 12288 x 12288]
Width=12288
Height=12288
Antialias=On
Antialias_Threshold=0.3

[ODS TB YouTube - 3840 x 2160]
Width=3840
Height=2160
Antialias=On
Antialias_Threshold=0.3

‘Security through obscurity’ or simply ‘Security incompetence’?

If you use a WebControl in a Windows Presentation Framework application that access to local JS files, it show this warning:
x

If i add
x
at the top of index.html,
IE 11 think is loaded from about:internet and will not display the Security warning. Currently i don’t know if is also a security issue.

Tested with Windows 10 – IE 11.