`

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

分享到:
评论

相关推荐

    moon3d:JavaFX的3D Moon

    总的来说,"moon3d"项目是一个绝佳的学习资源,它通过实践教你如何使用JavaFX的3D特性构建一个具有真实感的空间场景。通过这个教程,你可以掌握JavaFX 3D编程的基础,为创建更复杂的3D应用打下坚实的基础。

    CollabMode:基于JavaFX的文本编辑器,可以使许多贡献者更轻松地进行协作

    CollabMode是一款基于JavaFX开发的文本编辑器,它的核心特性是...通过研究和学习CollabMode的源代码(假设CollabMode-main是源码包),开发者可以深入了解如何在JavaFX平台上实现类似的功能,进一步提升自己的技能。

    java3D学习资料

    10. **Java 3D与其他Java库的集成**:如Swing或JavaFX,可以将3D元素与2D用户界面相结合。 通过这两个资源,开发者不仅可以学习到Java 3D的基本使用,还能逐步深入到高级主题,为开发高质量的3D应用打下坚实基础。...

    基于Bootstrap的CSS3菜单.zip

    例如,它可以通过`transform`属性实现元素的3D转换,创建出具有深度感的视觉效果。`transition`属性则可以用来定义当元素从一种状态平滑过渡到另一种状态时的动画效果,比如菜单项在鼠标悬停时的展开和收起。 菜单...

    鼠标悬停,图片放大

    这里可以使用CSS3的`transform`属性来改变图片大小,或者使用额外的元素来展示放大的图片。 2. JavaFX实现(适用于桌面应用): 如果是在JavaFX环境中,我们可以利用`ImageView`类的交互性来实现。为`ImageView`...

    java 小例子

    通过`javax.media.j3d`包,开发者可以创建节点树结构来表示3D对象,使用`BranchGroup`、`SceneGraph`、`Transform3D`等类来构建和操作三维空间。例如,`Appearance`类用于定义物体的外观,包括材质、纹理和光照效果...

    chm文档jquery,css3...

    接下来是CSS3,它是CSS(层叠样式表)的最新版本,引入了许多新的特性和功能,如选择器的扩展、边框和背景的复杂效果、多列布局、转换(transform)、过渡(transition)和动画(animation)。CSS2.0_API_2002.chm和...

    GraphicEditor

    此外,JavaFX的Paint类允许我们设置图形的颜色和填充,而Transform类则帮助我们实现变换操作,如translate()、rotate()和scale()。 为了增强用户体验,GraphicEditor还引入了撤销/重做功能,这通常依赖于Memento...

    7.2GUI设计代码

    在IT领域,GUI设计通常涉及各种库或框架,如Java的Swing和JavaFX,Python的Tkinter,或是Unity中的NGUI。 NGUI,全称Next-Generation User Interface,是一个适用于Unity 3D的游戏用户界面系统。Unity是一款强大的...

    Gr3d1m.rar_java体_java正方体

    虽然标题中的"体"暗示了3D图形,但在Java中,通常使用Java 3D库或JavaFX 3D来处理3D图形,而Java 2D主要处理2D。不过,Java 2D也可以通过投影和变换模拟3D效果。 2. **Java 3D**:Java 3D是一个开源库,它扩展了...

    java3d坦克源码

    在实际开发中,开发者通常会使用Java 3D提供的如Transform3D、SceneGraphObject、Appearance等类,结合Java Swing或JavaFX来创建用户界面,以及使用AudioClip处理音频。 总之,Java3D坦克源码是一个实践性的项目,...

    用Java 3D实现三维演示系统

    `SimpleUniverse`适用于桌面应用,而`Canvas3D`适合嵌入到Java Swing或JavaFX组件中。 总结,"用Java 3D实现三维演示系统"是一个涉及Java 3D基础、场景图构建、对象变换、光照设置以及交互和动画实现的综合项目。...

    程序开发特效、倒影效果

    2. **Java**:JavaFX提供了一种创建倒影的方法,通过`DropShadow`和`Reflection`效果类可以轻松实现。在Swing中,可以使用自定义绘图或者第三方库如Java2D-Utils来实现。 3. **C#** & **WPF**:Windows ...

    dct-image-compression.rar_DCT compression java_dct java

    标题 "dct-image-compression.rar" 提到的是一个与离散余弦变换(Discrete Cosine Transform, DCT)相关的图像压缩项目,采用Java语言实现。这个压缩包中包含了使用DCT进行图像压缩的主要程序,以及一个名为"DCT彩色...

    java版带GUI的快速傅里叶变换代码

    快速傅里叶变换(Fast Fourier Transform,简称FFT)是一种高效的计算离散傅里叶变换(Discrete Fourier Transform,DFT)及其逆变换的算法。在Java编程中,实现带图形用户界面(GUI)的FFT应用可以为用户提供直观的...

    Java开发文档

    10. **XML处理**:Java API还包含了处理XML的类库,如`javax.xml.parsers`用于解析XML,`javax.xml.transform`用于转换XML,`javax.xml.bind`支持对象到XML的绑定。 Java API文档是开发者学习和使用Java技术的关键...

    Java课设-音乐播放器(示波器/频谱)

    【Java音乐播放器项目概述】 本项目是一个基于Java...总的来说,这个Java音乐播放器项目涵盖了GUI设计、音频处理、实时图形渲染等多个技术领域,对于学习Java编程和多媒体应用开发的学员来说,是一个很好的实践项目。

    java生成html源代码

    transformer.transform(new DOMSource(doc), new StreamResult(writer)); String output = writer.getBuffer().toString(); ``` 5. **使用JavaFX或Swing**:如果你的应用程序需要图形用户界面(GUI),JavaFX和...

    java3d api

    这个API是建立在Java Foundation Classes (JFC) 和Swing之上的,允许开发者利用Java语言的特性来构建具有深度、透视和真实感的3D图形。Java3D API的核心目标是简化3D图形编程,使得开发者无需深入理解底层的图形硬件...

    java3D的jar包

    9. **整合其他Java技术**:Java3D可以很好地与其他Java技术如Swing、JavaFX等集成,构建出功能丰富的3D应用程序。 10. **社区支持**:虽然Java3D官方支持已停止,但开源社区仍有一些项目,如Java3D-Fork,持续维护...

Global site tag (gtag.js) - Google Analytics