Domanda

Voglio mettere un clou di evidenziazione visiva (casella di selezione) su uno dei tanti tglplane che hanno molte texture diverse assegnate a loro. Come dovrei applicare una seconda texture di decalcomania a quel piano usando Glscene?

alcuni sfondo. Le varie trame diverse applicate agli aerei sono tutte memorizzate in un materialelibrary e assegnate ai rispettivi piani aerei Materiale.Materialibrary e materiale.Libmaterialname. Questo è il riutilizzo di texture corretti efficienti in quanto vengono caricati solo una volta indipendentemente da quante volte vengono utilizzate.

Cosa non puoi apparentemente fare è usare nessuna delle proprietà sul tgllane perché vengono ignorate una volta applicata una consistenza materialibrary ad essa.

I metodi che riesco a trovare per farlo sembrano avermi bisogno di modificare il libmateriale che ovviamente si applica a tutti gli altri aerei che condividono quella particolare consistenza, quindi è un no-go.

Un altro metodo ho individuato a Codice Google (Dama) risolve il problema creando a Secondo aereo che ha il proprio "evidenziabile" texture parzialmente trasparente applicata, che viene quindi posizionata leggermente sopra l'oggetto originale (un cubo come accade). Questo sembra un hack per aggirarlo e spero di evitarlo se possibile.

Se non è una capacità incorporata per Glscene, allora è presente un metodo per intercettare il rendering quando arriva a quel particolare piano e quindi utilizzare alcuni primitivi OpenGL per applicare la texture di decalcomania dopo che viene applicata la trama MaterialLibrary?

È stato utile?

Soluzione

Ecco un metodo, senza applicare una seconda texture ma tuttavia effettuare un marker visibile.

Quando si carica le trame, creare un secondo tgllibmateriale senza texture ma con qualsiasi modifica "evidenzia" che si desidera effettuare la texture 'selezionata' e chiamarlo lo stesso tranne che con "--Selezionato" aggiunto al nome. .

fMatLib.AddTextureMaterial('empty','empty.bmp', False);

with TGLLibMaterial.Create(fMatLib.Materials) do begin
  Material.MaterialLibrary := fMatLib;
  Texture2Name := 'empty';
  Name := 'empty-selected';
  Material.FrontProperties.Emission.Color := clrRed;
  Material.Texture.ImageBrightness := 1.5;
end;
.

Questo non consuma memoria texture perché non stai ricaricando la trama.

Allora nel tuo codice identifica l'oggetto che desideri evidenziare e fai qualcosa del genere.

fPickedMaterial := fPickedObject.Material.LibMaterialName;
fPickedObject.Material.LibMaterialName :=
  fPickedObject.Material.LibMaterialName + '-selected';
.

FPickedMateriale salva il nome del materiale originale in modo che possa ripristinarlo in un secondo momento.

Non perfettamente quello che voglio, ma funziona.Chiamalo un lavoro per ora.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top