javafx 3d окрашивает каждую вершину в треугольной сетке определенным цветом

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

Использование текстуры для треугольной сетки без необходимость чтения/записи файла изображения

это очень помогло, но я застрял с текстурированием вершин, в приведенном выше примере описывается окрашивание каждой вершины путем создания палитры из numColors, я попробовал то же самое для моего набора конкретных цветов, который у меня есть, палитра создана, но вершины не окрашен в том порядке, в котором я хотел. Любой пример на этом действительно поможет, как раскрасить каждую вершину в треугольной сетке с предоставленным определенным набором цветов (для каждой вершины) путем создания цветовой палитры.

Спасибо

Вот мой пример

import java.io.File;
import java.io.IOException;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.IntStream;
import javafx.application.Application;
import javafx.embed.swing.SwingFXUtils;
import javafx.event.EventHandler;
import javafx.scene.Group;
import javafx.scene.PerspectiveCamera;
import javafx.scene.Scene;
import javafx.scene.image.Image;
import javafx.scene.image.PixelWriter;
import javafx.scene.image.WritableImage;
import javafx.scene.input.ScrollEvent;
import javafx.scene.paint.Color;
import javafx.scene.paint.PhongMaterial;
import javafx.scene.shape.DrawMode;
import javafx.scene.shape.MeshView;
import javafx.scene.shape.TriangleMesh;
import javafx.scene.shape.VertexFormat;
import javafx.scene.transform.Rotate;
import javafx.scene.transform.Translate;
import javafx.stage.Stage;
import javax.imageio.ImageIO;

public class Sample1 extends Application {

    private static final double MODEL_SCALE_FACTOR = 10;
    private static final double MODEL_X_OFFSET = 0; // standard
    private static final double MODEL_Y_OFFSET = 0; // standard
    private static int VIEWPORT_SIZE = 800;
    private double mouseOldX, mouseOldY = 0;
    private Rotate rotateX = new Rotate(0, Rotate.X_AXIS);
    private Rotate rotateY = new Rotate(0, Rotate.Y_AXIS);
    private Rotate rotateZ = new Rotate(0, Rotate.Z_AXIS);

    private Group root = new Group();
    //Xform sceneRoot;
    PerspectiveCamera camera;
    private TriangleMesh mesh;
    // Color[] colorArray;

    @Override
    public void start(Stage primaryStage) {

        camera = new PerspectiveCamera(false);
        camera.setTranslateX(0);
        camera.setTranslateY(0);
        camera.setTranslateZ(0);
        camera.setNearClip(0.1);
        camera.setFarClip(1000.0);

        camera.getTransforms().addAll(rotateX, rotateY, new Translate(0, 0, 0));
        root.setRotationAxis(Rotate.Y_AXIS);
        root.setRotate(200);
        rotateX.setPivotX(VIEWPORT_SIZE / 2 + MODEL_X_OFFSET);
        rotateX.setPivotY(VIEWPORT_SIZE / 2 + MODEL_Y_OFFSET);
        rotateX.setPivotZ(VIEWPORT_SIZE / 2);

        rotateY.setPivotX(VIEWPORT_SIZE / 2 + MODEL_X_OFFSET);
        rotateY.setPivotY(VIEWPORT_SIZE / 2 + MODEL_Y_OFFSET);
        rotateY.setPivotZ(VIEWPORT_SIZE / 2);

        rotateZ.setPivotX(VIEWPORT_SIZE / 2 + MODEL_X_OFFSET);
        rotateZ.setPivotY(VIEWPORT_SIZE / 2 + MODEL_Y_OFFSET);
        rotateZ.setPivotZ(VIEWPORT_SIZE / 2);

        root.setScaleX(MODEL_SCALE_FACTOR);
        root.setScaleY(MODEL_SCALE_FACTOR);
        root.setScaleZ(MODEL_SCALE_FACTOR);

        createModel();
        Scene scene = new Scene(root, 800, 500);
        scene.setFill(Color.rgb(10, 10, 40));
        scene.setCamera(camera);
        scene.setOnScroll(new EventHandler<ScrollEvent>() {
            @Override
            public void handle(ScrollEvent event) {
                double zoomFactor = 1.05;
                double deltaY = event.getDeltaY();
                if (deltaY < 0) {
                    zoomFactor = 2.0 - zoomFactor;
                }
                // System.out.println(zoomFactor);
                root.setScaleX(root.getScaleX() * zoomFactor);
                root.setScaleY(root.getScaleY() * zoomFactor);
                root.setScaleZ(root.getScaleZ() * zoomFactor);
                event.consume();
            }
        });
        scene.setOnMousePressed(event -> {
            mouseOldX = event.getSceneX();
            mouseOldY = event.getSceneY();
        });

        scene.setOnMouseDragged(event -> {
            rotateX.setAngle(rotateX.getAngle() - (event.getSceneY() - mouseOldY));
            rotateY.setAngle(rotateY.getAngle() + (event.getSceneX() - mouseOldX));
            mouseOldX = event.getSceneX();
            mouseOldY = event.getSceneY();

        });

        primaryStage.setTitle("Sample Mesh");
        primaryStage.setScene(scene);
        primaryStage.centerOnScreen();
        primaryStage.show();
    }

