Làm thế nào tôi có thể làm điều đó để tôi có thể duy trì một số kiểm soát nghệ thuật và không có khả năng mất nhiều thời gian cố gắng điều chỉnh một phương pháp thủ tục để làm cho nó phù hợp ...
Đầu tiên, hãy tự tay tạo ra một số nhánh của lá trà làm "hồ bơi" nghệ thuật của bạn - không phải là một lá trà có giá trị như toàn bộ một tách, mà giống như một nhóm nhỏ hơn. Nói, 20 trong số họ hay như vậy?
Sau đó đặt một số ngẫu nhiên của chúng tại tọa độ ngẫu nhiên trên cơ sở "cốc". Cung cấp cho mỗi vòng quay ngẫu nhiên và tỷ lệ cộng với phản chiếu ngang và / hoặc dọc ngẫu nhiên. Điều này nên tạo ra một kết quả tốt.
Cách tiếp cận này sẽ mang lại cho bạn sự tự do nghệ thuật trong việc tạo ra các cụm riêng lẻ để có giao diện bạn muốn, đồng thời cho phép tạo ra nhiều kết quả lớn (giả sử đủ các họa tiết để lựa chọn).
Ngoài ra, với phương pháp này (và bất kỳ phương pháp ngẫu nhiên nào bao gồm cả nhiễu Perlin), bạn thực sự có thể gieo hạt tạo số ngẫu nhiên khi bắt đầu quá trình với một hạt giống đã biết để tạo ra kết quả có thể lặp lại. Nếu bạn lưu hạt giống, bạn có thể tạo lại chính xác mẫu tương tự một lần nữa bằng cách khởi động lại ngay trước khi chuỗi bắt đầu. Bạn thậm chí có thể làm những điều thú vị như có ai đó gõ tên của họ, biến các chữ cái thành một số (tổng ASCII, v.v.), sau đó sử dụng đó làm hạt giống như một loại "mẫu lá trà này được tùy chỉnh cho BẠN!" Điều.
Đây là một số mã giả cho những gì tôi muốn nói, nếu điều đó giúp ...
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);
}
Hãy xem http://mathworld.wolfram.com/DiskPointPicking.html để biết một cuộc thảo luận tuyệt vời về cách chọn một điểm ngẫu nhiên trong đĩa và lý do tại sao tôi sử dụng toàn bộ điều sqrt / sin / cos đó.