Howdy, Stranger!

It looks like you're new here. If you want to get involved, click one of these buttons!

Rotate mesh around its center

in Questions Posts: 154

Hey everyone,

I'm trying to add shadows to my game, which are rotated and stretched over the course of the day. I'm trying to do it by using meshes. My basic setup is this one:

shadow.vertices = {vec2(0, 0), vec2(64, 0), vec2(0, 64), vec2(0, 64), vec2(0, 64), vec2(64, 64)}

This is basically a rectangle. My problem is this: When using sprites, it is possible to rotate them around their center by using transform(x,y) rotate(r) sprite("...", 0, 0). However, I'm not sure how the same thing can be done with meshes. Is there a way to rotate a mesh around its center?

Comments

  • Posts: 887

    @Elias yes - the built in mesh example shows this using the rotate function. The way you have set up your mesh it will rotate about the bottom left (0,0). You could redefine your mesh to vec2(-32,-32),vec2(32,-32),vec2(-32,32) etc to centre it, or do a translate(-32,-32) prior to the rotation

  • dave1707dave1707 Mod
    edited May 11 Posts: 9,415

    Just in case anyone wants a demo.

    viewer.mode=FULLSCREEN
    
    function setup()
        rot=0
        size=250
        ms=mesh()
        ms.vertices = {vec2(-size,-size), vec2(size, -size), vec2(-size,size), 
                        vec2(-size,size), vec2(size,size), vec2(size,-size)}
        ms:setColors(255,255,255)
        ms:color(1,255,0,0)
        ms:color(2,0,255,0)
        ms:color(3,0,0,255)
        ms:color(4,0,0,255)
        ms:color(5,255,0,0)
        ms:color(6,0,255,0)
    end
    
    function draw()
        background(0, 255, 223)
        rot=rot+1
        translate(WIDTH/2,HEIGHT/2)
        rotate(rot)
        ms:draw()  
    end
    
  • Posts: 171

    if you want to avoid using style transformation functions in the draw, you can use the setRect function of the mesh

    mesh:setRect(id, x, y, w, h, r)

    the r is rotation angle

  • edited May 12 Posts: 154

    Thanks to all of you!

    @West Thanks! I had tried that before but apparently messed it up.
    @dave1707 The demo helped me a lot!
    @skar Typically, I use rects. But I'm not sure whether the vertices of that rect can be manipulated afterwards, which is necessary for the sahdows

  • Posts: 171

    @Elias i’m not sure either, i do know that the vertices are accessible through the mesh object and you can set them directly, take a look at the Roller Coaster example

    please keep us posted on your progress, i’d like shadows in my work too, i’m working on a 2D side scroller but i’d like object cast shadows, not the raycast shadows, attached is what i’m NOT going for

  • dave1707dave1707 Mod
    Posts: 9,415

    @Elias Here’s an example of modifying the vertices of a mesh. Try changing the sliders.

    viewer.mode=STANDARD
    
    function setup()
        parameter.integer("v1",1,5,1)
        parameter.integer("v2",1,5,1)
        parameter.integer("v3",1,5,1)
        x1,y1=100,100
        x2,y2=200,100
        x3,y3=150,200
        m=mesh()
        m.vertices={vec2(x1,y1),vec2(x2,y2),vec2(x3,y3)}
        m:setColors(255,0,0)
    end
    
    function draw()
        background(40, 40, 50)
        m:vertex(1,x1*v1,y1*v1)
        m:vertex(2,x2*v2,y2*v2)
        m:vertex(3,x3*v3,y3*v3)
        m:draw()
    end
    
  • dave1707dave1707 Mod
    Posts: 9,415

    @Elias Heres another example of modifying the vertices. Tap and drag a corner of the triangle.

    viewer.mode=FULLSCREEN
    
    function setup()
        tab={   {x=WIDTH/2+100,y=HEIGHT/2-100},
                {x=WIDTH/2-100,y=HEIGHT/2-100},
                {x=WIDTH/2,y=HEIGHT/2}
            }
        m=mesh()
        m.vertices={vec2(tab[1].x,tab[1].y),
                    vec2(tab[2].x,tab[2].y),
                    vec2(tab[3].x,tab[3].y)}
        m:setColors(255,0,0)
    end
    
    function draw()
        background(40, 40, 50)
        for z=1,3 do
            m:vertex(z,tab[z].x,tab[z].y)
        end
        m:draw()
    end
    
    function touched(t)
        if t.state==BEGAN then
            for z=1,3 do
                if math.abs(t.x-tab[z].x)<20 and math.abs(t.y-tab[z].y)<20 then
                    sel=z
                    m:setColors(0,255,0)
                end
            end
        end
        if t.state==CHANGED and sel~=0 then
            for z=1,3 do
                if sel==z then
                    tab[z].x=t.x
                    tab[z].y=t.y
                end
            end
        end
        if t.state==ENDED then
            sel=0
            m:setColors(255,0,0)
        end
    end
    
  • dave1707dave1707 Mod
    Posts: 9,415

    Or if you want to move and rotate a square, try this. Tap the screen.

    viewer.mode=FULLSCREEN
    
    function setup()
        x,y,w,h=150,HEIGHT/2,200,200
        m=mesh()
        m:addRect(x,y,w,h)
        m:setColors(255,0,0)
        v,r=0,0
    end
    
    function draw()
        background(40, 40, 50)
        x=x+v
        r=r+v
        m:setRect(1,x,y,200,200,math.rad(r/2))
        m:draw()
    end
    
    function touched(t)
        if t.state==BEGAN then
            v=.5       
        end
    end
    
Sign In or Register to comment.