如何用像 2d 圆一样的线性渐变填充 JavaFX 3D Sphere?我使用 JavaFX 场景生成器。
2 回答
正如@mohsenmadi 指出的那样,漫反射颜色不允许您使用一种单一颜色。
但是您可以通过使用图像作为漫反射贴图在球体上使用不同的颜色。
根据您的第一个图像,我创建了这个纹理图像(称为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
.
像一个球体一样,您可以创建一个给出分割数、裁剪分割(在本例中为 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);
现在你将拥有这个:
现在您不会对两极产生副作用,并且您可以轻松地将此功能修改为其他情况。
请注意,您可以添加创建自己的调色板或使用 HSB 功能org/fxyz/utils/Palette
。
在 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()
和 相同),您应该会注意到不同的光照效果;那么接下来要掌握的就是如何控制灯具的位置了。此外,灯光可以有颜色!这意味着如果您想看到很酷的东西,您甚至可以实现北极光效果。Y
Z
要了解有关照明、相机和效果的更多信息,请参阅此链接。