JavaFX学习之Transform

   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());
		}
	}
}

你可能感兴趣的:(JavaFX,transform)