Transform为Node提供仿射变换,如旋转,尺度变化,移动,修饰。通过node.getTransforms()得到一个list的transform,然后添加各种变化。 仿射变化实现了物体的3d效果。
Transform提供一些静态方法,创建Rotate,Scale,Shear,Translate。和坐标获得。
Affine 代表仿射变化。其方法主要是获取3x4矩形中的坐标
Rotate 旋转
属性:
angle 旋转角度
axis 轴线
pivotX ,pivotY ,pivotZ 轴心
构造方法:
Rotate(double angle, double pivotX, double pivotY) //角度,以那个点为旋转轴心
方法:
Scale 尺度变化(大小变化)
Shear 修饰
Text text = new Text("Using Shear for pseudo-italic font");
text.setX(20);
text.setY(50);
text.setFont(new Font(20));
text.getTransforms().add(new Shear(0.35, 0));
主要有4个属性决定该变化
x,y,pivotX,pivotY
其方法也是主要针对这四个属性的操作。
Translate 移动
用transform构建的3D物体,这个是网上摘抄下来的。
package animation;
import javafx.animation.Animation;
import javafx.animation.KeyFrame;
import javafx.animation.KeyValue;
import javafx.animation.Timeline;
import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.ParallelCamera;
import javafx.scene.PerspectiveCamera;
import javafx.scene.Scene;
import javafx.scene.paint.Color;
import javafx.scene.shape.RectangleBuilder;
import javafx.scene.transform.Rotate;
import javafx.stage.Stage;
import javafx.util.Duration;
public class Cube3D extends Application {
@Override
public void start(Stage stage) throws Exception {
stage.setTitle("Cube 3D");
//stage.initDepthBuffer(true);
Cube c = new Cube(50, Color.RED, 1);
c.rx.setAngle(45);
c.ry.setAngle(45);
Cube c2 = new Cube(50, Color.GREEN, 1);
c2.setTranslateX(100);
c2.rx.setAngle(45);
c2.ry.setAngle(45);
Cube c3 = new Cube(50, Color.ORANGE, 1);
c3.setTranslateX(-100);
c3.rx.setAngle(45);
c3.ry.setAngle(45);
Timeline animation = new Timeline();
animation.getKeyFrames().addAll(
new KeyFrame(Duration.ZERO, new KeyValue(c.ry.angleProperty(),
0d), new KeyValue(c2.rx.angleProperty(), 0d),
new KeyValue(c3.rz.angleProperty(), 0d)),
new KeyFrame(Duration.millis(1000), new KeyValue(c.ry
.angleProperty(), 360d), new KeyValue(c2.rx
.angleProperty(), 360d), new KeyValue(c3.rz
.angleProperty(), 360d)));
animation.setCycleCount(Animation.INDEFINITE); // create root group
Group root = new Group(c, c2, c3); // translate and rotate group so that
// origin is center and +Y is up
root.setTranslateX(400 / 2);
root.setTranslateY(150 / 2);
root.getTransforms().add(new Rotate(180, Rotate.X_AXIS)); // create
// scene
Scene scene = new Scene(root, 400, 150);
scene.setCamera(new ParallelCamera());
stage.setScene(scene);
stage.show();
animation.play();
}
public static void main(String[] args) {
launch(args);
}
public class Cube extends Group {
final Rotate rx = new Rotate(0, Rotate.X_AXIS);
final Rotate ry = new Rotate(0, Rotate.Y_AXIS);
final Rotate rz = new Rotate(0, Rotate.Z_AXIS);
public Cube(double size, Color color, double shade) {
getTransforms().addAll(rz, ry, rx);
getChildren().addAll(
RectangleBuilder
.create()
.width(size)
.height(size)
.fill(color.deriveColor(0.0, 1.0,
(1 - 0.5 * shade), 1.0))
.translateX(-0.5 * size).translateY(-0.5 * size)
.translateZ(0.5 * size).build(),
RectangleBuilder
.create()
.width(size)
.height(size)
.fill(color.deriveColor(0.0, 1.0,
(1 - 0.4 * shade), 1.0))
.translateX(-0.5 * size).translateY(0)
.rotationAxis(Rotate.X_AXIS).rotate(90).build(),
RectangleBuilder
.create()
.width(size)
.height(size)
.fill(color.deriveColor(0.0, 1.0,
(1 - 0.3 * shade), 1.0))
.translateX(-1 * size).translateY(-0.5 * size)
.rotationAxis(Rotate.Y_AXIS).rotate(90).build(),
RectangleBuilder
.create()
.width(size)
.height(size)
.fill(color.deriveColor(0.0, 1.0,
(1 - 0.2 * shade), 1.0)).translateX(0)
.translateY(-0.5 * size)
.rotationAxis(Rotate.Y_AXIS).rotate(90).build(),
RectangleBuilder
.create()
.width(size)
.height(size)
.fill(color.deriveColor(0.0, 1.0,
(1 - 0.1 * shade), 1.0))
.translateX(-0.5 * size).translateY(-1 * size)
.rotationAxis(Rotate.X_AXIS).rotate(90).build(),
RectangleBuilder
.create()
// top face
.width(size).height(size).fill(color)
.translateX(-0.5 * size).translateY(-0.5 * size)
.translateZ(-0.5 * size).build());
}
}
}