如何用两种颜色填充 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()YZ 相同),你应该注意到它的不同光照效果;那么接下来你要掌握的就是如何控制灯具的位置。而且,灯可以有颜色!这意味着如果你想看到很酷的东西,你甚至可以实现北极光效果。

要了解更多关于灯光、相机和效果的信息,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 功能。