    private void createModel() {

        mesh = new TriangleMesh(VertexFormat.POINT_NORMAL_TEXCOORD);

        addPoints();
        addFaces();
        addNormals();
        PhongMaterial mat = new PhongMaterial();

        mat.setDiffuseMap(colorPalette(colorArray));
        int numVertices = mesh.getPoints().size() / 3;
        int numColors = colorArray.length;
        IntStream.range(0, numVertices).boxed()
                .forEach(i -> mesh.getTexCoords()
                .addAll(getTextureLocation(i * numColors / numVertices, numColors)));

        MeshView meshView = new MeshView(mesh);
        meshView.setMaterial(mat);
        meshView.setDrawMode(DrawMode.FILL);
        meshView.setTranslateX(VIEWPORT_SIZE / 2 + MODEL_X_OFFSET);
        meshView.setTranslateY(VIEWPORT_SIZE / 2 + MODEL_Y_OFFSET);
        meshView.setTranslateZ(VIEWPORT_SIZE / 2);
        root.getChildren().addAll(meshView);
    }

    private void addPoints() {

        mesh.getPoints().addAll(25.255093f, 0.86116815f, 0.9920882f,
                28.010185f, 0.6422461f, 0.68806815f,
                22.5f, 0.88371015f, 1.0604522f,
                20.0f, 0.88371015f, 1.0604522f,
                17.5f, 0.88371015f, 1.0604522f,
                28.010185f, 0.9249993f, 0.0f,
                28.010185f, 0.6422461f, -0.68806815f,
                25.255093f, 1.2263886f, 0.0f,
                25.255093f, 0.86116815f, -0.9920882f,
                22.5f, 1.25f, 0.0f,
                20.0f, 1.25f, 0.0f,
                17.5f, 1.25f, 0.0f,
                22.5f, 0.88371015f, -1.0604522f,
                20.0f, 0.88371015f, -1.0604522f,
                17.5f, 0.88371015f, -1.0604522f,
                28.010185f, -1.4802974E-16f, 0.9898141f,
                25.255093f, -7.401487E-17f, 1.4115738f,
                25.255093f, -0.86116815f, 0.9920882f,
                28.010185f, -0.6422461f, 0.68806815f,
                22.5f, 0.0f, 1.5f,
                20.0f, 0.0f, 1.5f,
                17.5f, 0.0f, 1.5f,
                22.5f, -0.88371015f, 1.0604522f,
                20.0f, -0.88371015f, 1.0604522f,
                17.5f, -0.88371015f, 1.0604522f,
                30.0f, 0.0f, 0.0f,
                28.010185f, -1.3158199E-16f, -0.9898141f,
                25.255093f, -6.5790995E-17f, -1.4115738f,
                28.010185f, -0.9249993f, 0.0f,
                28.010185f, -0.6422461f, -0.68806815f,
                25.255093f, -1.2263886f, 0.0f,
                25.255093f, -0.86116815f, -0.9920882f,
                22.5f, 0.0f, -1.5f,
                20.0f, 0.0f, -1.5f,
                17.5f, 0.0f, -1.5f,
                22.5f, -1.25f, 0.0f,
                20.0f, -1.25f, 0.0f,
                17.5f, -1.25f, 0.0f,
                22.5f, -0.88371015f, -1.0604522f,
                20.0f, -0.88371015f, -1.0604522f,
                17.5f, -0.88371015f, -1.0604522f,
                15.0f, 0.88371015f, 1.0604522f,
                12.5f, 0.88371015f, 1.0604522f,
                10.0f, 0.88371015f, 1.0604522f,
                7.5f, 0.88371015f, 1.0604522f,
                4.744907f, 0.86116815f, 0.9920882f,
                1.989814f, 0.6422461f, 0.68806815f,
                15.0f, 1.25f, 0.0f,
                12.5f, 1.25f, 0.0f,
                10.0f, 1.25f, 0.0f,
                15.0f, 0.88371015f, -1.0604522f,
                12.5f, 0.88371015f, -1.0604522f,
                10.0f, 0.88371015f, -1.0604522f,
                7.5f, 1.25f, 0.0f,
                4.744907f, 1.2263886f, 0.0f,
                1.989814f, 0.9249993f, 0.0f,
                1.989814f, 0.6422461f, -0.68806815f,
                7.5f, 0.88371015f, -1.0604522f,
                4.744907f, 0.86116815f, -0.9920882f,
                15.0f, 0.0f, 1.5f,
                12.5f, 0.0f, 1.5f,
                10.0f, 0.0f, 1.5f,
                15.0f, -0.88371015f, 1.0604522f,
                12.5f, -0.88371015f, 1.0604522f,
                10.0f, -0.88371015f, 1.0604522f,
                7.5f, 0.0f, 1.5f,
                4.744907f, -7.401487E-17f, 1.4115738f,
                1.989814f, -1.4802974E-16f, 0.9898141f,
                7.5f, -0.88371015f, 1.0604522f,
                4.744907f, -0.86116815f, 0.9920882f,
                1.989814f, -0.6422461f, 0.68806815f,
                15.0f, 0.0f, -1.5f,
                12.5f, 0.0f, -1.5f,
                10.0f, 0.0f, -1.5f,
                15.0f, -1.25f, 0.0f,
                12.5f, -1.25f, 0.0f,
                10.0f, -1.25f, 0.0f,
                15.0f, -0.88371015f, -1.0604522f,
                12.5f, -0.88371015f, -1.0604522f,
                10.0f, -0.88371015f, -1.0604522f,
                0.0f, -2.9605948E-16f, 0.0f,
                7.5f, 0.0f, -1.5f,
                4.744907f, -6.5790995E-17f, -1.4115738f,
                1.989814f, -1.3158199E-16f, -0.9898141f,
                7.5f, -1.25f, 0.0f,
                4.744907f, -1.2263886f, 0.0f,
                1.989814f, -0.9249993f, 0.0f,
                1.989814f, -0.6422461f, -0.68806815f,
                7.5f, -0.88371015f, -1.0604522f,
                4.744907f, -0.86116815f, -0.9920882f);
    }

