本文概述
- 阴暗面
- 3D对象材质
- 绘图模式
- JavaFX相机
- JavaFX子场景
阴暗面 剔除可以简单地定义为删除3D对象在视图区域中不可见的部分的过程。在JavaFX中, 3D形状包含CullFace类型的属性。通过使用以下在3D形状类对象上调用的实例方法, 可以将此属性设置为适当的值。 。
setCullFace(CullFace值)
在CullFace类中定义了三种笔触类型:
- 无:不执行剔除
- 前:所有面向前的多边形都会被剔除
- 背面:所有背面多边形都会被剔除
在下面的示例中, 我们创建了三个球体, 并为每个球体设置了三个剔除面。
package application;
import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.SubScene;
import javafx.scene.shape.CullFace;
import javafx.scene.shape.Sphere;
import javafx.stage.Stage;
public class SphereTest extends Application{ @Override public void start(Stage primaryStage) throws Exception { // TODO Auto-generated method stub //Creating the first sphere Sphere sphere = new Sphere();
sphere.setRadius(50);
sphere.setTranslateX(100);
sphere.setTranslateY(200);
//Setting cullface for the sphere 1 sphere.setCullFace(CullFace.BACK);
//creating second sphere Sphere sphere1 = new Sphere();
sphere1.setRadius(50);
sphere1.setTranslateX(250);
sphere1.setTranslateY(200);
//setting CullFace for the sphere 2 sphere1.setCullFace(CullFace.FRONT);
//creating third sphere Sphere sphere2 = new Sphere();
sphere2.setRadius(50);
sphere2.setTranslateX(400);
sphere2.setTranslateY(200);
//setting CullFace for the sphere 3 sphere2.setCullFace(CullFace.NONE);
//Configuring Group and Scene Group root = new Group();
root.getChildren().addAll(sphere, sphere1, sphere2);
Scene scene = new Scene(root, 500, 400);
primaryStage.setScene(scene);
primaryStage.setTitle("CullFaces");
primaryStage.show();
} publicstaticvoid main(String[] args) {launch(args);
}}
文章图片
3D对象材质 JavaFX提供了可以应用于3D形状表面的各种材料。包javafx.scene.paint的Material类提供了用于处理3D形状的材料的所有类。 PhongMaterial类是Material类的子类。我们只需要实例化此类即可创建所需的材料。
此类提供了各种类型的材料作为此类的属性, 可以使用setter方法将其设置为特定值。但是, 可以使用以下方法将材料应用于形状。
shape.setMaterial(<
material-type>
)
物产
下表描述了类javafx.scene.paint.PhongMaterial的属性及其设置方法。
属性 | 描述 | 设置方法 |
---|---|---|
bumpMap | 此属性的类型为Image。这表示材料的凹凸贴图。 | setBumpMap(Image URL) |
diffuseColor | 这是一种颜色类型属性。这代表了材料的漫反射颜色。 | setDiffuseColor(Color color) |
diffuseMap | 这是图像类型属性??。这表示材质的DiffuseMap。 | setDiffuseMap(Image URL) |
selfIlluminationMap | 这是图像类型属性??。这代表了材料的自发光图 | setSelfIlluminationMap(Image URL) |
specularColor | 这是一种颜色类型属性。这代表了材料的镜面颜色。 | setSpecularColor(Color value) |
specularPower | 这是一个双精度类型的属性。这代表了材质的镜面反射能力。 | setSpecularPower(Double value) |
package application;
import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.PerspectiveCamera;
import javafx.scene.Scene;
import javafx.scene.image.Image;
import javafx.scene.paint.Color;
import javafx.scene.paint.PhongMaterial;
import javafx.scene.shape.Cylinder;
import javafx.scene.shape.Sphere;
import javafx.stage.Stage;
public class MaterialExample extends Application{@Overridepublicvoid start(Stage primaryStage) throws Exception { // TODO Auto-generated method stub //Creating Cylinder 1 Cylinder cyn = new Cylinder();
cyn.setRadius(70);
cyn.setHeight(200);
cyn.setTranslateX(180);
cyn.setTranslateY(150);
//Creating cylinder 2 Cylinder cyn1=new Cylinder();
cyn1.setRadius(70);
cyn1.setHeight(200);
cyn1.setTranslateX(380);
cyn1.setTranslateY(150);
//Creating cylinder 3 Cylinder cyn2=new Cylinder();
cyn2.setRadius(70);
cyn2.setHeight(200);
cyn2.setTranslateX(580);
cyn2.setTranslateY(150);
//Creating Sphere Sphere s=new Sphere();
s.setRadius(70);
s.setTranslateX(780);
s.setTranslateY(150);
//Setting Material 1 Image img1 = new Image("https://www.srcmini.com/kotlin/images/kotlin- tutorial.png");
PhongMaterial mat = new PhongMaterial();
mat.setDiffuseMap(img1);
mat.setDiffuseColor(Color.WHITE);
//Setting Material 2 PhongMaterial mat2 = new PhongMaterial();
mat2.setSelfIlluminationMap(img1);
//Setting Material 3 PhongMaterial mat3 = new PhongMaterial();
mat3.setSpecularMap(img1);
//Setting Material for sphere PhongMaterial mat4 = new PhongMaterial();
mat4.setDiffuseColor(Color.BLUE);
// Applying Material tomat4.setBumpMap(img1);
the shape cyn.setMaterial(mat);
cyn1.setMaterial(mat2);
cyn2.setMaterial(mat3);
s.setMaterial(mat4);
//Setting Cameramat4.setBumpMap(img1);
PerspectiveCamera camera = new PerspectiveCamera();
camera.setTranslateX(20);
camera.setTranslateY(10);
camera.setTranslateZ(50);
//setting group and stage Group root = new Group();
root.getChildren().addAll(cyn, cyn1, cyn2, s);
Scene scene = new Scene(root, 900, 300, Color.WHITE);
scene.setCamera(camera);
primaryStage.setScene(scene);
primaryStage.setTitle("Material Example");
primaryStage.show();
}publicstaticvoid main(String[] args) { launch(args);
}}
文章图片
绘图模式 JavaFX提供了各种绘制模式来绘制3D形状。此属性的类型为DrawMode。该类中定义了以下DrawMode类型。
- 填充:此模式绘制并填充3D形状。它由DrawMode.Fill表示
- 线条:此模式仅使用线条绘制3D形状。它由DrawMode.Line表示
Shape3D.setDrawMode(<
DrawMode value>
)
例
在下面的示例中, 我们创建了两个框, 一个是使用DrawMode Fill, 另一个是使用DrawMode Line。
package application;
import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.PerspectiveCamera;
import javafx.scene.Scene;
import javafx.scene.shape.Box;
import javafx.scene.shape.DrawMode;
import javafx.stage.Stage;
public class DrawModeExample extends Application{@Overridepublicvoid start(Stage primaryStage) throws Exception { // TODO Auto-generated method stub //Creating Boxes Box box1 = new Box();
Box box2 = new Box();
//Setting properties for second box box2.setTranslateX(450);
box2.setTranslateY(300);
box2.setTranslateZ(100);
box2.setHeight(150);
box2.setWidth(50);
box2.setDepth(400);
//Setting properties for first box box1.setHeight(100);
box1.setWidth(100);
box1.setDepth(400);
box1.setTranslateX(200);
box1.setTranslateY(200);
box1.setTranslateZ(200);
//Setting DrawModes for the boxes box1.setDrawMode(DrawMode.FILL);
box2.setDrawMode(DrawMode.LINE);
//Setting the perspective camera PerspectiveCamera camera = new PerspectiveCamera();
camera.setTranslateX(100);
camera.setTranslateY(100);
camera.setTranslateZ(50);
//Configuring Group, Scene and Stage Group root = new Group();
root.getChildren().addAll(box1, box2);
Scene scene = new Scene(root, 450, 350);
scene.setCamera(camera);
primaryStage.setScene(scene);
primaryStage.setTitle("Setting DrawMode");
primaryStage.show();
} publicstaticvoid main(String[] args) {launch(args);
}}
文章图片
JavaFX相机 在JavaFX中, 相机被视为可以在3D布局中移动并相应地更改“场景”视图的对象。类javafx.scene.Camera表示相机。但是, 它与2D空间不同, 在2D空间中, 我们不需要在屏幕上移动相机。
在JavaFX中, 相机坐标系的X坐标指向右侧, Y坐标指向下方, Z坐标指向远离查看者或进入屏幕的位置。
为了创建相机并将其添加到场景中, 我们必须使用以下代码行。
【3D对象属性】//创建javafx.scene.Camera的实例
Cameracamera = new Camera();
//将相机沿正确的X方向设置为50
camera.setTranslateX(50);
camera.setTranslateX(50);
camera.setTranslateY(100);
//将相机设置为20进入屏幕
camera.setTranslateZ(20);
//将相机添加到场景中
scene.setCamera(camera);
JavaFX子场景 子场景节点可以定义为一个容器, 可以容纳场景中需要为其指定摄像机角度的某些节点。用于场景分离。如果需要为场景的一部分设置不同的摄像机, 则可以使用子场景节点。可以在以下情况之一中使用Subscene。
- 如果我们需要用于场景的UI控件的静态相机(覆盖)。
- 3D对象为Y向上, 而2D UI为Y向下。
- 背景底纹
SubScene <
reference>
= new SubScene(Parent root, double width, double height, boolean depthbuffer, boolean antiAliasing)
推荐阅读
- JavaFX弧
- JavaFX 3D形状
- JavaFX动画
- 创建第一个JavaFX应用程序
- 什么是网络服务
- JavaFX 2D形状
- Java Web服务组件
- Win10系统英文输入法打开自动纠错技巧的办法
- win10系统更改默认输入法的图文详细教程