Indietro

Schede musicali 3D

Uno spazio musicale interattivo a schermo intero: un personaggio Tripo si trova al centro, circondato in una costellazione 3D irregolare da sei pannelli in vetro, ciascuno con un brano realmente riproducibile. Selezionando una traccia, il relativo pannello viene estratto dallo spazio, vola in primo piano e atterra in basso come lettore 2D.

Autore: Theodore
Provalo dal vivo
Schede musicali 3DProvalo dal vivo

Su questo progetto

I sei pannelli sono vera geometria WebGL all'interno della scena — hanno spessore e curvatura, occludono il personaggio e ne sono occlusi, mentre il loro ordine di profondità rimane corretto da qualsiasi angolazione. Non sono schede DOM sospese sopra un canvas.

L'intera interazione si basa su una divisione dei compiti: il 3D serve all'esplorazione, il 2D al controllo. I pannelli gestiscono la navigazione e la selezione, fluttuando attorno al personaggio e ruotando con i gesti dell'utente; il controllo effettivo della riproduzione appartiene all'interfaccia stabile nello spazio dello schermo, in basso. Selezionare un brano non è un cambio di stato, ma un passaggio continuo — il pannello stesso vola verso il basso e diventa il lettore e, quando viene scelta un'altra traccia, quello precedente torna al proprio slot 3D originale.

Punti salienti

  1. Trascina lo spazio vuoto e le schede musicali ruotano attorno al personaggio, proseguendo per inerzia al rilascio; trascina il personaggio e ruoterà soltanto quest'ultimo, senza muovere camera e pannelli. I due elementi derivano lentamente in direzioni opposte — è questo moto contrario a far percepire il gruppo come un corpo orbitante anziché come uno sfondo
  2. Fai clic su un pannello: questo esce dallo spazio 3D, passa davanti al personaggio e si dispiega in basso come lettore orizzontale; selezionandone un altro, due pannelli si trovano contemporaneamente in volo — quello precedente si ripiega esattamente nella posizione originale mentre il nuovo avanza
  3. La rotellina sposta la camera in dolly tra 4.6 e 16 unità del mondo: avvicinandosi, i pannelli in primo piano escono dall'inquadratura; allontanandosi, l'intero spazio si raccoglie in un'unica costellazione musicale vista dall'alto
  4. La cornice a quattro angoli del cursore personalizzato si aggancia al quad realmente proiettato di ogni pannello — le parentesi si posano sui veri angoli prospettici e ruotano seguendo l'inclinazione del pannello

Analisi tecnica

  • Asset 3D · L'esportazione Tripo intatta

    Artist.glb viene distribuito esattamente come esportato da Tripo: 59 MB, 1.02M vertici, una mappa colore di base 8192² — nessuna decimazione, nessun ridimensionamento, tutti i dettagli originali. Il costo è messo in conto (~350 MB di VRAM dopo la generazione dei mipmap, un milione di vertici ridisegnati a ogni frame) e due decisioni lo mantengono gestibile: la mesh pesante viene esclusa dal raycasting — un milione di triangoli a ogni movimento del puntatore bloccherebbe il main thread — e sostituita da una capsula invisibile dimensionata sui limiti del modello; inoltre, poiché l'esportazione non contiene clip di animazione, il personaggio riceve un'animazione idle a livello di gruppo (una lenta oscillazione e un millimetro di respiro) anziché uno scheletro inventato.

    Una pipeline meshopt in scripts/ porta lo stesso file a 2.9 MB; il modello viene misurato e normalizzato durante il caricamento, quindi sostituire le build non richiede modifiche al codice.

  • Materiali · Semplificare il materiale volumetrico nelle esportazioni Tripo

    Le esportazioni Tripo contrassegnano la mesh con KHR_materials_volume, che in three.js diventa un MeshPhysicalMaterial con un percorso transmission/thickness di cui questa scena non ha bisogno e che non può permettersi. Durante il caricamento, ogni materiale viene convertito in MeshStandardMaterial mantenendo l'intero set di mappe PBR — stesso aspetto, costo eliminato.

    Gli ShaderMaterial personalizzati includono esplicitamente colorspace_fragment: senza di esso scrivono valori lineari direttamente in un framebuffer sRGB e vengono renderizzati quasi neri.

  • Pannelli musicali · Geometria reale su una curva

    Ogni pannello combina quattro tipi di geometria — una superficie frontale, una fascia perimetrale estrusa per creare uno spessore reale, una piastra posteriore traslucida e hit quad invisibili — che condividono un unico set di buffer in cache; per ogni scheda cambia soltanto la trasformazione del gruppo. Tutto viene creato in piano e avvolto su un grande cilindro verticale: la scanalatura di avanzamento e l'orologio sono incorporati nella stessa curva anziché esserne figli, mentre il riempimento dell'avanzamento è un cutoff UV iniettato in un MeshBasicMaterial — ridimensionare una mesh solleverebbe dalla curva la sua estremità più lontana.

    La grafica dei pannelli viene suddivisa fra tre canvas in base alla frequenza di aggiornamento: la superficie 1320×680 viene disegnata una sola volta, la fascia del tempo quando cambia il secondo visualizzato e l'icona soltanto quando cambia lo stato di riproduzione — nessuna operazione costosa entra nel render loop. Tutti e sei i pannelli trasparenti disattivano i depth write e ricevono a ogni frame un renderOrder a fasce basato sulla distanza dalla camera, così l'occlusione rimane corretta da qualsiasi angolazione.

  • Passaggio dal 3D al 2D · Una scheda atterra come lettore

    Una mesh WebGL non può diventare un nodo DOM, quindi la continuità viene costruita a partire da tre elementi: a ogni frame, un proiettore mantiene aggiornato il riquadro di ogni scheda nello spazio dello schermo — incluse quelle nascoste, perché il volo di ritorno deve sapere dove atterrare; nel primo frame del pannello DOM compare la stessa bitmap del canvas già dipinta per la texture WebGL della scheda, non una ricostruzione HTML che non combacerebbe mai alla perfezione; e la scheda viene nascosta nello stesso frame — due elementi nello stesso punto, uno invisibile.

    L'allargamento inizia solo quando il volo è completato per ~35% — trasformare a metà percorso una scheda 2:1 in una barra 11:1 impasterebbe l'immagine — e la traiettoria segue una curva di Bézier quadratica incurvata lateralmente, così una scheda in arrivo dall'angolo superiore sinistro passa attorno all'artista. La destinazione viene riletta a ogni frame: la costellazione è ancora in movimento e un rect campionato al decollo farebbe atterrare il pannello accanto alla propria scheda.