    private void addFaces() {
        mesh.getFaces().addAll(80, 80, 80, 55, 55, 55, 56, 56, 56,
                80, 80, 80, 56, 56, 56, 83, 83, 83,
                83, 83, 83, 87, 87, 87, 80, 80, 80,
                87, 87, 87, 86, 86, 86, 80, 80, 80,
                80, 80, 80, 86, 86, 86, 70, 70, 70,
                80, 80, 80, 70, 70, 70, 67, 67, 67,
                67, 67, 67, 46, 46, 46, 80, 80, 80,
                46, 46, 46, 55, 55, 55, 80, 80, 80,
                55, 55, 55, 54, 54, 54, 58, 58, 58,
                55, 55, 55, 58, 58, 58, 56, 56, 56,
                56, 56, 56, 58, 58, 58, 82, 82, 82,
                56, 56, 56, 82, 82, 82, 83, 83, 83,
                83, 83, 83, 82, 82, 82, 87, 87, 87,
                82, 82, 82, 89, 89, 89, 87, 87, 87,
                87, 87, 87, 89, 89, 89, 86, 86, 86,
                89, 89, 89, 85, 85, 85, 86, 86, 86,
                86, 86, 86, 85, 85, 85, 69, 69, 69,
                86, 86, 86, 69, 69, 69, 70, 70, 70,
                70, 70, 70, 69, 69, 69, 66, 66, 66,
                70, 70, 70, 66, 66, 66, 67, 67, 67,
                67, 67, 67, 66, 66, 66, 46, 46, 46,
                66, 66, 66, 45, 45, 45, 46, 46, 46,
                46, 46, 46, 45, 45, 45, 55, 55, 55,
                45, 45, 45, 54, 54, 54, 55, 55, 55,
                54, 54, 54, 53, 53, 53, 57, 57, 57,
                54, 54, 54, 57, 57, 57, 58, 58, 58,
                58, 58, 58, 57, 57, 57, 81, 81, 81,
                58, 58, 58, 81, 81, 81, 82, 82, 82,
                82, 82, 82, 81, 81, 81, 89, 89, 89,
                81, 81, 81, 88, 88, 88, 89, 89, 89,
                89, 89, 89, 88, 88, 88, 85, 85, 85,
                88, 88, 88, 84, 84, 84, 85, 85, 85,
                85, 85, 85, 84, 84, 84, 68, 68, 68,
                85, 85, 85, 68, 68, 68, 69, 69, 69,
                69, 69, 69, 68, 68, 68, 65, 65, 65,
                69, 69, 69, 65, 65, 65, 66, 66, 66,
                66, 66, 66, 65, 65, 65, 45, 45, 45,
                65, 65, 65, 44, 44, 44, 45, 45, 45,
                45, 45, 45, 44, 44, 44, 54, 54, 54,
                44, 44, 44, 53, 53, 53, 54, 54, 54,
                53, 53, 53, 49, 49, 49, 52, 52, 52,
                53, 53, 53, 52, 52, 52, 57, 57, 57,
                57, 57, 57, 52, 52, 52, 73, 73, 73,
                57, 57, 57, 73, 73, 73, 81, 81, 81,
                81, 81, 81, 73, 73, 73, 88, 88, 88,
                73, 73, 73, 79, 79, 79, 88, 88, 88,
                88, 88, 88, 79, 79, 79, 84, 84, 84,
                79, 79, 79, 76, 76, 76, 84, 84, 84,
                84, 84, 84, 76, 76, 76, 64, 64, 64,
                84, 84, 84, 64, 64, 64, 68, 68, 68,
                68, 68, 68, 64, 64, 64, 61, 61, 61,
                68, 68, 68, 61, 61, 61, 65, 65, 65,
                65, 65, 65, 61, 61, 61, 44, 44, 44,
                61, 61, 61, 43, 43, 43, 44, 44, 44,
                44, 44, 44, 43, 43, 43, 53, 53, 53,
                43, 43, 43, 49, 49, 49, 53, 53, 53,
                49, 49, 49, 48, 48, 48, 51, 51, 51,
                49, 49, 49, 51, 51, 51, 52, 52, 52,
                52, 52, 52, 51, 51, 51, 72, 72, 72,
                52, 52, 52, 72, 72, 72, 73, 73, 73,
                73, 73, 73, 72, 72, 72, 79, 79, 79,
                72, 72, 72, 78, 78, 78, 79, 79, 79,
                79, 79, 79, 78, 78, 78, 76, 76, 76,
                78, 78, 78, 75, 75, 75, 76, 76, 76,
                76, 76, 76, 75, 75, 75, 63, 63, 63,
                76, 76, 76, 63, 63, 63, 64, 64, 64,
                64, 64, 64, 63, 63, 63, 60, 60, 60,
                64, 64, 64, 60, 60, 60, 61, 61, 61,
                61, 61, 61, 60, 60, 60, 43, 43, 43,
                60, 60, 60, 42, 42, 42, 43, 43, 43,
                43, 43, 43, 42, 42, 42, 49, 49, 49,
                42, 42, 42, 48, 48, 48, 49, 49, 49,
                48, 48, 48, 47, 47, 47, 50, 50, 50,
                48, 48, 48, 50, 50, 50, 51, 51, 51,
                51, 51, 51, 50, 50, 50, 71, 71, 71,
                51, 51, 51, 71, 71, 71, 72, 72, 72,
                72, 72, 72, 71, 71, 71, 78, 78, 78,
                71, 71, 71, 77, 77, 77, 78, 78, 78,
                78, 78, 78, 77, 77, 77, 75, 75, 75,
                77, 77, 77, 74, 74, 74, 75, 75, 75,
                75, 75, 75, 74, 74, 74, 62, 62, 62,
                75, 75, 75, 62, 62, 62, 63, 63, 63,
                63, 63, 63, 62, 62, 62, 59, 59, 59,
                63, 63, 63, 59, 59, 59, 60, 60, 60,
                60, 60, 60, 59, 59, 59, 42, 42, 42,
                59, 59, 59, 41, 41, 41, 42, 42, 42,
                42, 42, 42, 41, 41, 41, 48, 48, 48,
                41, 41, 41, 47, 47, 47, 48, 48, 48,
                47, 47, 47, 11, 11, 11, 14, 14, 14,
                47, 47, 47, 14, 14, 14, 50, 50, 50,
                50, 50, 50, 14, 14, 14, 34, 34, 34,
                50, 50, 50, 34, 34, 34, 71, 71, 71,
                71, 71, 71, 34, 34, 34, 77, 77, 77,
                34, 34, 34, 40, 40, 40, 77, 77, 77,
                77, 77, 77, 40, 40, 40, 74, 74, 74,
                40, 40, 40, 37, 37, 37, 74, 74, 74,
                74, 74, 74, 37, 37, 37, 24, 24, 24,
                74, 74, 74, 24, 24, 24, 62, 62, 62,
                62, 62, 62, 24, 24, 24, 21, 21, 21,
                62, 62, 62, 21, 21, 21, 59, 59, 59,
                59, 59, 59, 21, 21, 21, 41, 41, 41,
                21, 21, 21, 4, 4, 4, 41, 41, 41, 41,
                41, 41, 4, 4, 4, 47, 47, 47, 4, 4, 4,
                11, 11, 11, 47, 47, 47, 11, 11, 11,
                10, 10, 10, 13, 13, 13, 11, 11, 11,
                13, 13, 13, 14, 14, 14, 14, 14, 14,
                13, 13, 13, 33, 33, 33, 14, 14, 14,
                33, 33, 33, 34, 34, 34, 34, 34, 34,
                33, 33, 33, 40, 40, 40, 33, 33, 33,
                39, 39, 39, 40, 40, 40, 40, 40, 40,
                39, 39, 39, 37, 37, 37, 39, 39, 39,
                36, 36, 36, 37, 37, 37, 37, 37, 37,
                36, 36, 36, 23, 23, 23, 37, 37, 37,
                23, 23, 23, 24, 24, 24, 24, 24, 24,
                23, 23, 23, 20, 20, 20, 24, 24, 24,
                20, 20, 20, 21, 21, 21, 21, 21, 21,
                20, 20, 20, 4, 4, 4, 20, 20, 20,
                3, 3, 3, 4, 4, 4, 4, 4, 4,
                3, 3, 3, 11, 11, 11, 3, 3, 3,
                10, 10, 10, 11, 11, 11, 10, 10, 10,
                9, 9, 9, 12, 12, 12, 10, 10, 10,
                12, 12, 12, 13, 13, 13, 13, 13, 13,
                12, 12, 12, 32, 32, 32, 13, 13, 13,
                32, 32, 32, 33, 33, 33, 33, 33, 33,
                32, 32, 32, 39, 39, 39, 32, 32, 32,
                38, 38, 38, 39, 39, 39, 39, 39, 39,
                38, 38, 38, 36, 36, 36, 38, 38, 38,
                35, 35, 35, 36, 36, 36, 36, 36, 36,
                35, 35, 35, 22, 22, 22, 36, 36, 36,
                22, 22, 22, 23, 23, 23, 23, 23, 23,
                22, 22, 22, 19, 19, 19, 23, 23, 23,
                19, 19, 19, 20, 20, 20, 20, 20, 20,
                19, 19, 19, 3, 3, 3, 19, 19, 19,
                2, 2, 2, 3, 3, 3, 3, 3, 3, 2, 2, 2,
                10, 10, 10, 2, 2, 2, 9, 9, 9,
                10, 10, 10, 9, 9, 9, 7, 7, 7,
                8, 8, 8, 9, 9, 9, 8, 8, 8,
                12, 12, 12, 12, 12, 12, 8, 8, 8,
                27, 27, 27, 12, 12, 12, 27, 27, 27,
                32, 32, 32, 32, 32, 32, 27, 27, 27,
                38, 38, 38, 27, 27, 27, 31, 31, 31,
                38, 38, 38, 38, 38, 38, 31, 31, 31,
                35, 35, 35, 31, 31, 31, 30, 30, 30,
                35, 35, 35, 35, 35, 35, 30, 30, 30,
                17, 17, 17, 35, 35, 35, 17, 17, 17,
                22, 22, 22, 22, 22, 22, 17, 17, 17,
                16, 16, 16, 22, 22, 22, 16, 16, 16,
                19, 19, 19, 19, 19, 19, 16, 16, 16,
                2, 2, 2, 16, 16, 16, 0, 0, 0,
                2, 2, 2, 2, 2, 2, 0, 0, 0,
                9, 9, 9, 0, 0, 0, 7, 7, 7,
                9, 9, 9, 7, 7, 7, 5, 5, 5,
                6, 6, 6, 7, 7, 7, 6, 6, 6,
                8, 8, 8, 8, 8, 8, 6, 6, 6,
                26, 26, 26, 8, 8, 8,
                26, 26, 26, 27, 27, 27, 27, 27, 27,
                26, 26, 26, 31, 31, 31, 26, 26, 26,
                29, 29, 29, 31, 31, 31, 31, 31, 31,
                29, 29, 29, 30, 30, 30, 29, 29, 29,
                28, 28, 28, 30, 30, 30, 30, 30, 30,
                28, 28, 28, 18, 18, 18, 30, 30, 30,
                18, 18, 18, 17, 17, 17, 17, 17, 17,
                18, 18, 18, 15, 15, 15, 17, 17, 17,
                15, 15, 15, 16, 16, 16, 16, 16, 16,
                15, 15, 15, 0, 0, 0,
                15, 15, 15, 1, 1, 1, 0, 0, 0,
                0, 0, 0, 1, 1, 1, 7, 7, 7,
                1, 1, 1, 5, 5, 5, 7, 7, 7,
                5, 5, 5, 25, 25, 25, 6, 6, 6,
                6, 6, 6, 25, 25, 25, 26, 26, 26,
                26, 26, 26, 25, 25, 25, 29, 29, 29,
                29, 29, 29, 25, 25, 25, 28, 28, 28,
                28, 28, 28, 25, 25, 25, 18, 18, 18,
                18, 18, 18, 25, 25, 25, 15, 15, 15,
                15, 15, 15, 25, 25, 25, 1, 1, 1,
                1, 1, 1, 25, 25, 25, 5, 5, 5);
    }

