Wie ich es wahrscheinlich machen würde, damit ich etwas Kunstkontrolle behalten und möglicherweise nicht lange versuchen kann, eine prozedurale Methode zu optimieren, um sie genau richtig zu machen ...
Erstellen Sie zunächst manuell eine Reihe von Sprites aus Teeblattklumpen als Ihren "Kunstpool" - nicht als Teeblätter einer ganzen Tasse, sondern eher als kleinere Gruppierung. Sagen wir, 20 von ihnen oder so?
Dann platzieren Sie eine zufällige Anzahl von ihnen an zufälligen Koordinaten auf der "Cup" -Basis. Geben Sie jeweils eine zufällige Drehung und Skalierung sowie eine zufällige horizontale und / oder vertikale Spiegelung. Dies sollte zu einem guten Ergebnis führen.
Dieser Ansatz gibt Ihnen die künstlerische Freiheit, die einzelnen Klumpen so zu gestalten, dass sie das gewünschte Aussehen haben, und ermöglicht gleichzeitig eine Vielzahl von Ergebnissen (vorausgesetzt, Sie haben genügend Sprites zur Auswahl).
Darüber hinaus können Sie mit dieser (und jeder zufälligen Methode, die auf Perlin-Rauschen basiert) den Zufallszahlengenerator zu Beginn des Prozesses mit einem bekannten Startwert setzen, um reproduzierbare Ergebnisse zu erzielen. Wenn Sie den Startwert speichern, können Sie genau das gleiche Muster erneut erstellen, indem Sie kurz vor Beginn der Sequenz erneut säen. Sie könnten sogar lustige Dinge tun, wie jemanden seinen Namen eingeben lassen, die Buchstaben in eine Zahl umwandeln (Summe ASCII usw.) und diese dann als Keim für eine Art "dieses für SIE angepasste Teeblattmuster" verwenden! Sache.
Hier ist ein Pseudocode für das, was ich meine, wenn das hilft ...
var sprites = [...]; // Array of tea leaf sprites
var n_leaves = rand(5)+5; // Random number of leaves from 5-9
for (i=0; i<n_leaves; i++) {
var sprite_index = rand(sprites.length); // Random sprite index
var r = rand(CUP_DIAMETER); // Random radius for point on disk calc
var theta = rand(2*PI); // Random theta (rotation) for point on disk
var sprite_x = sqrt(r) * cos(theta); // Sprite X
var sprite_y = sqrt(r) * sin(theta); // Sprite Y
var sprite_rotation = rand(2*PI); // Sprite rotation
var sprite_scale = rand(1) + 0.5; // Sprite scale from 0.5 to 1.5
var sprite_h_mirror = (rand(1) < 0.5 ? true : false); // If true, mirror horizontally
var sprite_v_mirror = (rand(1) < 0.5 ? true : false); // If true, mirror vertically
draw_sprite(sprite_index, sprite_x, sprite_y, sprite_rotation, sprite_h_mirror, sprite_v_mirror);
}
Unter http://mathworld.wolfram.com/DiskPointPicking.html finden Sie eine großartige Diskussion darüber, wie Sie einen zufälligen Punkt auf einer Festplatte auswählen und warum ich diese ganze Sache mit sqrt / sin / cos verwende.