1

I get the x- and y-orientation from an RFID-Tag and want to animate the movement in a JavaFX application. It's my first java project so I'm sorry if there are stupid mistakes.

I rotate an box-node in the way of this and this thread. Two pictures of how the green node rotates in front of the RFID-reader image in the background enter image description here xAxis=red, yAxis=green, zAxis=blue enter image description here.

I call the rotateNode method like that:

// calculate necessary variables:
delta_x = -x_angle + x_angle_old;
delta_y = -y_angle + y_angle_old;

delta_x_radians = Math.toRadians(delta_x);
delta_y_radians = Math.toRadians(delta_y);

pitch_rad = delta_y_radians;
yaw_rad = 0d; // not used at the moment
roll_rad = delta_x_radians;

if (!((roll_rad == 0d) && (pitch_rad == 0d) && (yaw_rad == 0d))) {
    rotateNode(model3D, pitch_rad, yaw_rad, roll_rad);
}

My box-node has the position (0,0,-200) at the beginning and the center of the object should stay in that position the hole time. Just the orientation in two directions should change. My rotateNode method looks like this:

public static void rotateNode(Group n, double pitch_rad, double yaw_rad, double roll_rad) {// , TranslateTransition
                                                                                            // tt_z) {
    double A11 = Math.cos(roll_rad) * Math.cos(yaw_rad);
    double A12 = Math.cos(pitch_rad) * Math.sin(roll_rad)
            + Math.cos(roll_rad) * Math.sin(pitch_rad) * Math.sin(yaw_rad);
    double A13 = Math.sin(roll_rad) * Math.sin(pitch_rad)
            - Math.cos(roll_rad) * Math.cos(pitch_rad) * Math.sin(yaw_rad);
    double A21 = -Math.cos(yaw_rad) * Math.sin(roll_rad);
    double A22 = Math.cos(roll_rad) * Math.cos(pitch_rad)
            - Math.sin(roll_rad) * Math.sin(pitch_rad) * Math.sin(yaw_rad);
    double A23 = Math.cos(roll_rad) * Math.sin(pitch_rad)
            + Math.cos(pitch_rad) * Math.sin(roll_rad) * Math.sin(yaw_rad);
    double A31 = Math.sin(yaw_rad);
    double A32 = -Math.cos(yaw_rad) * Math.sin(pitch_rad);
    double A33 = Math.cos(pitch_rad) * Math.cos(yaw_rad);

    double d = Math.acos((A11 + A22 + A33 - 1d) / 2d);
    if (d != 0d) {
        double den = 2d * Math.sin(d);
        if (den != 0d) {
            Point3D p = new Point3D((A32 - A23) / den, (A13 - A31) / den, (A21 - A12) / den);
            x_pos_node = (n.localToScene(n.getBoundsInLocal()).getMaxX()
                    + n.localToScene(n.getBoundsInLocal()).getMinX()) / 2d;
            y_pos_node = (n.localToScene(n.getBoundsInLocal()).getMaxY()
                    + n.localToScene(n.getBoundsInLocal()).getMinY()) / 2d;
            z_pos_node = (n.localToScene(n.getBoundsInLocal()).getMaxZ()
                    + n.localToScene(n.getBoundsInLocal()).getMinZ()) / 2d;
            r.setPivotX(x_pos_node);
            r.setPivotY(y_pos_node);
            r.setPivotZ(z_pos_node);
            r.setAxis(p);
            r.setAngle(Math.toDegrees(d));
            n.getTransforms().add(r);
            Transform all = n.getLocalToSceneTransform();
            n.getTransforms().clear();
            n.getTransforms().add(all);
        }
    }
}

Printing the following variables shows that the node moves in y although I don't want that to happen. Also I see, that slowly with time the pivot point of the rotation isn't in the center of the node anymore and when I turn the RFID-Tag it doesn't spin around the middle of the node it spins in a circle which gets bigger and bigger..

from:

x_pos_node:     0,00
y_pos_node:     0,39
z_pos_node:  -200,00
MaxX:   199,00
MinX:  -199,00
MaxY:     2,78
MinY:    -2,00
MaxZ:  -176,12
MinZ:  -223,88
Depth:   47,76
Height:   4,78
Width:  398,00

to:

x_pos_node:     0,00
y_pos_node:    15,52
z_pos_node:  -200,00
MaxX:   198,51
MinX:  -198,51
MaxY:    38,35
MinY:    -7,31
MaxZ:  -130,85
MinZ:  -269,15
Depth:  138,30
Height:  45,67
Width:  397,02

Picture from the side that shows how the green node moves under blue z-Axis / zero line: enter image description here.
Where is my mistake? Why does the object slowly moves instead of just rotating?

It is possible to fix the wrong position when I add an Translation:

n.getTransforms().add(new Translate(0, -y_pos_node, 0)); 

But that's just an hotfix and you can see how the object moves down and up again.. I think there is an error in the calculations or the positioning of the pivot point. It also turns a bit around the green y-Axis although "yaw_rad" is set to 0;

MrH Punkt
  • 33
  • 3

0 Answers0