    private void addNormals() {

        mesh.getNormals().addAll(0.07288012f, 0.768564f, 0.6356083f, 0.21982567f, 0.7893725f, 0.5732083f, 0.012779057f,
                0.76441664f, 0.6445959f, 0.0f, 0.76822126f, 0.6401844f, 0.0f, 0.76822126f, 0.6401844f, 0.25024077f, 0.96818364f,
                0.0f, 0.21982567f, 0.7893725f, -0.5732083f, 0.07571304f, 0.9971296f, 0.0f, 0.07288012f, 0.768564f, -0.6356083f,
                0.0087126205f, 0.99996203f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.012779057f, 0.76441664f, -0.6445959f, 0.0f,
                0.76822126f, -0.6401844f, 0.0f, 0.76822126f, -0.6401844f, 0.22647266f, 0.0f, 0.9740175f, 0.07080862f, 0.0f, 0.9974899f,
                0.07288012f, -0.768564f, 0.6356083f, 0.21982567f, -0.7893725f, 0.5732083f, 0.011401603f, 0.0f, 0.999935f, 0.0f, 0.0f,
                1.0f, 0.0f, 0.0f, 1.0f, 0.012779057f, -0.76441664f, 0.6445959f, 0.0f, -0.76822126f, 0.6401844f, 0.0f, -0.76822126f, 0.6401844f,
                1.0f, 0.0f, 0.0f, 0.22647266f, 0.0f, -0.9740175f, 0.07080862f, 0.0f, -0.9974899f, 0.25024077f, -0.96818364f, 0.0f, 0.21982567f,
                -0.7893725f, -0.5732083f, 0.07571304f, -0.9971296f, 0.0f, 0.07288012f, -0.768564f, -0.6356083f, 0.011401603f, 0.0f, -0.999935f,
                0.0f, 0.0f, -1.0f, 0.0f, 0.0f, -1.0f, 0.0087126205f, -0.99996203f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, -1.0f, 0.0f, 0.012779057f, -0.76441664f,
                -0.6445959f, 0.0f, -0.76822126f, -0.6401844f, 0.0f, -0.76822126f, -0.6401844f, 0.0f, 0.76822126f, 0.6401844f, 0.0f, 0.76822126f,
                0.6401844f, 0.0f, 0.76822126f, 0.6401844f, -0.009348294f, 0.76747775f, 0.6410074f, -0.07317282f, 0.73539054f, 0.67368126f, -0.2320432f,
                0.6365708f, 0.73548186f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.76822126f, -0.6401844f, 0.0f, 0.76822126f, -0.6401844f,
                0.0f, 0.76822126f, -0.6401844f, -0.0030446206f, 0.99999535f, 0.0f, -0.044230007f, 0.99902135f, 0.0f, -0.19177821f, 0.9814383f, 0.0f,
                -0.2320432f, 0.6365708f, -0.73548186f, -0.009348294f, 0.76747775f, -0.6410074f, -0.07317282f, 0.73539054f, -0.67368126f, 0.0f, 0.0f,
                1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, -0.76822126f, 0.6401844f, 0.0f, -0.76822126f, 0.6401844f, 0.0f, -0.76822126f, 0.6401844f,
                -0.020870605f, 0.0f, 0.9997822f, -0.1069364f, 0.0f, 0.99426585f, -0.2851421f, 0.0f, 0.95848525f, -0.009348294f, -0.76747775f, 0.6410074f,
                -0.07317282f, -0.73539054f, 0.67368126f, -0.2320432f, -0.6365708f, 0.73548186f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, -1.0f,
                0.0f, -1.0f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, -0.76822126f, -0.6401844f, 0.0f, -0.76822126f, -0.6401844f, 0.0f, -0.76822126f,
                -0.6401844f, -1.0f, 0.0f, -4.363512E-17f, -0.020870605f, 0.0f, -0.9997822f, -0.1069364f, 0.0f, -0.99426585f, -0.2851421f, 0.0f,
                -0.95848525f, -0.0030446206f, -0.99999535f, 0.0f, -0.044230007f, -0.99902135f, 0.0f, -0.19177821f, -0.9814383f, 0.0f, -0.2320432f,
                -0.6365708f, -0.73548186f, -0.009348294f, -0.76747775f, -0.6410074f, -0.07317282f, -0.73539054f, -0.67368126f);
    }

