Я делаю javafx-приложение для построения трехмерных данных и хочу добавить к нему немного освещения - PullRequest
0 голосов
/ 13 июня 2019

Я хотел добавить немного освещения в трехмерную сетку, чтобы была видна задняя поверхность.Но когда я добавил Ambient Light, некоторые мелкие детали графика стали невидимыми.Как добавить освещение в сетку, чтобы задняя поверхность была видна, но мелкие детали не исчезали?

Перед добавлением света:

BeforeAddingLight

После добавления источника света:

AfterAddingLight

import java.util.logging.Logger;
import javafx.scene.DepthTest;
import javafx.scene.image.Image;
import javafx.scene.image.PixelWriter;
import javafx.scene.image.WritableImage;
import javafx.scene.paint.Color;
import javafx.scene.paint.PhongMaterial;
import javafx.scene.shape.CullFace;
import javafx.scene.shape.DrawMode;
import javafx.scene.shape.MeshView;
import javafx.scene.shape.TriangleMesh;


public class Fx3DPlotMesh extends MeshView {
    private static final int SIZE = 500;
    private static float AMPLIFI = 130;
    private int rtResolution;
    private int mzResolution;
    private static final Logger LOG = Logger
            .getLogger(Fx3DPlotMesh.class.getName());

    public Fx3DPlotMesh(Dataset dataset) {
        rtResolution = dataset.getRtResolution();
        mzResolution = dataset.getMzResolution();

        TriangleMesh mesh = new TriangleMesh();

        int[][] peakListIndices = new int[rtResolution][mzResolution];
        float factorX = (float) SIZE / rtResolution;
        float factorZ = (float) SIZE / mzResolution;

        float[][] intensityValues = dataset.getIntensityValues();

        for (int x = 0; x < rtResolution; x++) {
            for (int z = 0; z < mzResolution; z++) {
                mesh.getPoints().addAll((float) x * factorX,-intensityValues[x][z] * AMPLIFI ,(float) z * factorZ);
            }
        }

        int rtLength = rtResolution;
        int mzLength = mzResolution;
        float rtTotal = rtLength;
        float mzTotal = mzResolution;

        for (float x = 0; x < rtLength - 1; x++) {
            for (float y = 0; y < mzLength - 1; y++) {

                float x0 = x / rtTotal;
                float y0 = y / mzTotal;
                float x1 = (x + 1) / rtTotal;
                float y1 = (y + 1) / mzTotal;

                mesh.getTexCoords().addAll( //
                        x0, y0, // 0, top-left
                        x0, y1, // 1, bottom-left
                        x1, y0, // 2, top-right
                        x1, y1 // 3, bottom-right
                );
            }
        }

        // faces
        for (int x = 0; x < rtLength - 1; x++) {
            for (int z = 0; z < mzLength - 1; z++) {

                int tl = x * mzLength + z; // top-left
                int bl = x * mzLength + z + 1; // bottom-left
                int tr = (x + 1) * mzLength + z; // top-right
                int br = (x + 1) * mzLength + z + 1; // bottom-right

                int offset = (x * (mzLength - 1) + z) * 8 / 2; // div 2 because
                                                               // we have u AND
                                                               // v in the list

                // working
                mesh.getFaces().addAll(bl, offset + 1, tl, offset + 0, tr,
                        offset + 2);
                mesh.getFaces().addAll(tr, offset + 2, br, offset + 3, bl,
                        offset + 1);

            }
        }


        LOG.info("Plot mesh is ready.");
        setMesh(mesh);
        setCullFace(CullFace.NONE);
        setDrawMode(DrawMode.FILL);
        setDepthTest(DepthTest.ENABLE);
    }
}

Этот код создает сетку, показанную на изображении выше.Я просто хотел добавить немного освещения к этой сетке.Я попытался добавить немного света, используя код ниже, но это не сработало.Пожалуйста, помогите!

Light.Spot light = new Light.Spot();
light.setX(250); 
light.setY(500);
light.setZ(250);
light.setPointsAtX(250);
light.setPointsAtY(0); 
light.setPointsAtZ(250); 
light.setSpecularExponent(2);
Lighting lighting = new Lighting(); 
lighting.setLight(light); 
lighting.setSurfaceScale(5.0);
meshView.setEffect(lighting);
...