翻译自 Transformation Types and Examples
本文档描述了特定的转换并提供了代码示例。
平移变换沿着相对于其初始位置的一个轴将节点从一个位置移动到另一个位置。木琴条的初始位置由x,y和z坐标定义。在实施例2-1中,初始位置值由指定的xStart
,yPos
和zPos
变量。添加一些其他变量以简化应用不同变换时的计算。木琴的每个杆都基于其中一个基杆。然后,该示例沿三个轴平移不同移位的基条,以在空间中正确定位它们。
示例2-1显示了具有转换转换的示例应用程序的代码片段。
例2-1转换
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);
旋转变换使节点围绕场景的指定枢轴点移动。您可以使用类的rotate
方法Transform
来执行旋转。
要在示例应用程序中围绕木琴旋转相机,使用旋转变换,但从技术上讲,当鼠标旋转相机时,木琴本身就会移动。
例2-2显示了旋转变换的代码。
例2-2旋转
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() {
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);
}
}
});
请注意,轴心点和角度定义了图像移动到的目标点。指定轴心点时要仔细计算值。否则,图像可能会出现在不希望出现的位置。有关更多信息,请参阅API文档。
缩放变换使节点看起来更大或更小,具体取决于缩放因子。缩放会更改节点,以便沿其轴的尺寸乘以比例因子。与旋转变换类似,缩放变换应用于枢轴点。该枢轴点被认为是围绕其发生缩放的点。
要缩放,请使用Scale
类的类和scale
方法Transform
。
在Xylophone应用程序中,您可以在按Alt和鼠标右键的同时使用鼠标缩放木琴。比例变换用于查看缩放。
例2-3显示了比例转换的代码。
例2-3缩放
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);
}
...
剪切变换使一个轴旋转,使得x轴和y轴不再垂直。节点的坐标移动指定的乘数。
要剪切,请使用Shear
类的类或shear
方法Transform
。
在Xylophone应用程序中,您可以通过拖动鼠标来剪切木琴,同时按住Shift并按下鼠标左键。
图2-1剪切变换
例2-4显示了剪切变换的代码片段。
实施例2-4剪切
else if (me.isShiftDown() && me.isPrimaryButtonDown()) {
double yShear = shear.getY();
shear.setY(yShear + mouseDeltaY/1000.0);
double xShear = shear.getX();
shear.setX(xShear + mouseDeltaX/1000.0);
}
您可以通过指定有序的转换链来构造多个转换。例如,您可以缩放对象然后对其应用剪切变换,或者您可以翻译对象然后缩放它。
示例2-5显示了应用于对象以创建木琴栏的多个转换。
例2-5多次转换
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);
源代码
Xylophone.java
NetBeans项目
transformations.zip