    Color[] colorArray = {Color.rgb(0, 45, 255, 1.0),
        Color.rgb(0, 81, 255, 1.0),
        Color.rgb(0, 194, 255, 1.0),
        Color.rgb(0, 255, 101, 1.0),
        Color.rgb(0, 255, 80, 1.0),
        Color.rgb(0, 104, 255, 1.0),
        Color.rgb(0, 95, 255, 1.0),
        Color.rgb(0, 53, 255, 1.0),
        Color.rgb(0, 59, 255, 1.0),
        Color.rgb(0, 137, 255, 1.0),
        Color.rgb(0, 255, 120, 1.0),
        Color.rgb(0, 255, 79, 1.0),
        Color.rgb(0, 203, 255, 1.0),
        Color.rgb(0, 255, 100, 1.0),
        Color.rgb(0, 255, 79, 1.0),
        Color.rgb(0, 51, 255, 1.0),
        Color.rgb(0, 21, 255, 1.0),
        Color.rgb(0, 0, 255, 1.0),
        Color.rgb(0, 38, 255, 1.0),
        Color.rgb(0, 241, 255, 1.0),
        Color.rgb(0, 255, 83, 1.0),
        Color.rgb(0, 255, 80, 1.0),
        Color.rgb(0, 167, 255, 1.0),
        Color.rgb(0, 255, 104, 1.0),
        Color.rgb(0, 255, 80, 1.0),
        Color.rgb(0, 148, 255, 1.0),
        Color.rgb(0, 65, 255, 1.0),
        Color.rgb(0, 35, 255, 1.0),
        Color.rgb(0, 61, 255, 1.0),
        Color.rgb(0, 52, 255, 1.0),
        Color.rgb(0, 7, 255, 1.0),
        Color.rgb(0, 15, 255, 1.0),
        Color.rgb(0, 248, 255, 1.0),
        Color.rgb(0, 255, 83, 1.0),
        Color.rgb(0, 255, 80, 1.0),
        Color.rgb(0, 101, 255, 1.0),
        Color.rgb(0, 255, 126, 1.0),
        Color.rgb(0, 255, 80, 1.0),
        Color.rgb(0, 176, 255, 1.0),
        Color.rgb(0, 255, 103, 1.0),
        Color.rgb(0, 255, 80, 1.0),
        Color.rgb(0, 255, 117, 1.0),
        Color.rgb(0, 255, 152, 1.0),
        Color.rgb(0, 255, 100, 1.0),
        Color.rgb(255, 246, 0, 1.0),
        Color.rgb(255, 28, 0, 1.0),
        Color.rgb(255, 52, 0, 1.0),
        Color.rgb(0, 255, 104, 1.0),
        Color.rgb(0, 255, 152, 1.0),
        Color.rgb(0, 255, 143, 1.0),
        Color.rgb(0, 255, 117, 1.0),
        Color.rgb(0, 255, 152, 1.0),
        Color.rgb(0, 255, 102, 1.0),
        Color.rgb(155, 255, 0, 1.0),
        Color.rgb(255, 36, 0, 1.0),
        Color.rgb(255, 55, 0, 1.0),
        Color.rgb(255, 65, 0, 1.0),
        Color.rgb(255, 255, 0, 1.0),
        Color.rgb(255, 42, 0, 1.0),
        Color.rgb(0, 255, 128, 1.0),
        Color.rgb(0, 255, 151, 1.0),
        Color.rgb(0, 255, 59, 1.0),
        Color.rgb(0, 255, 117, 1.0),
        Color.rgb(0, 255, 151, 1.0),
        Color.rgb(0, 255, 95, 1.0),
        Color.rgb(255, 134, 0, 1.0),
        Color.rgb(255, 5, 0, 1.0),
        Color.rgb(255, 39, 0, 1.0),
        Color.rgb(255, 216, 0, 1.0),
        Color.rgb(255, 0, 0, 1.0),
        Color.rgb(255, 11, 0, 1.0),
        Color.rgb(0, 255, 129, 1.0),
        Color.rgb(0, 255, 152, 1.0),
        Color.rgb(0, 255, 62, 1.0),
        Color.rgb(0, 255, 105, 1.0),
        Color.rgb(0, 255, 151, 1.0),
        Color.rgb(0, 255, 141, 1.0),
        Color.rgb(0, 255, 117, 1.0),
        Color.rgb(0, 255, 151, 1.0),
        Color.rgb(0, 255, 97, 1.0),
        Color.rgb(255, 93, 0, 1.0),
        Color.rgb(255, 146, 0, 1.0),
        Color.rgb(255, 19, 0, 1.0),
        Color.rgb(255, 53, 0, 1.0),
        Color.rgb(178, 255, 0, 1.0),
        Color.rgb(255, 0, 0, 1.0),
        Color.rgb(255, 12, 0, 1.0),
        Color.rgb(255, 25, 0, 1.0),
        Color.rgb(255, 226, 0, 1.0),
        Color.rgb(255, 0, 0, 1.0),};

