你对一件事是对的PhongMaterial
需要一个Color
作为漫反射颜色,这不允许Gradient
。为此,它应该接受Paint
, 但事实并非如此。
所以我们必须寻找不同的替代方案。
漫反射贴图
如果你检查PhongMaterial
,您可以设置漫反射贴图带有图像。这意味着您可以使用具有某种渐变的现有图像并将其应用到球体。
像这样的东西:
Sphere sphere = new Sphere(100);
PhongMaterial material = new PhongMaterial();
material.setDiffuseMap(new Image("http://westciv.com/images/wdblogs/radialgradients/simpleclorstops.png"));
sphere.setMaterial(material);
将产生以下结果:
动态漫反射贴图
显然,这具有依赖静态图像的缺点。如果你想动态修改它怎么办?
您可以做到这一点,如果您生成径向渐变,将其渲染在辅助场景上并拍摄它的快照。该快照返回一个WritableImage
您可以直接用作漫反射贴图。
像这样的东西:
Scene aux = new Scene(new StackPane(), 100, 100,
new RadialGradient(0, 0, 0.5, 0.5, 1, true, CycleMethod.REPEAT,
new Stop(0, Color.GREEN), new Stop(0.4, Color.YELLOW),
new Stop(0.6, Color.BLUE), new Stop(0.7, Color.RED)));
WritableImage snapshot = aux.snapshot(null);
Sphere sphere = new Sphere(100);
PhongMaterial material = new PhongMaterial();
material.setDiffuseMap(snapshot);
sphere.setMaterial(material);
您现在将拥有:
密度图
还有另一种选择是使用数学函数生成密度图,并且颜色将通过该函数的映射给出。
为此,您不能使用内置的Sphere
,但你必须创建自己的TriangleMesh
并使用纹理坐标,或者您可以简单地使用 FXyz,一个开源 JavaFX 3Dlibrary具有许多不同的基元和纹理选项。
对于这种情况,您可以从 Maven Central 获取该库(org.fxyz3d:fxyz3d:0.3.0
), 用一个SegmentedSphereMesh
控制,然后选择纹理模式`Vertices3D:
SegmentedSphereMesh sphere = new SegmentedSphereMesh(100);
sphere.setTextureModeVertices3D(1530, p -> p.z);
请注意,本例中的函数仅基于z
坐标,但显然您可以根据需要对其进行修改。
检查库(有一个采样器),以探索其他选项。