2 Transformation Types and Examples
This document describes specific transformations and provides code examples.
Translation
The translation transformation shifts a node from one place to another along one of the axes relative to its initial position. The initial position of the xylophone bar is defined by x, y, and z coordinates. In Example 2-1, the initial position values are specified by the xStart
, yPos
, and zPos
variables. Some other variables are added to simplify the calculations when applying different transformations. Each bar of the xylophone is based on one of the base bars. The example then translates the base bars with different shifts along the three axes to correctly locate them in space.
Example 2-1 shows a code snippet from the sample application with the translation transformation.
Example 2-1 Translation
Group rectangleGroup = new Group(); rectangleGroup.setDepthTest(DepthTest.ENABLE); double xStart = 260.0; double xOffset = 30.0; double yPos = 300.0; double zPos = 0.0; double barWidth = 22.0; double barDepth = 7.0; // Base1 Cube base1Cube = new Cube(1.0, new Color(0.2, 0.12, 0.1, 1.0), 1.0); base1Cube.setTranslateX(xStart + 135); base1Cube.setTranslateZ(yPos+20.0); base1Cube.setTranslateY(11.0);
Rotation
The rotation transformation moves the node around a specified pivot point of the scene. You can use the rotate
method of the Transform
class to perform the rotation.
To rotate the camera around the xylophone in the sample application, the rotation transformation is used, although technically, it is the xylophone itself that is moving when the mouse rotates the camera.
Example 2-2 shows the code for the rotation transformation.
Example 2-2 Rotation
class Cam extends Group { Translate t = new Translate(); Translate p = new Translate(); Translate ip = new Translate(); Rotate rx = new Rotate(); { rx.setAxis(Rotate.X_AXIS); } Rotate ry = new Rotate(); { ry.setAxis(Rotate.Y_AXIS); } Rotate rz = new Rotate(); { rz.setAxis(Rotate.Z_AXIS); } Scale s = new Scale(); public Cam() { super(); getTransforms().addAll(t, p, rx, rz, ry, s, ip); } } ... scene.setOnMouseDragged(new EventHandler<MouseEvent>() { public void handle(MouseEvent me) { mouseOldX = mousePosX; mouseOldY = mousePosY; mousePosX = me.getX(); mousePosY = me.getY(); mouseDeltaX = mousePosX - mouseOldX; mouseDeltaY = mousePosY - mouseOldY; if (me.isAltDown() && me.isShiftDown() && me.isPrimaryButtonDown()) { cam.rz.setAngle(cam.rz.getAngle() - mouseDeltaX); } else if (me.isAltDown() && me.isPrimaryButtonDown()) { cam.ry.setAngle(cam.ry.getAngle() - mouseDeltaX); cam.rx.setAngle(cam.rx.getAngle() + mouseDeltaY); } else if (me.isAltDown() && me.isSecondaryButtonDown()) { double scale = cam.s.getX(); double newScale = scale + mouseDeltaX*0.01; cam.s.setX(newScale); cam.s.setY(newScale); cam.s.setZ(newScale); } else if (me.isAltDown() && me.isMiddleButtonDown()) { cam.t.setX(cam.t.getX() + mouseDeltaX); cam.t.setY(cam.t.getY() + mouseDeltaY); } } });
Note that the pivot point and the angle define the destination point the image is moved to. Carefully calculate values when specifying the pivot point. Otherwise, the image might appear where it is not intended to be. For more information, see the API documentation.
Scaling
The scaling transformation causes a node to either appear larger or smaller, depending on the scaling factor. Scaling changes the node so that the dimensions along its axes are multiplied by the scale factor. Similar to the rotation transformations, scaling transformations are applied at a pivot point. This pivot point is considered the point around which scaling occurs.
To scale, use the Scale
class and the scale
method of the Transform
class.
In the Xylophone application, you can scale the xylophone using the mouse while pressing Alt and the right mouse button. The scale transformation is used to see the scaling.
Example 2-3 shows the code for the scale transformation.
Shearing
A shearing transformation rotates one axis so that the x-axis and y-axis are no longer perpendicular. The coordinates of the node are shifted by the specified multipliers.
To shear, use the Shear
class or the shear
method of the Transform
class.
In the Xylophone application, you can shear the xylophone by dragging the mouse while holding Shift and pressing the left mouse button.
Example 2-4 shows the code snippet for the shear transformation.
Multiple Transformations
You can construct multiple transformations by specifying an ordered chain of transformations. For example, you can scale an object and then apply a shearing transformation to it, or you can translate an object and then scale it.
Example 2-5 shows multiple transformations applied to an object to create a xylophone bar.
Example 2-5 Multiple Transformations
Cube base1Cube = new Cube(1.0, new Color(0.2, 0.12, 0.1, 1.0), 1.0); base1Cube.setTranslateX(xStart + 135); base1Cube.setTranslateZ(yPos+20.0); base1Cube.setTranslateY(11.0); base1Cube.setScaleX(barWidth*11.5); base1Cube.setScaleZ(10.0); base1Cube.setScaleY(barDepth*2.0);