    private Image colorPalette(Color[] colors) {
        int numColors = colors.length;
        int width = (int) Math.sqrt(numColors);
        int height = numColors / width;

        WritableImage img = new WritableImage(width, height);
        PixelWriter pw = img.getPixelWriter();

        //float[] colors = buffer.array();
        AtomicInteger count = new AtomicInteger();

        IntStream.range(0, height).boxed()
                .forEach(y -> IntStream.range(0, width).boxed()
                .forEach(x -> pw.setColor(x, y, getColor(count))));

        // save for testing purposes
        try {
            ImageIO.write(SwingFXUtils.fromFXImage(img, null), "png", new File("palette" + ".png"));
        } catch (IOException ex) {
        }
        return img;
    }

    private Color getColor(AtomicInteger count) {
        return colorArray[count.getAndIncrement()];
    }

    private float[] getTextureLocation(int iPoint, int numColors) {
        int width = (int) Math.sqrt(numColors);
        int height = numColors / width;
        int y = iPoint / width;
        int x = iPoint - width * y;
        float[] textureArray = new float[]{(((float) x) / ((float) width)), (((float) y) / ((float) height))};
        return textureArray;
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        launch(args);
    }

}

Это мой вывод:

это мой вывод

и это ожидаемый результат: и это ожидаемый результат


