3D cylinder?

Ive just started 3D, bit late I know but it seems easy enough, I’m just stuck on making cylinders, I know how to create the vertices but not how to triangulate in 3d (dont think thats possible) so it will end up with missing triangles in it, does anyone have a class or a way of making the vertices? Thanks.

(Untested)

height = 100
radius = 20
corners = {{0,0},{1,0},{1,1},{0,0},{0,1},{1,1}}
vertices = {}
hstep = 10
astep = 20
for h=hstep,height,hstep do
  for a=astep,360,astep do
    for _,v in ipairs(corners)
      table.insert(vertices,vec3(radius*math.cos(a - astep*v[1]),
                                             radius*math.sin(a - astep*v[1]),
                                             h - hstep*v[2]))
    end
  end
end

You will find some examples for sphere and cilinder there: http://jmv38.comze.com/CODEAbis/server.php in the 8th project

@Luatee here’s a demo of cylinders as an additional tab to the 3D lab. You need to change line 7 in the main tab to

    availableTests = { Test2(), Test1(), Test3() }

And copy the following into a new tab called Test3


Test3 = class()

function Test3:name()
    return "3D Cylinders"
end

function Test3:init()
    -- all the unique vertices that make up a cube
    
    local vertices={}
    local numfaces=24
    local top=0.5
    local bottom=-0.5
    local r=0.5

--corners every second set of faces
    for face=1,numfaces do
        rot=face*math.rad(360/numfaces)
        adj=math.rad(180/numfaces)--was6
        vertices[(4*face)-3]=vec3(r*math.sin(rot-adj), bottom,  r*math.cos(rot-adj)) -- Left  bottom front
        vertices[(4*face)-2]=vec3( r*math.sin(rot+adj), bottom,  r*math.cos(rot+adj)) -- Right bottom front
        vertices[(4*face)-1]=vec3( r*math.sin(rot+adj),  top,  r*math.cos(rot+adj)) -- Right top    front
        vertices[(4*face)]=vec3(r*math.sin(rot-adj),  top,  r*math.cos(rot-adj)) -- Left  top    front
    end
    local cubeverts = {}
    for face=1,numfaces do
        table.insert(cubeverts,vertices[(face*4)-3])
        table.insert(cubeverts,vertices[(face*4)-2])    
        table.insert(cubeverts,vertices[(face*4)-1])
        table.insert(cubeverts,vertices[(face*4)-3])    
        table.insert(cubeverts,vertices[(face*4)-1])
        table.insert(cubeverts,vertices[(face*4)])    
    end

    local texv={}
    for i=0,numfaces-1 do
        table.insert(texv,vec2(i/numfaces,0))
        table.insert(texv,vec2((i+1)/numfaces,0))
        table.insert(texv,vec2(i/numfaces,1))
        table.insert(texv,vec2((i+1)/numfaces,1))                       
    end

    local cubetexCoords={}

    for face=1,numfaces do    
        table.insert(cubetexCoords,texv[(face*4)-3])
        table.insert(cubetexCoords,texv[(face*4)-2])    
        table.insert(cubetexCoords,texv[(face*4)])
        table.insert(cubetexCoords,texv[(face*4)-3])    
        table.insert(cubetexCoords,texv[(face*4)])
        table.insert(cubetexCoords,texv[(face*4)-1])    
    end
    

    -- now we make our 3 different block types
    self.ms = mesh()
    self.ms.vertices = cubeverts
    self.ms.texture = "Cargo Bot:Crate Yellow 3"
    self.ms.texCoords = cubetexCoords
    self.ms:setColors(255,255,255,255)
    
    self.md = mesh()
    self.md.vertices = cubeverts

    self.md.texture = "Cargo Bot:Crate Blue 3"
    self.md.texCoords = cubetexCoords
    self.md:setColors(255,255,255,255)
    
    self.mg = mesh()
    self.mg.vertices = cubeverts
    self.mg.texture = "Cargo Bot:Crate Red 3"
    self.mg.texCoords = cubetexCoords
    self.mg:setColors(255,255,255,255)   
    
    -- currently doesnt work properly without backfaces
    self.mw = mesh()
    self.mw.vertices = cubeverts
    self.mw.texture = "Planet Cute:Water Block"
    self.mw.texCoords = cubetexCoords
    self.mw:setColors(255,255,255,100)
    
    -- stick 'em in a table
    self.blocks = { self.mg, self.md, self.ms }
    
    -- our scene itself
    -- numbers correspond to block positions in the blockTypes table
    --             bottom      middle      top
    self.scene = {   { {3, 3, 0}, {2, 0, 0}, {0, 0, 0} },
                     { {3, 3, 3}, {2, 2, 0}, {1, 0, 0} },
                     { {3, 3, 3}, {2, 2, 2}, {1, 1, 0} } }
end

function Test3:draw()
    pushMatrix()
    pushStyle()
    
    -- Make a floor
    translate(0,-Size/2,0)
    rotate(Angle,0,1,0)
    rotate(90,1,0,0)
    sprite("SpaceCute:Background", 0, 0, 300, 300) 

    -- render each block in turn
    for zi,zv in ipairs(self.scene) do
        for yi,yv in ipairs(zv) do
            for xi, xv in ipairs(yv) do
                -- apply each transform  need - rotate, scale, translate to the correct place
                resetMatrix()
                rotate(Angle,0,1,0)
                
                local s = Size*0.25
                scale(s,s,s)
                
                translate(xi-2, yi-2, zi-2)    -- renders based on corner
                                               -- so -2 fudges it near center
                
                if xv > 0 then
                    self.blocks[xv]:draw()
                end
            end
        end
    end
    
    popStyle()
    popMatrix()
end

function Test3:touched(touch)
    -- Codea does not automatically call this method
end

Oh and you can change the numfaces parameter. The higher the number the smoother the cylinder. A value of 3 will give you a triangular column, 4 will give a rectangular one and so on. I’ve also left off the top and bottom of the cylinders

That worked like a charm, thanks @West, how would I go about adding the upper and lower faces

@Luatee for the top, you need to add another vertex (in the vertices table) at the centre of your upper face then add the triangles to the cubeverts table, using this new point and two adjacent edges (the top face if you have set numfaces to 6 for a hexagon should look like this - http://3.bp.blogspot.com/_kl0df70KBgM/SnGWiF6Xw8I/AAAAAAAAADE/_-u4KE737i4/s1600-h/hexagon-with-lines.png)

You then need to add the textures to the newly created triangles. This might get tricky depending upon your source image for the texture.

The bottom is just the same process.

I did it another way, I created a 2d mesh the same shape and triangulated it then translated it to the bottom and top