如何使用两种颜色填充JavaFX Sphere

如何使用像2d Circle一样的线性渐变来填充JavaFX 3D球体? 我使用JavaFX Scene Builder。

在此处输入图像描述

在此处输入图像描述

正如@mohsenmadi指出的那样,漫reflection颜色不允许您使用除单一颜色之外的颜色。

但是,通过将图像用作漫reflection贴图,可以在球体上使用不同的颜色。

根据你的第一张图片,我创建了这个纹理图像(称为diffuse.jpg ,并放在与JavaFX类相同的文件夹下):

漫反射图像

你现在可以创建你的双色球体:

 @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

就像一个球体,你可以创建一个给出分割数,作物分割(在这种情况下为0和y),半径和中心:

 SegmentedSphereMesh sphere = new SegmentedSphereMesh(200,0,0,100,new Point3D(0f,0f,0f)); 

现在您可以定义函数:

 Function dens = p->py>0?1:0; 

并应用它,颜色数量(在这种情况下为2):

 sphere.setTextureModeVertices3D(2,dens); 

现在你将拥有这个:

球体FXyz

现在你不会对杆子产生副作用,你可以轻松地将这个function修改为其他情况。

请注意,您可以添加创建自己的颜色调色板或使用org/fxyz/utils/Palette下的HSB函数进行播放。

在3D形状上实现类似梯度效果的方法是应用照明材料和照明位置。 你不能简单地应用逐渐相互转换的两种颜色。 我为你做了一个小应用程序,它展示了如何实现这一目标。

 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()YZ相同),你应该注意到它对光照的不同影响; 所以接下来要掌握的是如何控制照明灯具的位置。 此外,灯可以有颜色! 这意味着如果你想看到很酷的东西,你甚至可以实现北极光效果。

要了解有关照明,相机和效果的更多信息, 请参阅此链接。