Move object around cube’s corner without jittering using accelerometer

Viewed 18

I can move object (star) around cube’s corner using accelerometer. Object move following the orbit (green circle). Control inverted, if I tilt right object go left and vise versa.

initial conditions

While spinning cube around corner object move perfect. But when I stop spinning cube, object on one of the cube’s edges, cause of inverted control start jittering.

points where object jitters

For example if I try to stop object between red and blue planes, it begins jumping from one plane to another.

example

Code for object movement

new accelX = abi_MTD_GetFaceAccelX(object.plane);
new accelY = abi_MTD_GetFaceAccelY(object.plane);
object.angle -= accelX - accelY;
if (object.angle >= 90) {
           object.plane = GetRightPlane(object.plane);
           object.angle -= 90;
} else if (object.angle <= 0) {
           object.plane= GetBottomPlane(object.plane);
           object.angle = 90 + spaceship.angle;
}
MovePointAlongCircle(OUT object.posX, OUT object.posY, object.orbit, object.angle);

Find coordinate on plane

const OBJECT _ORBIT_CENTER = 260;
new objectOrbit = 150;
MovePointAlongCircle(&posX, &posY, objectOrbit, anglePhi) {
    posX = OBJECT_ORBIT_CENTER - (objectOrbit * cos(anglePhi));
    posY = OBJECT _ORBIT_CENTER - (objectOrbit * sin(anglePhi));
}

I can get accelerometer values individually on each plane or like the cube is a one thing. Trigonometric functions like sin and cos use fixed point and look up table. I've got atan function, which return angle [-45; 45].

Atan(x) {
    return ((PI_4_FIXED * x >> FP) - ((x * (ABS(x) - 256) >> FP) * (62 + (17 * ABS(x) >> FP)) >> FP)) * RAD_2_DEG >> FP;
}
0 Answers
Related