Javafx 简明教程

JavaFX - DisplacementMap

正如你可能已经知道的那样,图像由无限数量的像素组成。位移映射效果通过一定的距离平移输入图像的像素,并产生具有这些像素的不同位置的输出图像。

要在 JavaFX 节点上应用此效果,你需要使用 DisplacementMap 类。要平移输入图像上的像素,距离由 FloatMap 的前两个频段指定。FloatMap 是包含浮点数据的缓冲区,在这种情况下,即距离。

此类具有以下属性 -

  1. input - 指定输入数据,即图像。

  2. mapData - 为此位移贴图效果指定贴图数据。这指定如何映射像素。

  3. offsetX - 指定缩放后 FloatMap 中所有 x 坐标偏移值的偏移量

  4. offsetY - 指定缩放后 FloatMap 中所有 y 坐标偏移值的偏移量

  5. scaleX - 指定 FloatMap 中所有 x 坐标偏移值相乘的比例因子

  6. scaleY - 指定 FloatMap 中所有 y 坐标偏移值相乘的比例因子

  7. wrap - 定义从地图边缘获取的值是否“环绕”等。

Example

在此示例中,我们尝试使用 DisplacementMap 类将位移贴图效果应用于文本。将此代码保存在文件名为 DisplacementMapExample.java 的文件中。

import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.effect.Effect;
import javafx.scene.effect.DisplacementMap;
import javafx.scene.effect.FloatMap;
import javafx.scene.paint.Color;
import javafx.stage.Stage;
import javafx.scene.text.Font;
import javafx.scene.text.FontWeight;
import javafx.scene.text.Text;

public class DisplacementMapExample extends Application {
   @Override
   public void start(Stage stage) {
      int width = 220;
      int height = 100;

      FloatMap floatMap = new FloatMap();
      floatMap.setWidth(width);
      floatMap.setHeight(height);

      for (int i = 0; i < width; i++) {
         double v = (Math.sin(i / 20.0 * Math.PI) - 0.5) / 40.0;
         for (int j = 0; j < height; j++) {
            floatMap.setSamples(i, j, 0.0f, (float) v);
         }
      }

      DisplacementMap displacementMap = new DisplacementMap();
      displacementMap.setMapData(floatMap);

      Text text = new Text();
      text.setX(40.0);
      text.setY(80.0);
      text.setText("Displacement Map");
      text.setFill(Color.web("0x3b596d"));
      text.setFont(Font.font(null, FontWeight.BOLD, 50));
      text.setEffect(displacementMap);

	  //Creating a Group object
      Group root = new Group(text);

      //Creating a scene object
      Scene scene = new Scene(root, 600, 300);

      //Setting title to the Stage
      stage.setTitle("DisplacementMap Effect");

      //Adding scene to the stage
      stage.setScene(scene);

      //Displaying the contents of the stage
      stage.show();
   }
   public static void main(String args[]){
      launch(args);
   }
}

使用以下命令,从命令提示符编译并执行已保存的 java 文件。

javac --module-path %PATH_TO_FX% --add-modules javafx.controls DisplacementMapExample.java
java --module-path %PATH_TO_FX% --add-modules javafx.controls DisplacementMapExample

Output

执行后,上述程序会生成如下所示的 JavaFX 窗口。

displacementmap effect