如何用两种颜色填充 JavaFX 球体
How to fill a JavaFX Sphere with two Colors
如何在 JavaFX 中填充具有线性渐变的 3D 球体,如 2d 圆圈?
我使用 JavaFX Scene Builder。
在 3D 形状上实现渐变效果的方法是应用光照 material 和光照位置。您不能简单地应用两种逐渐相互转化的颜色。我为您制作了一个小应用程序,展示了如何实现这一目标。
public class ShadedSphere extends Application {
public void start(Stage stage) {
StackPane layout = new StackPane();
layout.setPrefSize(300, 300);
Scene scene = new Scene(layout);
createScene(scene);
stage.setScene(scene);
stage.show();
}
private void createScene(Scene scene) {
PhongMaterial material = new PhongMaterial();
material.setDiffuseColor(Color.ORANGE);
material.setSpecularColor(Color.BLACK);
Sphere sphere = new Sphere(100);
sphere.setMaterial(material);
Pane root = (Pane) scene.getRoot();
root.getChildren().add(sphere);
}
public static void main(String[] args) {
launch(args);
}
}
这会给你这个:
如果你改变球体的位置(例如,使用 setTranslateX()
和 Y
和 Z
相同),你应该注意到它的不同光照效果;那么接下来你要掌握的就是如何控制灯具的位置。而且,灯可以有颜色!这意味着如果你想看到很酷的东西,你甚至可以实现北极光效果。
要了解更多关于灯光、相机和效果的信息,see this link.
正如@mohsenmadi 指出的那样,漫反射颜色不允许您使用一种颜色以外的其他颜色。
但是您可以通过将图像用作漫反射贴图来使球体具有不同的颜色。
根据您的第一张图片,我创建了这张纹理图片(名为 diffuse.jpg
,并放置在与 JavaFX class 相同的文件夹下):
您现在可以创建您的双色球体了:
@Override
public void start(Stage primaryStage) throws Exception {
// 3D
Sphere sphere = new Sphere(5);
PhongMaterial phongMaterial = new PhongMaterial();
phongMaterial.setDiffuseMap(new Image(getClass().getResource("diffuse.jpg").toExternalForm()));
sphere.setMaterial(phongMaterial);
...
}
所以你会看到这个:
请注意,您可能会对两极产生一些副作用。
您还可以查看 FXyz 项目,这是一个包含 JavaFX 3D 复杂形状和复杂纹理选项的库。
例如,您可以使用密度贴图创建您想要的相同效果,但无需提供纹理图像。
在 org/fxyz/shapes/primitives
下,您可以找到几个原语,例如 SegmentedSphereMesh
。
像球体一样,您可以创建一个给出分区数、裁剪分区(在本例中 x 和 y 为 0)、半径和中心的球体:
SegmentedSphereMesh sphere = new SegmentedSphereMesh(200,0,0,100,new Point3D(0f,0f,0f));
现在可以定义函数了:
Function<Point3D, Number> dens = p->p.y>0?1:0;
并应用它,颜色数量(在本例中为 2):
sphere.setTextureModeVertices3D(2,dens);
现在你将拥有:
现在你不会对两极产生副作用,你可以很容易地修改这个函数以适应其他情况。
请注意,您可以添加创建自己的调色板或使用 org/fxyz/utils/Palette
下的 HSB 功能。
如何在 JavaFX 中填充具有线性渐变的 3D 球体,如 2d 圆圈? 我使用 JavaFX Scene Builder。
在 3D 形状上实现渐变效果的方法是应用光照 material 和光照位置。您不能简单地应用两种逐渐相互转化的颜色。我为您制作了一个小应用程序,展示了如何实现这一目标。
public class ShadedSphere extends Application {
public void start(Stage stage) {
StackPane layout = new StackPane();
layout.setPrefSize(300, 300);
Scene scene = new Scene(layout);
createScene(scene);
stage.setScene(scene);
stage.show();
}
private void createScene(Scene scene) {
PhongMaterial material = new PhongMaterial();
material.setDiffuseColor(Color.ORANGE);
material.setSpecularColor(Color.BLACK);
Sphere sphere = new Sphere(100);
sphere.setMaterial(material);
Pane root = (Pane) scene.getRoot();
root.getChildren().add(sphere);
}
public static void main(String[] args) {
launch(args);
}
}
这会给你这个:
如果你改变球体的位置(例如,使用 setTranslateX()
和 Y
和 Z
相同),你应该注意到它的不同光照效果;那么接下来你要掌握的就是如何控制灯具的位置。而且,灯可以有颜色!这意味着如果你想看到很酷的东西,你甚至可以实现北极光效果。
要了解更多关于灯光、相机和效果的信息,see this link.
正如@mohsenmadi 指出的那样,漫反射颜色不允许您使用一种颜色以外的其他颜色。
但是您可以通过将图像用作漫反射贴图来使球体具有不同的颜色。
根据您的第一张图片,我创建了这张纹理图片(名为 diffuse.jpg
,并放置在与 JavaFX class 相同的文件夹下):
您现在可以创建您的双色球体了:
@Override
public void start(Stage primaryStage) throws Exception {
// 3D
Sphere sphere = new Sphere(5);
PhongMaterial phongMaterial = new PhongMaterial();
phongMaterial.setDiffuseMap(new Image(getClass().getResource("diffuse.jpg").toExternalForm()));
sphere.setMaterial(phongMaterial);
...
}
所以你会看到这个:
请注意,您可能会对两极产生一些副作用。
您还可以查看 FXyz 项目,这是一个包含 JavaFX 3D 复杂形状和复杂纹理选项的库。
例如,您可以使用密度贴图创建您想要的相同效果,但无需提供纹理图像。
在 org/fxyz/shapes/primitives
下,您可以找到几个原语,例如 SegmentedSphereMesh
。
像球体一样,您可以创建一个给出分区数、裁剪分区(在本例中 x 和 y 为 0)、半径和中心的球体:
SegmentedSphereMesh sphere = new SegmentedSphereMesh(200,0,0,100,new Point3D(0f,0f,0f));
现在可以定义函数了:
Function<Point3D, Number> dens = p->p.y>0?1:0;
并应用它,颜色数量(在本例中为 2):
sphere.setTextureModeVertices3D(2,dens);
现在你将拥有:
现在你不会对两极产生副作用,你可以很容易地修改这个函数以适应其他情况。
请注意,您可以添加创建自己的调色板或使用 org/fxyz/utils/Palette
下的 HSB 功能。