I want to ask that how to rotate body from corner?

movableBeam.getBeamBody().setTransform(movableBeam.getBeamBody().getPosition(), angle);

The above line of code rotate the beam from center that I want rotate from one of the conner. Any member please help me.


            float beamCenterX = movableBeam.getX() + movableBeam.getWidth()
                    / 2f;
            float beamCenterY = movableBeam.getY()
                    + movableBeam.getHeight() / 2f;

            float cornerOffsetX = movableBeam.getX() - beamCenterX;
            float cornerOffsetY = movableBeam.getY() - beamCenterY;

            float bodyAngle = (float) Math.atan2(cornerOffsetY,

            float newAngle = imageAngle + bodyAngle;
            float newCornerOffsetX = (float) Math.cos(Math
            float newCornerOffsetY = (float) Math.sin(Math

            cornerOffsetX = movableBeam.getX() - movableBeam.getWidth()
                    / 2f;
            cornerOffsetY = movableBeam.getY() - movableBeam.getHeight()
                    / 2f;

            Vector2 postion = new Vector2(
                    (newCornerOffsetX - cornerOffsetX + movableBeam.getX())
                            / PhysicsConstants.PIXEL_TO_METER_RATIO_DEFAULT,
                    (newCornerOffsetY - cornerOffsetY + movableBeam.getY())
                            / PhysicsConstants.PIXEL_TO_METER_RATIO_DEFAULT);

            movableBeam.getBeamBody().setTransform(postion, newAngle);
  • 2
    \$\begingroup\$ You store the position of the corner before the rotation, subtract it from the position of the corner after rotation and offset(move) the position of said object by that vector. \$\endgroup\$
    – AturSams
    Oct 1, 2012 at 10:57

3 Answers 3


Rotate and then move the object

When we rotate a object in 2d, each corner is a vector (x,y) away from the center. That vector has an angle.

Get the offset of the selected corner from the center:

cornerOffset.x =  corner.x - center.x;
cornerOffset.y =  corner.y - center.y;

To calculate this angle we do something like this in AS3 / Java

angle = Math.Atan2(corner.y - center.y, corner.x - center.x); //you can use the previously calculated values

It's length

length = Math.sqrt((corner.x - center.x)^2 + (corner.y - center.y)^2); //same

Sometime, if the object is rectangular, the corner will probably be at:

cornerOffset = center.x (+/-) width/2.0, corner.y (+/-) height

After rotating the object from the center by (B) degrees, the vector for the offset has been rotated as well.

So the new corner position will be:

newAngle = angle + B;
newCornerOffset.x = length * Math.cos(newAngle);
newCornerOffset.y = length * Math.sin(newAngle);

objectOffset.x = cornerOffset.x - newCornerOffset.x;
objectOffset.y = cornerOffset.y - newCornerOffset.y;

Now give the object sufficient speed to get it back to where you want it.

Speed = objectOffset / deltaTime .. 

In your specific case the object is (168px wide, 14px tall) so the original offset would be (84, 7)

Each frame you need to check the current angle and know the next angle.

Then calculate :

cornerOffset.x = length * Math.cos(currentAngle);
cornerOffset.x = length * Math.sin(currentAngle);

newAngle = currentAngle + angleChange; //angle change for this frame
newCornerOffset.x = length * Math.cos(newAngle);
newCornerOffset.y = length * Math.sin(newAngle);

moveObject(currentCornerOffset.x - newCornerOffset.x, currentCornerOffset.y - newCornerOffset.y);
  • \$\begingroup\$ All the (x,y) coordinate I have to get for body or sprite that I have not understand. \$\endgroup\$
    – Siddharth
    Oct 1, 2012 at 11:37
  • \$\begingroup\$ Can you paste a screenshot of the shape you are rotating? \$\endgroup\$
    – AturSams
    Oct 1, 2012 at 12:24
  • \$\begingroup\$ To calculate the position of the corner, I would need to know more about the object you are moving, is it rectangular, what is the width and the height? If not, the could you please elaborate. \$\endgroup\$
    – AturSams
    Oct 1, 2012 at 12:40
  • \$\begingroup\$ It is simply rectangular beam with width of 168px and height of 14px. I tried to convert you code but I doesn't get desired output. \$\endgroup\$
    – Siddharth
    Oct 1, 2012 at 12:46
  • \$\begingroup\$ Can you share all the new code in the body of the question? You probably need to calculate the speed each frame, based on the previous angle and the current angle of the object. \$\endgroup\$
    – AturSams
    Oct 1, 2012 at 12:51

By default the body was rotated from center but you can change that point following way.

PolygonShape shape = new PolygonShape();
shape.setAsBox(width, height, new Vector2(0f, height / 2f), angle);

In this manner you can create body that rotate from the corner not the center.


you can rotate the body from corner by just making a body from where you want to rotate and set the density 1000 and above depends on body weight . and after that you can use body.setTransform(new Vector2(x,y), MathUtil.degToRad(Sprite.getRotation()).

  • \$\begingroup\$ This is a poorly formatted summary of Arthur's answer... \$\endgroup\$
    – Anko
    Feb 23, 2013 at 14:38

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .