3D ball rolling on wrong axis LibGDX

82 views Asked by At

Hello I'm trying to make a billiards game using libgdx. I'm using 3d models for the balls and an Orthographic Camera to view them. I am having trouble getting them to roll correctly after rolling on a different axis. Here is a clip of what they look like when they're rolling. As you can see they appear to be rotating as if they were on their starting axis. Is there any way to rotate it so that it looks like it's actually rolling. I am also not very familiar with transformation matrices or quaternions so im not too sure where to go.

Edit: Updated for clarity

Here is the code I use to update the rotation

public boolean update() {

    if (!visible) {
        return false;
    }
    Vector2 vBall = ballBody.getLinearVelocity();
    float vAngle = ballBody.getAngularVelocity();
    isMoving = true;
    float x = ballBody.getPosition().x * SCALE;
    float y = ballBody.getPosition().y * SCALE;

    Vector2 axisInPlane = new Vector2(y - center.y, x - center.x).rotateRad(Math.PI/2f);
    Vector3 axis3D = new Vector3(axisInPlane.x,axisInPlane.y,0f);

    ball3D.transform.rotate(axis, (float) Math.toDegrees(dist / RADIUS_PX));
    ball3D.transform.setTranslation(mapX(x), mapY(y), 0);

    
    
1

There are 1 answers

2
londonBadger On

Just to be sure, center is an arbitrary fixed point where there is no rotation and all rotations are derived from this distance/angle as the ball has no slippage. So you can directly get the axis with

Vector2 axisInPlane = new Vector2(y - center.y, x - center.x).rotateRad(Math.PI/2f);
Vector3 axis3D = new Vector3(axisInPlane.x,axisInPlane.y,0f);

Also Math.toDegree takes radians as an argument, not a float, so dist/RADIUS_PX will be off, you have to supply as a fraction of 2PI (360 degs in radians). Also this should be the circumference of the ball not the radius. I don't know what class ball3D is but I would check that ball3D.transform.rotate does take degrees as an argument and if it does replace that line with

float rotateRadians =(float) Math.toDegrees((dist/CIRCUMFERENCE_PX)*Math.PI*2f);
ball3D.transform.rotate(axis, rotateRadians );