如何使用两种颜色填充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);
现在你将拥有这个:
现在你不会对杆子产生副作用,你可以轻松地将这个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()
和Y
和Z
相同),你应该注意到它对光照的不同影响; 所以接下来要掌握的是如何控制照明灯具的位置。 此外,灯可以有颜色! 这意味着如果你想看到很酷的东西,你甚至可以实现北极光效果。
要了解有关照明,相机和效果的更多信息, 请参阅此链接。