Rilluminare il 3DGS con una mesh di LixelStudio
Il plugin supporta la rilluminazione ibrida: abbina il 3DGS a una mesh della stessa scala così che il 3DGS ottenga una risposta alla luce vicina a quella di una mesh e possa produrre ombre proprie.
Il risultato dipende dalla precisione geometrica della mesh posta sotto il 3DGS. Più mesh e 3DGS combaciano, più convincenti risultano risposta alla luce e ombre.
Per il meccanismo e i parametri vedi Mesh proxy. Per la scelta tra le modalità di normali vedi Normali e illuminazione.
Quale mesh usare
LCC Studio e LixelStudio generano entrambe delle mesh, ma con scopi diversi.
| Mesh di LCC Studio | Mesh di LixelStudio | |
|---|---|---|
| Precisione della superficie | Più grezza | Più fedele alla forma reale |
| Dimensione del file | Piccola | Grande |
| Adatta a | Rilevamento delle collisioni | Rilluminazione |
Per le collisioni basta la mesh di LCC Studio, vedi Collisioni. Per la rilluminazione usa la mesh di LixelStudio.
Mesh di LCC Studio:


Mesh di LixelStudio:


Passaggio 1: raccogliere i modelli a tasselli in una cartella
LixelStudio esporta le mesh a tasselli. Con una scena grande ti ritrovi molte cartelle, ognuna con un file .obj e le sue texture. Vanno unite in una sola mesh prima dell'importazione, altrimenti ottieni molti .obj separati.
I passaggi seguenti usano Blender; qualsiasi strumento 3D funziona allo stesso modo. Scarica Blender dal sito ufficiale.
Blender non accetta un gruppo di cartelle trascinate in una volta, quindi i file .obj sparsi nelle sottocartelle vanno portati prima allo stesso livello. Trascinare decine di cartelle a mano non è pratico, meglio un singolo comando PowerShell.
Apri la cartella radice che contiene tutte le sottocartelle, digita powershell nella barra degli indirizzi e premi Enter. Il terminale si apre nella directory corrente.

Digita powershell nella barra degli indirizzi di Esplora file
Copia e incolla questo comando:
Get-ChildItem -Recurse -File | Move-Item -Destination .
Nota: il comando sposta ogni file dalle sottocartelle nella directory corrente, quindi verifica di essere nella cartella giusta prima di eseguirlo. Per esempio, se la cartella A contiene B e C, apri PowerShell dalla barra degli indirizzi di A; al termine tutti i file di B e C si trovano in A.

Struttura delle cartelle prima dell'esecuzione

Incolla il comando ed eseguilo
Premi Enter dopo averlo incollato. Richiede alcuni secondi. Un nuovo prompt indica che il comando è terminato.
Ora tutto è stato estratto. Apri qualche sottocartella per verificare che sia vuota.

Tutti i file .obj e le texture si trovano ora allo stesso livello
Passaggio 2: unire in un solo file in Blender
Premi Ctrl + A per selezionare tutti i file e trascinali in Blender.

Seleziona tutti i file

Trascina in Blender
Fai clic su Import Wavefront OBJ. Per avere l'orientamento corretto imposta Up Axis su Z e Forward Axis su X.

Imposta Up Axis su Z e Forward Axis su X
Ora tutti i tasselli sono importati.

Tutti i tasselli importati
Premi A per selezionare tutti i tasselli, poi Ctrl + J per unirli in una sola mesh. Con una scena grande può richiedere circa un minuto, lascia che finisca.

Una singola mesh unita
Nota: se non serve rilluminare tutta la scena, elimina le parti che non ti servono per guadagnare prestazioni in Unreal Engine.
Passaggio 3: ridurre le draw call
Quando questa mesh entra in Unreal Engine per la rilluminazione, nessuno dei suoi materiali serve. Il 3DGS gestisce ciò che si vede e la mesh proxy alimenta solo il calcolo, quindi i materiali non hanno alcuna utilità e consumano risorse.
Ogni texture di una mesh di LixelStudio corrisponde a una draw call in Unreal Engine. Su larga scala si arriva a un numero molto alto di draw call, e usare la mesh direttamente come proxy causa rallentamenti.
Seleziona la mesh nella Collection e controlla il numero di draw call dalla console Python di Blender.

Passa alla console Python
Incolla il comando seguente e premi Enter:
obj = bpy.context.object
print("Material slots:", len(obj.data.materials))

Il valore stampato è il numero di draw call
La mesh nello screenshot ha 8859 draw call.
Per abbassarlo, rimuovi tutti i materiali esistenti e sostituiscili con uno solo:
import bpy
# Get the currently selected object in Blender
obj = bpy.context.object
# Make sure a valid Mesh object is selected
if obj is None or obj.type != "MESH":
raise Exception("Please select a Mesh object first.")
# Create a new white clay material
mat = bpy.data.materials.new("M_White_Clay")
mat.use_nodes = True
# Configure the Principled BSDF shader settings
bsdf = mat.node_tree.nodes.get("Principled BSDF")
if bsdf:
bsdf.inputs["Base Color"].default_value = (1, 1, 1, 1) # White color
bsdf.inputs["Roughness"].default_value = 1.0 # Fully rough / matte surface
bsdf.inputs["Metallic"].default_value = 0.0 # Non-metallic material
bsdf.inputs["Alpha"].default_value = 1.0 # Fully opaque
# Remove all existing material slots from the mesh
obj.data.materials.clear()
# Add the single new white material
obj.data.materials.append(mat)
# Assign every face to material slot 0
for poly in obj.data.polygons:
poly.material_index = 0
# Print the result for verification
print("Done")
print("Material slots:", len(obj.data.materials))
print("Used material indices:", len(set(p.material_index for p in obj.data.polygons)))
print("Estimated draw calls:", len(set(p.material_index for p in obj.data.polygons)))
Dopo l'esecuzione, verifica che il numero di draw call sia sceso a una.

Draw call ridotte a una
Passaggio 4: importare in Unreal Engine
Esporta la mesh come .obj o .fbx e importala in Unreal Engine.

La mesh dopo l'importazione in Unreal Engine
Poi segui Mesh proxy per posizionare il ProxyMesh Actor e impostare la modalità di normali su ProxyMesh.
Se il risultato non è quello atteso, vedi Risoluzione dei problemi della mesh proxy.