Blog

Uso di displacement su oggetti con hard edge

displacement con hard edge in maya e mental ray 01

Questo articolo segue idealmente quello che ho scritto precedentemente in cui spiegavo come impostare correttamente un materiale di mental ray con displacement applicato. In questo post invece vorrei trattare un problema che capita spesso di incontrare soprattutto nei lavori di visualizzazione architettonica.

Spesso infatti si ha la necessità di applicare un rilievo, per esempio ad una parete, oppure ad un pilastro. Non parlo di effeti ottici come bump o normal, ma proprio di una creazione di rilievi tridimensionali, quindi fatti con l'uso di displacement.
Il problema che appare subito è che quando si applica un displacement ad un oggetto poligonale dai lati “rigidi” (hard edge), come può essere per l'appunto un pilastro, proprio in corrispondenza dei lati si creano dei buchi, le facce si separano le une dalle altre, rendendo così totalmente inutilizzabile lo shader in questo scenario.

In pratica il displacement rimane continuo solamente dove trova dei soft edge a collegare le facce.

immagine di esempio di gap provocato da displacement lungo gli hard edge

Il displacement interrompe la continuità della superficie dove ci sono gli hard edge.

Il metodo comune per aggirare il problema è applicare un bevel a tutti gli edge rigidi e poi fare un soften edge con ampiezza di 180° in modo da eliminare completamente gli spigoli rigidi nello shading dell'oggetto.

Tuttavia ritengo questa una soluzione poco elegante perché altera la topologia di partenza dell'oggetto rendendolo più difficilmente modificabile in caso di necessità. Inoltre si rischia di creare una zona a più alta densità poligonale lungo i lati. Quest'ultimo problema porta, nella mia esperienza, alla possibile creazione di artefatti durante il rendering perché l'algoritmo di approssimazione suddivide in maniera più densa dove trova più facce e quindi il displacement avrà più dettaglio ai lati rispetto al centro delle facce creando un effetto visivo sgradevole.

Una soluzione a mio avviso migliore consiste nell'usare il crease tool e la smooth mesh preview di maya per indicare a mental ray dove gli angoli dovranno rimanere rigidi, mantenendo però una suddivisione regolare della mesh.

Più in dettaglio:

  • Assegnare all'oggetto un materiale con applicato uno shader di displacement. Per istruzioni precise sulla procedura vedere questo articolo;
  • Selezionare la mesh e attivare lo smooth mesh preview premendo il tasto 3. L'oggetto assumerà un aspetto rotondeggiante: niente paura, lo riporteremo presto alla forma di partenza;
  • Impostare il livello di suddivisione dell'operazione di smooth andando nella sezione smooth mesh della shape dell'oggetto e scegliendo il valore di Preview Division Levels. Questo valore è importante perché da esso dipende il valore che il crease tool dovrà assegnare al lato per creare una full crease, cioè uno spigolo netto.
  • Sotto Extra Controls disabilitare Smooth Uvs per evitare che la texture si deformi ai lati.
  • Selezionare tutti gli edge dell'oggetto che devono rimanere netti.
  • Con il crease tool trascinare fino ad un valore uguale o superiore a quello di suddivisione assegnato. Se questo è 2, per esempio, per creare una full crease dobbiamo arrivare a 2.
immagine degli attributi della sezione Smooth Mesh da impostare

Gli attributi della sezione Smooth Mesh da impostare.

Ecco che la forma iniziale dell'oggetto è stata ripristinata.

immagine del wireframe della geometria

Wireframe della geometria del pilastro. Notare come non siano conservate lo topologia e la forma di partenza.

  • Aprire l'Attribute editor del file texture con la mappa di displacement. Click con pulsante destro su Alpha Offset e scegliere create new expression e inserire questa espressione:
    float $offset = 1;
    [nome_file_mappa_displace].alphaOffset = ([nome_file_mappa_displace].alphaGain / 2) - $offset;

In questo modo l'altezza generata dal displacement sarà distribuita per metà sopra il livello della superficie di partenza dell'oggetto e per metà sotto. Se avete la necessità di distribuire diversamente le altezze, è sufficiente che modifichiate il valore della variabile $offset.

Per terminare dobbiamo stendere le coordinate uv in maniera che non ci siano seam tra una faccia e l'altra.

esempio di uso di displacement su oggetti con hard edge

Un esempio di displacement su oggetti con hard edge. Non ci sono fessure agli angoli dei pilastri.

Una nota di attenzione

Come spiegato in questo post, maya to mental ray non riesce a leggere i valori di crease quando si usano i nodi di subdivision approximation. Non è un bug, ma una scelta necessaria dovuta a questioni di brevetti, come spiega Steve, uno degli sviluppatori di mental ray. Nel nostro caso quindi non dobbiamo usare l'approximation editor. Questo in realtà non si rivela un grosso problema perchè il livello di dettaglio del displacement rimane piuttosto buono e non si ha un grande impatto sulle performance generali.

Immagine di esempio di uso di displacement su oggetti con hard edge

Un altro esempio di displacement su oggetti con hard edge.

Spero che questo articolo vi sia utile. Scrivetemi le vostre esperienze in merito!

Paolo Mazzoccato, fondatore Fisheye Studio

Paolo Mazzoccato

Fondatore di Fisheye Studio e appassionato di grafica 3d dal 1996. Quando la tecnologia mi volta le spalle trovo conforto nelle fusa dei miei gatti.

Linkedin

comments powered by Disqus