Texturen zufällig verteilen

smileyml

Tankwart
Premium-User
Hallo,

ich habe 4830 Würfel und habe 5 verschiedene Farben/Texturen zur Auswahl. Besteht die Möglichkeit per Bordmitteln oder per Plugin die Texturen zufällig zu verteilen ohne das man das per Hand machen muss. Über den imensen Arbeitsaufwand kommt noch hinzu, das der Mensch ein schlechter Zufallsgeneratot :) ist.

Vielen Dank schonmal

Grüsse
Marco
 
Was ich auf die schnelle finden konnte war:
http://www.plugincafe.com/cafedownloads/TouchTexture2-1.zip

Beschreibung:
Touch Texture 2
by Paul Everett
dem selektierten Objekt werden die Texturen zugewiesenen, welche angeklickt werden. Dies ermöglicht ein einfaches ausprobieren verschiedener Materialien.

Das würde auf jedenschonmal die Geschwindigkeit deutlich erhöhen ;)

MfG Dominik :D

edit:
*grummel*... sei halt ma wenigstens langsamer *Gg*
 
Ich danke euch beiden.

Mit Random Material sollte ich es irgendwie hinbekommen. Wobei der Material Mixer auch gut zu schein seit, ich jedoch C.O.F.F.E.E. gar nicht kann. Und da er da wegen einer Zeile rummeckert kann ich mir da wenig helfen. Aber das andere geht ja auch.

Danke nochmal und Grüsse
Marco
 
Ich habe doch noch ne Frage. Ich habe mich doch dazu entschieden das mit der C.O.F.F.E.E. - Expression zumachen. Jetzt meine Frage. Hat jemand Ahnugn, was ich an dieser Ändern muss um den Texturen bei der Verteilugn eine Wichtung zu geben, also zu sagen wie oft sie auftauchen sollen.

Hier mal der C.O.F.F.E.E. Text

Code:
var seed = 768;

/** seed ändern und auf "Ausführen klicken, damit die
Materialien zufällig neu vergeben werden.
Bitte beachten, dass die Demo-Materialien mit kopiert
werden, wenn das Nullobjekt mit Unterobjekten in eine
neue Szene kopiert wird.												***/
/** change seed and press execute to change
materials randomly.
Please remember that the demo-materials will be copied
if the Null-Objekt is copied into another scene along
with its sub-objects.														***/

/******************************************************/
/******************************************************/
/*****             random material     		    *****/
/*****		    ZufallsMaterial		       *****/
/******************************************************/
/******************************************************/
main(doc,op)
{
	var rnd = new(Random);
	rnd->Init(seed);

	var i;

	i=0;
	var mat = doc->GetFirstMaterial();
	//Materialien zählen
	while(mat)
	{
		i++;
		mat = mat->GetNext();
	}

	var matarr = new(array,i);

	mat = doc->GetFirstMaterial();
	i=0;
	while(mat)
	{
		matarr[i] = mat->GetMarker();
		i++;
		mat = mat->GetNext();
	}

	var ttag;
	var obj = op->GetDown();
	while(obj)
	{
		ttag = obj->GetFirstTag();
		while(!instanceof(ttag,TextureTag))	{ ttag = ttag->GetNext(); }
		
		ttag->SetMaterial( matarr[int(floor(rnd->Get01()*i))] );
		obj = obj->GetNext();
	}

}

Grüsse
Marco
 
Zuletzt bearbeitet:
Ich hab zwar gar keine Ahnung von C.O.F.F.E.E aber da der Code doch ganz grob an C++ erinnert kann ich mir zusammenreimen was genau da passiert.

Nach dem was ich aus dem Code herauslesen konnte verwendet der ALLE verfügbaren Materialien ausm Materialmanager rein zufällig und durchschnittlich daher gleichoft. Dafür werden die Materialnamen in einen Array geladen aus dem dann zufällig einer ausgewählt wird.
D.h. du sorgst entweder dafür das die Materialien in Kopien die der Wichtung entsprechen vorhanden sind oder du lässt den Array nicht automatisch erzeugen sondern bestückst ihn automatisch.. wenn du einen Array:
1 -> material 1
2 -> material 1
3 -> material 2
4 -> material 3
hast wird im Verhältnis 2:1:1 verteilt...

Da ich hier wirklich überhaupt nicht ausprobieren kann was für Möglichkeiten mir C.O.F.F.E.E gibt kann ich dir leider nicht sagen ob und wie du manuelle Wichtungen vornehmen kannst. Wenn es möglich ist über C.O.F.F.E.E Input zu realieren müsste das mit den Wichtungen kein Problem sein.. evtl kann ich mich morgen abend mal hinsetzen und mich damit beschäftigen.. aber versprechen tu ich nix *gg*

MfG Dominik :D

edit:
Bin inzwischen soweit das ich weiß wie ich Dialogboxen öffne und wie ich die Materialien auslese.. also ich denk ma ich werd da was hinbekommen.. wenn ich net mal wieder in meinen schlimmsten Feind, die Faulheit, verfalle :rolleyes:
 
