2

2d Circle のような線形グラデーションで JavaFX を 3D Sphere に塗りつぶすにはどうすればよいですか? JavaFX Scene Builder を使用しています。

ここに画像の説明を入力

ここに画像の説明を入力

4

2 に答える 2

6

@mohsenmadi が指摘したように、ディフューズ カラーでは、単一のカラー以外を使用することはできません。

ただし、画像を拡散反射光マップとして使用することで、球にさまざまな色を持たせることができます。

最初の画像に基づいて、このテクスチャ画像を作成しました ( と呼ばdiffuse.jpgれ、JavaFX クラスと同じフォルダーに配置されます)。

拡散画像

これで、2 色の球体を作成できます。

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

したがって、次のように表示されます。

球体

極に何らかの副作用が生じる可能性があることに注意してください。

また、追加の JavaFX 3D 複雑な形状と複雑なテクスチャ オプションを備えたライブラリであるFXyzプロジェクトもご覧ください。

たとえば、密度マップを使用して、必要な同じ効果を作成できますが、テクスチャ イメージを提供する必要はありません。

その下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);

これで次のようになります。

スフィア FXyz

これで、極に副作用がなくなり、この関数を他のケースに簡単に変更できます。

独自のカラー パレットを作成したり、 の下の HSB 関数で遊んだりできることに注意してくださいorg/fxyz/utils/Palette

于 2015-06-21T20:45:37.077 に答える
0

3D シェイプでグラデーションのような効果を実現する方法は、ライティング マテリアルとライティングの位置を適用することです。徐々に互いに変化する 2 つの色を単純に適用することはできません。これを実現する方法を示す小さなアプリを作成しました。

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

ライティング、カメラ、エフェクトについて詳しくは、このリンクを参照してください。

于 2015-06-21T17:15:18.007 に答える