JavaFX材料&x27;s凹凸贴图和等级库贴图

JavaFX材料&x27;s凹凸贴图和等级库贴图,javafx,bump-mapping,Javafx,Bump Mapping,当JavaFX8代码加载颜色、凹凸和等级库贴图时,颜色和等级库按照预期工作,但凹凸贴图会产生奇怪的效果。这三张地图都是墨卡托地图。通常,凹凸贴图不会添加3d效果。凹凸贴图只会使喜马拉雅山和安第斯山脉在地球的亮边上显示为带亮边的黑色区域,而在彩色贴图上显示为暗边区域。我做错了什么 Image diffMap = null; Image bumpMap = null; Image specMap = null; diffMap = new Image(MoleculeSampleApp.class.

当JavaFX8代码加载颜色、凹凸和等级库贴图时,颜色和等级库按照预期工作,但凹凸贴图会产生奇怪的效果。这三张地图都是墨卡托地图。通常,凹凸贴图不会添加3d效果。凹凸贴图只会使喜马拉雅山和安第斯山脉在地球的亮边上显示为带亮边的黑色区域,而在彩色贴图上显示为暗边区域。我做错了什么

Image diffMap = null;
Image bumpMap = null;
Image specMap = null;
diffMap = new Image(MoleculeSampleApp.class.getResource("Color Map1.jpg").toExternalForm());
bumpMap = new Image(MoleculeSampleApp.class.getResource("Bump1.jpg").toExternalForm());
specMap = new Image(MoleculeSampleApp.class.getResource("Spec Mask1.png").toExternalForm());
final PhongMaterial earthMaterial = new PhongMaterial(Color.WHITE, diffMap, specMap, bumpMap, null);
earthMaterial.setDiffuseColor(Color.WHITE);
earthMaterial.setSpecularColor(Color.WHITE);

作为3d新手,我的第一个想法是,凹凸贴图的像素颜色值应该有某种缩放到高程的方式,我缺少这种缩放方式。

JavaFX凹凸贴图是法线贴图,而不是高度贴图,有关更多信息,请参阅:

这是一个你可以试试的样品

地图的图像非常大,因此在场景显示之前下载它们可能需要一段时间

我用于图像的源代码是=>

正常吗?为什么

JavaDoc状态为以下状态:

此PhongMaterial的凹凸贴图,它是存储为RGB图像的法线贴图

使用法线贴图而不是高度贴图:

[法线贴图]更精确,而不仅仅是模拟像素 沿着一条线远离面部,他们可以模拟该像素 以任意方式向任何方向移动


本文简要介绍了法线贴图和高度贴图。

更新了解释为什么法线贴图用于凹凸贴图的答案。您错过了讽刺!使用法线贴图但调用参数“凹凸贴图”令人困惑。我疯狂地想弄明白为什么凹凸贴图不起作用,而如果你调用参数“法线贴图”,你的要求就会一目了然“正常”也把我搞糊涂了。当我第一次尝试凹凸贴图功能时,我使用了,当然它不起作用,因为它们不是法线。当时,javadoc没有告诉您需要输入什么,所以我要求开发人员更新文档,以明确这是一个普通映射(他们做到了:-)。太好了,谢谢!这类事情在新兴技术中经常发生:)
import javafx.animation.*;
import javafx.application.Application;
import javafx.scene.*;
import javafx.scene.image.Image;
import javafx.scene.layout.StackPane;
import javafx.scene.paint.*;
import javafx.scene.shape.Sphere;
import javafx.scene.transform.Rotate;
import javafx.stage.Stage;
import javafx.util.Duration;

public class EarthViewer extends Application {

  private static final double EARTH_RADIUS  = 400;
  private static final double VIEWPORT_SIZE = 800;
  private static final double ROTATE_SECS   = 30;

  private static final double MAP_WIDTH  = 8192 / 2d;
  private static final double MAP_HEIGHT = 4092 / 2d;

  private static final String DIFFUSE_MAP =
      "http://planetmaker.wthr.us/img/earth_gebco8_texture_8192x4096.jpg";
  private static final String NORMAL_MAP =
      "http://planetmaker.wthr.us/img/earth_normalmap_flat_8192x4096.jpg";
  private static final String SPECULAR_MAP =
      "http://planetmaker.wthr.us/img/earth_specularmap_flat_8192x4096.jpg";

  private Group buildScene() {
    Sphere earth = new Sphere(EARTH_RADIUS);
    earth.setTranslateX(VIEWPORT_SIZE / 2d);
    earth.setTranslateY(VIEWPORT_SIZE / 2d);

    PhongMaterial earthMaterial = new PhongMaterial();
    earthMaterial.setDiffuseMap(
      new Image(
        DIFFUSE_MAP,
        MAP_WIDTH,
        MAP_HEIGHT,
        true,
        true
      )
    );
    earthMaterial.setBumpMap(
      new Image(
        NORMAL_MAP,
        MAP_WIDTH,
        MAP_HEIGHT,
        true,
        true
      )
    );
    earthMaterial.setSpecularMap(
      new Image(
        SPECULAR_MAP,
        MAP_WIDTH,
        MAP_HEIGHT,
        true,
        true
      )
    );

    earth.setMaterial(
        earthMaterial
    );

    return new Group(earth);
  }

  @Override
  public void start(Stage stage) {
    Group group = buildScene();

    Scene scene = new Scene(
      new StackPane(group),
      VIEWPORT_SIZE, VIEWPORT_SIZE,
      true,
      SceneAntialiasing.BALANCED
    );

    scene.setFill(Color.rgb(10, 10, 40));

    scene.setCamera(new PerspectiveCamera());

    stage.setScene(scene);
    stage.show();

    stage.setFullScreen(true);

    rotateAroundYAxis(group).play();
  }

  private RotateTransition rotateAroundYAxis(Node node) {
    RotateTransition rotate = new RotateTransition(
      Duration.seconds(ROTATE_SECS), 
      node
    );
    rotate.setAxis(Rotate.Y_AXIS);
    rotate.setFromAngle(360);
    rotate.setToAngle(0);
    rotate.setInterpolator(Interpolator.LINEAR);
    rotate.setCycleCount(RotateTransition.INDEFINITE);

    return rotate;
  }

  public static void main(String[] args) {
    launch(args);
  }
}