Zuletzt bearbeitet:
Hi!

Auch, wenn die "Dialogboxen" vom TheLightning sehr schön klingen, eine sehr schnell gemachte Version von mir (ohne Abfangen von Fehlern, mehr eine Idee ;) ).
Ansatz: es wird ein String mit den Materialien X Vorkommen erzeugt, z.B. "000122" = 3xMaterial_0, 1xMaterial_1,1xMaterial_2. Nun wird per Zufall ein "Buchstabe" daraus gewählt und "entfernt", dies im Loop für alle Objekte. Die Summe der Materialien sollte allerdings der tatsächlichen Summe der Objekte entsprechen, Fehler werden nicht abgefangen... ;)
(ist keine elegante Lösung, per Array wäre es schöner. Wusste aber nicht, wie ich z.B. ein Element eines Arrays entferne :( )

Code:
var seed = 759;
main(doc,op)
{
// Definition
var matcnt = new(array,3);
matcnt[0] = 1; // Anz.Material 0
matcnt[1] = 2; // Anz.Material 1
matcnt[2] = 2; // Anz.Material 2
// Summe sollte Objektanz. entsprechen
println("**********Start**********");
// Init Random
var rnd = new(Random);
rnd->Init(seed);
// Texturen-String
var matall;
var i,j;
for (i=0; i<sizeof(matcnt); i++) {
for (j=0; j<matcnt[i]; j++) {
matall = stradd(matall,tostring(i));
}
}
println("TexString: ",matall);
// Materialien-Marker
var matarr = new(array,sizeof(matcnt));
var mat = doc->GetFirstMaterial();
i=0;
while(mat) {
matarr[i] = mat->GetMarker();
i++;
mat = mat->GetNext();
}
// Verteilung
var ttag;
var random, rndmat;
var obj = op->GetDown();
// alle Objekte durchgehen
while(obj) {
ttag = obj->GetFirstTag();
while(!instanceof(ttag,TextureTag)) { ttag = ttag->GetNext(); }
// Zufall im String
random = int(floor(rnd->Get01()*(sizeof(matall))));
rndmat = int(evaluate(strmid(matall,random,1)));
println("Zufall: ",random," Material: ",rndmat);
ttag->SetMaterial( matarr[rndmat] );
matall = stradd(strmid(matall,0,random),strmid(matall,random+1,sizeof(matall)));
println("TexString: ",matall);
obj = obj->GetNext();
}
}

Liebe Grüße,
Mark.
 
Das kann ich Dir glaub ich sogar sagen:
Array[0] = 5; //schreibt in Feld 0 des Arrays den Wert 5
Array[0]--; //dekrementiert den Inhalt des Feldes 0 .. folglich besitzt es nun den Wert 4 :)

MfG Dominik :)

btw: mein Gedanke war ein Ähnlicher nur das ich die Anzahl der markierten Objekte verwenden wollte und dann "einfach" über Regler eine Verteilung auf die Objekte(rein Anzahlmässig) realisieren wollte... mal schaun ob ich das hinbekomm.. hab schon gesehen das die Regler zu realisieren recht aufwendig ist :)
 
Zuletzt bearbeitet:
Hi!

@TheLightning: ...das ist mir schon klar ;)
Nein, was ich vermisse sind Befehle ala: shift, push, splice
...es scheint so, daß Coffee nur Arrays fixer Längen verarbeitet...

Liebe Grüße,
Mark.
 
Hi!

*g* die "Dialogboxen" haben mich schon "gereizt" ;)
Somit - auch, wenn sich das Thema schon erledigt haben dürfte - hier mein erstes Test-Plugin RanTex :) Wegen Zeitmangel noch voller Bugs, somit:
Benutzung auf eigene Gefahr!

Kurzanleitung:
Zu texturierende Objekte unterhalb z.B. eines Null-Objekts platzieren. Dem Null-Objekt die gewünschten Texturen-Tags zuweisen. Neue Expression / RandomTexture Expression zuweisen. Per "OK" werden die Texture-Tags gleichmäßig, zufällig auf die Unterobjekte verteilt...
Per Palette Texture-Tags kann die Anzahl der verwendeten Texture-Tags manipuliert werden:
Checkbox - Texture-Tag benützen an/aus
Anzahl 0 - automatisch Anzahl.
Palette Generell:
Zufall - einmalige Verteilung
Zufall pro Bild - ständige Neuverteilung
Auffüllen - arbeitet die Palette Texture-Tags von oben nach unten ab.
Immer überschreiben - erstes vorhandenes Texture-Tag der Unterobjekte wir ersetzt.
Nur Material überschreiben - nur Material des ersten vorhandenen Texture-Tags wird ersetzt, Textureinstellungen (Mappingart, -position etc.) bleiben erhalten.
Nie überschreiben - erzeugt immer ein neues Texture-Tag (Vorsicht bei Zufall pro Bild!)

Liebe Grüße,
Mark.
 

Anhänge

  • RanTex.zip
    17,1 KB · Aufrufe: 55
Zurück