2015-06-21 96 views

回答

3

由于@mohsenmadi指出,漫反射颜色没有你比一个单一的颜色使用其他允许。

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

根据您的第一个图像,我创建这个纹理图像(称为diffuse.jpg,并且在同一文件夹下放置的JavaFX类):

diffuse image

现在,您可以创建双色球:

@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); 
    ... 
} 

所以,你会看到:

sphere

请注意,您可能会对电杆产生一些副作用。

您还可以看看FXyz项目,一个带有附加JavaFX 3D复杂形状的库,以及复杂的纹理选项。例如,您可以使用密度图创建所需的相同效果,但不提供纹理图像。

根据org/fxyz/shapes/primitives你可以找到几个原始像SegmentedSphereMesh

,你可以建立一个给分割数的球体,作物师(0在这种情况下,X和Y),该radiuos,和中心:

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); 

现在你将有这样的:

Sphere FXyz

现在,你不会对两极的副作用,你可以很容易地修改此功能的其他案件。

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

0

实现三维形状梯度样作用的方式是通过施加照明材料和照明位置。你不能简单地应用两种颜色逐渐转化为对方。我为您烹制了一个小应用程序,演示如何实现这一点。

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); 
    } 
} 

,这将给你这样的: enter image description here

如果你改变了球的位置(例如,使用setTranslateX()和同为YZ),你应该注意到它照明的不同影响;所以接下来要掌握的是如何控制灯具的位置。另外,灯可以有颜色!这意味着如果你想看到很酷的东西,你甚至可以达到北极光效果。

要了解更多的关于照明,摄像头和效果,see this link.