person Mohd Safi    schedule 17.10.2017    source источник
comment
Не могли бы вы опубликовать свой код, отредактировав этот вопрос?   -  person Dima Kozhevin    schedule 17.10.2017
comment
Можете ли вы также дать ссылку на приведенный здесь пример?   -  person jewelsea    schedule 17.10.2017
comment
Я отредактировал свой пост, добавив пример кода и ссылку на пример.   -  person Mohd Safi    schedule 18.10.2017
comment
Я все еще борюсь с этим, если у кого-то есть какие-либо предложения, дайте мне знать. Пример, который я использую, размещен здесь   -  person Mohd Safi    schedule 20.10.2017


Ответы (2)


Как указано в вопросе, который вы упомянули, вам нужно:

  • Изображение текстуры, в основном небольшой png, где каждый пиксель имеет цвет, который будет позже найден.

Вы создали его, но кажется, что цвета распределены случайным образом:

  • Способ сопоставления вершин сетки с пикселем изображения.

Грани в вашей сетке определяют индексы точек, нормалей и текстур.

То есть ваше лицо 0 равно 80, 80, 80, 55, 55, 55, 56, 56, 56, а это значит, что индексы вашей текстуры равны 80, 55, 56.

Согласно вашему отображению (getTextureLocation), эти индексы имеют координаты:

