3D 对象的属性
JavaFX - Cull Face 属性
JavaFX 还为 3D 对象提供了各种属性。这些属性的范围包括确定形状的材料:内部和外部、渲染 3D 对象几何图形和剔除 3D 形状的面。
提供所有这些属性是为了即兴创作 3D 对象的外观和感觉;并检查适合应用程序的内容并应用它们。
Cull Face 属性
通常,剔除是删除形状方向不正确的部分(在视图区域中不可见)。
Cull Face 属性的类型为 CullFace,它表示 3D 形状的 Cull Face。 您可以使用 setCullFace() 方法设置形状的 Cull Face,如下所示
box.setCullFace(CullFace.NONE);
形状的描边类型可以是
默认情况下,3 维形状的剔除面为 Back。
例1
以下程序是一个示例,演示了球体的各种剔除面。将此代码保存在名为 SphereCullFace.java 的文件中
import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.shape.CullFace;
import javafx.stage.Stage;
import javafx.scene.shape.Sphere;
public class SphereCullFace extends Application {
@Override
public void start(Stage stage) {
//Drawing Sphere1
Sphere sphere1 = new Sphere();
//Setting the radius of the Sphere
sphere1.setRadius(50.0);
//Setting the position of the sphere
sphere1.setTranslateX(100);
sphere1.setTranslateY(150);
//setting the cull face of the sphere to front
sphere1.setCullFace(CullFace.FRONT);
//Drawing Sphere2
Sphere sphere2 = new Sphere();
//Setting the radius of the Sphere
sphere2.setRadius(50.0);
//Setting the position of the sphere
sphere2.setTranslateX(300);
sphere2.setTranslateY(150);
//Setting the cull face of the sphere to back
sphere2.setCullFace(CullFace.BACK);
//Creating a Group object
Group root = new Group(sphere1, sphere2);
//Creating a scene object
Scene scene = new Scene(root, 600, 300);
//Setting title to the Stage
stage.setTitle("Drawing a Sphere");
//Adding scene to the stage
stage.setScene(scene);
//Displaying the contents of the stage
stage.show();
}
public static void main(String args[]){
launch(args);
}
}
例2
以下程序是一个示例,它演示了何时不使用 NONE 属性对框应用剔除面属性。将此代码保存在名为 BoxCullFace.java 的文件中
import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.shape.CullFace;
import javafx.stage.Stage;
import javafx.scene.shape.Box;
public class BoxCullFace extends Application {
@Override
public void start(Stage stage) {
//Drawing Box1
Box box1 = new Box();
//Setting the dimensions of the Box
box1.setWidth(100.0);
box1.setHeight(100.0);
box1.setDepth(100.0);
//Setting the position of the box
box1.setTranslateX(100);
box1.setTranslateY(150);
box1.setTranslateZ(0);
//setting the cull face of the box to NONE
box1.setCullFace(CullFace.NONE);
//Creating a Group object
Group root = new Group(box1);
//Creating a scene object
Scene scene = new Scene(root, 600, 300);
//Setting title to the Stage
stage.setTitle("Drawing a Box");
//Adding scene to the stage
stage.setScene(scene);
//Displaying the contents of the stage
stage.show();
}
public static void main(String args[]){
launch(args);
}
}
JavaFX -“绘制模式”属性
可以使用 Shape3D 类在 JavaFX 应用程序中绘制 3D 形状。此类允许您构建三种类型的 3D 形状:长方体、圆柱体、球体作为其直接子类。
但是,根据尝试创建的 JavaFX 应用程序的性质,还可以使用 Shape3D 类提供的属性来增强 3D 形状的外观。有三个这样的属性可以应用于 JavaFX 应用程序的 3D 形状。它们列出如下
Drawing Modes 属性
Drawing Modes 是属于 DrawMode 枚举类型的属性,它表示用于绘制当前 3D 形状的绘制模式的类型。在 JavaFX 中,您可以选择两种绘制模式来绘制 3D 形状,它们是
默认情况下,3Dimensional 形状的绘制模式为 fill。但您仍然可以使用 setDrawMode() 方法选择绘制模式来绘制 3D 形状,如下所示
box.setDrawMode(DrawMode.FILL);
例1
以下程序是演示 3D 框上的 LINE 绘制模式的示例。将此代码保存在名为 BoxDrawModeLine.java 的文件中
import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.shape.Box;
import javafx.scene.shape.DrawMode;
import javafx.stage.Stage;
public class BoxDrawModeLine extends Application {
@Override
public void start(Stage stage) {
//Drawing a Box
Box box1 = new Box();
//Setting the properties of the Box
box1.setWidth(100.0);
box1.setHeight(100.0);
box1.setDepth(100.0);
//Setting the position of the box
box1.setTranslateX(200);
box1.setTranslateY(150);
box1.setTranslateZ(0);
//Setting the drawing mode of the box
box1.setDrawMode(DrawMode.LINE);
//Creating a Group object
Group root = new Group(box1);
//Creating a scene object
Scene scene = new Scene(root, 300, 300);
//Setting title to the Stage
stage.setTitle("Drawing a Box");
//Adding scene to the stage
stage.setScene(scene);
//Displaying the contents of the stage
stage.show();
}
public static void main(String args[]){
launch(args);
}
}
例2
现在让我们看看另一个示例,该示例显示了 FILL 绘制模式在 3D 形状上的用法。为了正确显示这些模式的差异,我们将再次在 3D 框上应用此模式。将此代码保存在名为 BoxDrawModeFill.java 的文件中
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 BoxDrawModeFill extends Application {
@Override
public void start(Stage stage) {
//Drawing a Box
Box box1 = new Box();
//Setting the properties of the Box
box1.setWidth(100.0);
box1.setHeight(100.0);
box1.setDepth(100.0);
//Setting the position of the box
box1.setTranslateX(200);
box1.setTranslateY(150);
box1.setTranslateZ(0);
//Setting the drawing mode of the box
box1.setDrawMode(DrawMode.FILL);
//Creating a Group object
Group root = new Group(box1);
//Creating a scene object
Scene scene = new Scene(root, 600, 300);
//Setting camera
PerspectiveCamera camera = new PerspectiveCamera(false);
camera.setTranslateX(100);
camera.setTranslateY(50);
camera.setTranslateZ(0);
scene.setCamera(camera);
//Setting title to the Stage
stage.setTitle("Drawing a Box");
//Adding scene to the stage
stage.setScene(scene);
//Displaying the contents of the stage
stage.show();
}
public static void main(String args[]){
launch(args);
}
}
JavaFX - Material 属性
到目前为止,当我们解决 JavaFX 形状对象的属性时,它始终只包括形状填充的颜色和形状描边的类型。但是,JavaFX 还允许您为 3D 形状分配材质类型。
3D 对象的材质只不过是用于创建 3D 对象的纹理类型。例如,现实世界中的盒子可以由不同的材料制成;就像纸板、金属、木头或任何其他固体一样。所有这些都形成相同的形状,但使用不同的材料。同样,JavaFX 允许选择用于创建 3D 对象的材质类型。
材料属性
Material 属性的类型为 Material,用于选择 3D 形状的材料表面。您可以使用 setMaterial() 方法设置 3D 形状的材料,如下所示
cylinder.setMaterial(material);
如上所述,对于此方法,需要传递 Material 类型的对象。包 javafx.scene.paint 的 PhongMaterial 类是此类的子类,它提供 7 个表示 Phong 着色材质的属性。可以使用这些属性的 setter 方法将所有这些类型的材料应用于 3D 形状的表面。
以下是 JavaFX 中可用的材料类型
默认情况下,3-Dimensional 形状的材质是具有浅灰色漫反射色的 PhongMaterial。
例
下面是一个在圆柱体上显示各种材质的示例。将此代码保存在名为 CylinderMaterials.java 的文件中
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.stage.Stage;
public class CylinderMaterials extends Application {
@Override
public void start(Stage stage) {
//Drawing Cylinder1
Cylinder cylinder1 = new Cylinder();
//Setting the properties of the Cylinder
cylinder1.setHeight(130.0f);
cylinder1.setRadius(30.0f);
//Setting the position of the Cylinder
cylinder1.setTranslateX(100);
cylinder1.setTranslateY(75);
//Preparing the phong material of type bump map
PhongMaterial material1 = new PhongMaterial();
material1.setBumpMap(new Image
("http://www.tutorialspoint.com/images/tplogo.gif"));
//Setting the bump map material to Cylinder1
cylinder1.setMaterial(material1);
//Drawing Cylinder2
Cylinder cylinder2 = new Cylinder();
//Setting the properties of the Cylinder
cylinder2.setHeight(130.0f);
cylinder2.setRadius(30.0f);
//Setting the position of the Cylinder
cylinder2.setTranslateX(200);
cylinder2.setTranslateY(75);
//Preparing the phong material of type diffuse map
PhongMaterial material2 = new PhongMaterial();
material2.setDiffuseMap(new Image
("http://www.tutorialspoint.com/images/tp-logo.gif"));
//Setting the diffuse map material to Cylinder2
cylinder2.setMaterial(material2);
//Drawing Cylinder3
Cylinder cylinder3 = new Cylinder();
//Setting the properties of the Cylinder
cylinder3.setHeight(130.0f);
cylinder3.setRadius(30.0f);
//Setting the position of the Cylinder
cylinder3.setTranslateX(300);
cylinder3.setTranslateY(75);
//Preparing the phong material of type Self Illumination Map
PhongMaterial material3 = new PhongMaterial();
material3.setSelfIlluminationMap(new Image
("http://www.tutorialspoint.com/images/tp-logo.gif"));
//Setting the Self Illumination Map material to Cylinder3
cylinder3.setMaterial(material3);
//Drawing Cylinder4
Cylinder cylinder4 = new Cylinder();
//Setting the properties of the Cylinder
cylinder4.setHeight(130.0f);
cylinder4.setRadius(30.0f);
//Setting the position of the Cylinder
cylinder4.setTranslateX(400);
cylinder4.setTranslateY(75);
//Preparing the phong material of type Specular Map
PhongMaterial material4 = new PhongMaterial();
material4.setSpecularMap(new Image
("http://www.tutorialspoint.com/images/tp-logo.gif"));
//Setting the Specular Map material to Cylinder4
cylinder4.setMaterial(material4);
//Drawing Cylinder5
Cylinder cylinder5 = new Cylinder();
//Setting the properties of the Cylinder
cylinder5.setHeight(130.0f);
cylinder5.setRadius(30.0f);
//Setting the position of the Cylinder
cylinder5.setTranslateX(100);
cylinder5.setTranslateY(300);
//Preparing the phong material of type diffuse color
PhongMaterial material5 = new PhongMaterial();
material5.setDiffuseColor(Color.BLANCHEDALMOND);
//Setting the diffuse color material to Cylinder5
cylinder5.setMaterial(material5);
//Drawing Cylinder6
Cylinder cylinder6 = new Cylinder();
//Setting the properties of the Cylinder
cylinder6.setHeight(130.0f);
cylinder6.setRadius(30.0f);
//Setting the position of the Cylinder
cylinder6.setTranslateX(200);
cylinder6.setTranslateY(300);
//Preparing the phong material of type specular color
PhongMaterial material6 = new PhongMaterial();
//setting the specular color map to the material
material6.setSpecularColor(Color.BLANCHEDALMOND);
//Setting the specular color material to Cylinder6
cylinder6.setMaterial(material6);
//Drawing Cylinder7
Cylinder cylinder7 = new Cylinder();
//Setting the properties of the Cylinder
cylinder7.setHeight(130.0f);
cylinder7.setRadius(30.0f);
//Setting the position of the Cylinder
cylinder7.setTranslateX(300);
cylinder7.setTranslateY(300);
//Preparing the phong material of type Specular Power
PhongMaterial material7 = new PhongMaterial();
material7.setSpecularPower(0.1);
//Setting the Specular Power material to the Cylinder
cylinder7.setMaterial(material7);
//Creating a Group object
Group root = new Group(cylinder1 ,cylinder2, cylinder3,
cylinder4, cylinder5, cylinder6, cylinder7);
//Creating a scene object
Scene scene = new Scene(root, 600, 400);
//Setting camera
PerspectiveCamera camera = new PerspectiveCamera(false);
camera.setTranslateX(0);
camera.setTranslateY(0);
camera.setTranslateZ(-10);
scene.setCamera(camera);
//Setting title to the Stage
stage.setTitle("Drawing a cylinder");
//Adding scene to the stage
stage.setScene(scene);
//Displaying the contents of the stage
stage.show();
}
public static void main(String args[]){
launch(args);
}
}