Skip to content
Li, Xizhi edited this page Aug 21, 2017 · 2 revisions

Full random Tree

-- generate a random tree
local function random(min_value, max_value)
    return min_value + math.random()*(max_value - min_value);
end

function make_tree(level, length, last_radius, leave_size)
    last_radius = last_radius or length*0.2;
    local radius = last_radius*0.5;

    if(level>1) then
        -- branch
        color("brown")
        cylinder({ r1 = last_radius, r2 = radius, h = length})
        
        translate(0, length, 0)
        for i = 1, math.random(2, 3) do
            push()
            if(i>1) then
                rotate({random(10, 45), random(0, 360), 0})
            end
            make_tree(level-math.random(1,2), length*random(0.5,0.9),radius,leave_size);
            pop()
        end
    else
        -- tree leaves
        color("green")
        scale(leave_size)
        local leave_count = random(2, 6)
        cube(leave_count*0.5);
        for i=1, leave_count do
            push()
            translate(random(-leave_count,leave_count), random(-leave_count,leave_count), random(-leave_size,leave_size))
            cube(leave_count*0.5);
            pop()
        end
    end
end
scale(1/5)
math.randomseed(12345678);
make_tree(6, 4, 0.5, 0.3);

Simple Tree

function make_tree(level, length, last_radius, leave_size)
    last_radius = last_radius or length*0.2;
    if(level>1) then
        -- branch
        color("brown")
        cylinder({ r1 = last_radius, r2 = last_radius*0.5, h = length})
        translate(0, length, 0)
        for i = 1, math.random(2, 3) do
            push()
            rotate({math.random(10, 45), math.random(0, 360), 0})
            make_tree(level-math.random(1,2), length*0.5,last_radius*0.5,leave_size);
            pop()
        end
    else
        -- tree leaves
        color("green")
        cube(leave_size);
    end
end
make_tree(6, 4, 0.5, 0.3);

Clone this wiki locally