55 [0.11111111, 0.6]
56 [0.22222222, 0.6]
80 [0.8888889, 0.8]

какие цвета:

Как видите, эти вершины используют именно этот цвет:

Лицо 0

При таком случайном окрашивании для каждой пары (x, y) грани 0 текстура интерполируется между этими значениями.

Вы можете убедиться в этом, включив PickResult при нажатии мыши:

scene.setOnMousePressed(event -> {
        PickResult pickResult = event.getPickResult();
        if (pickResult != null) {
            System.out.println("face: " + pickResult.getIntersectedFace());
            System.out.println("point: " + pickResult.getIntersectedPoint());
            System.out.println("text: " + pickResult.getIntersectedTexCoord());
        }
}

Например, для точки между 55 и 80 это дает [x = 0.51, y = 0.71], что ожидается: {(0.9 + 0.1)/2, (0.6+0.8)/2)}. Другими словами, он будет переходить от цвета (55) к цвету (80), используя все цвета в этом диапазоне:

Очевидно, это не то, чего вы хотите, но он делает то, что вы ему сказали.

Хитрость здесь в том, чтобы иметь текстуру с линейным градиентом цветов, поэтому, когда интерполяция выполнена, различия будут небольшими.

Например, это:

private Color getColor(AtomicInteger count, int numColors) {
    int iColor = count.getAndIncrement();
    java.awt.Color c = java.awt.Color.getHSBColor((float) iColor / (float) numColors, 1.0f, 1.0f);
    return Color.rgb(c.getRed(), c.getGreen(), c.getBlue());
}

даст вам это изображение:

и этот результат:

вторая текстура

Что ближе к тому, что вы хотите, но еще не там.

Последний трюк заключается в использовании сопоставления между вашими текстурными индексами, основанными на вершинах, на основе некоторой математической функции.

Используя функцию f(x, y, z) на основе координат вершин, она должна дать вам значение между минимальным и максимальным цветами. У этого цвета есть индекс, и именно этот индекс вы должны использовать для текстуры.

В качестве быстрого варианта использования я буду использовать f(x, y, z) = x в зависимости от желаемого результата.

Поскольку в вашем случае x изменяется от 0 до 30, вы можете легко настроить отображение местоположения текстуры:

float[] points = new float[mesh.getPoints().size()];
mesh.getPoints().toArray(points);

IntStream.range(0, numVertices).boxed()
            .forEach(i -> {
                double x = points[3 * i];
                int fact = (int) (x / 30d * numVertices);
                mesh.getTexCoords().addAll(getTextureLocation(fact, numColors));
            });    

с этим результатом, основанным на градиенте, который я определил:

конечный результат

Теперь вам нужно сгенерировать правильное изображение текстуры и наложение текстуры.

Ссылки

Дополнительные сведения см. в библиотеке FXyz3D. Группа примитивных 3D-форм создается с использованием класса TexturedMesh, который позволяет текстурировать сетку с помощью цветов, 3D- или 1D-отображения, а также раскрашивать грани или узоры.

person José Pereda    schedule 31.10.2017
comment
Спасибо за подробный пример, который очень помог. - person Mohd Safi; 07.11.2017
comment
Здорово. Затем рассмотрите возможность пометить ответ как принятый (отметьте галочкой слева), чтобы он мог быть полезен и другим. - person José Pereda; 07.11.2017

Без примера сложно сказать, что пошло не так. Но я думаю, что вы все равно на ложном пути. Вопрос в том, что вы ожидаете, когда полученные треугольники сетки треугольников будут заполнены. Просто подумайте, сколько цветных областей вам пришлось бы создать и управлять в своей текстуре, если бы вы разрешили произвольные комбинации цветовых троек для вершин одного треугольника.

person mipa    schedule 17.10.2017
comment
я добавил пример кода, а также ссылку на пример, на который я ссылался. - person Mohd Safi; 17.10.2017
comment
я также добавил изображение моего текущего вывода и ожидаемого вывода. - person Mohd Safi; 17.10.2017