javafx 3d colorare ogni vertice in mesh triangolo con colore specifico


Sto lavorando su una mesh triangolare per la quale ho bisogno di colorare ogni testo con un colore specifico. Ho seguito l'esempio fornito qui

Utilizzo della texture per la mesh triangolare senza dover leggere / scrivere un file immagine

Che ha aiutato molto, ma sono bloccato con la creazione dei vertici, l'esempio sopra descrive la colorazione di ogni vertice creando una tavolozza da numColors, ho provato lo stesso per il mio set di array di colori specifici che ho, la tavolozza è creata ma i vertici non sono colorati nell'ordine in cui volevo, Qualsiasi esempio su questo sarebbe davvero d'aiuto, come colorare ogni vertice in una mesh triangolare con un set specifico di colori fornito (per ogni vertice) cerando una tavolozza di colori.

Grazie

Ecco il mio esempio

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

}

Questo è il mio output:

questa è la mia uscita

E questo è l'output previsto: e questo è l'output previsto

Author: José Pereda, 2017-10-17

2 answers

Come sottolineato nella domanda che hai menzionato, hai bisogno di:

  • Un'immagine texture, fondamentalmente un piccolo png in cui ogni pixel ha un colore che verrà successivamente cercato.

Ne hai creato uno, ma sembra che i colori siano distribuiti casualmente:

  • Un modo per mappare i vertici della mesh a un pixel nell'immagine.

Le facce nella mesh definiscono gli indici dei punti , normali e texture.

Cioè, la tua faccia 0 è 80, 80, 80, 55, 55, 55, 56, 56, 56, e ciò significa che i tuoi indici di texture sono 80, 55, 56.

Secondo la tua mappatura (getTextureLocation), questi indici hanno coordinate:

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

Quali sono i colori:

Come puoi vedere che questi vertici stanno usando esattamente quel colore:

Faccia 0

Con questa colorazione casuale, per ogni coppia (x, y) all'interno della faccia 0, la trama è interpolata tra questi valori.

È possibile verificare ciò abilitando {[8] } alla pressione del mouse:

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());
        }
}

Ad esempio, per un punto compreso tra 55 e 80, dà [x = 0.51, y = 0.71], che è previsto: {(0.9 + 0.1)/2, (0.6+0.8)/2)}. In altre parole, passerà dal colore (55) al colore (80), usando tutti i colori in quell'intervallo:

Ovviamente, questo non è quello che vuoi, ma sta facendo quello che gli hai detto di fare.

Il trucco qui è avere una texture con un gradiente lineare di colori, così quando l'interpolazione è fatto, le differenze sono piccole.

Ad esempio, questo:

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());
}

Vi darà questa immagine:

E questo risultato:

seconda trama

Che è più vicino a quello che vuoi, ma non ancora lì.

Il trucco finale consiste nell'utilizzare una mappatura tra gli indici di texture, che si basano sui vertici, basati su alcune funzioni matematiche.

Utilizzando una funzione f(x, y, z) basata sul coordinate del vertice, dovrebbe darti un valore tra i colori minimo e massimo. Questo colore ha un indice e quell'indice è quello che dovresti usare per la trama.

Come caso d'uso rapido qui, userò f(x, y, z) = x, in base al risultato desiderato.

Poiché nel tuo caso x va da 0 a 30, puoi modificare facilmente la mappatura della posizione della trama:

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

Con questo risultato, basato sul gradiente che ho definito:

risultato finale

Ora è fino a voi per generare l'immagine texture corretta e texture mapping.

Riferimenti

Per ulteriori riferimenti, dai un'occhiata alla libreria FXyz3D . Un gruppo di forme 3D primitive viene creato utilizzando una classe TexturedMesh che consente di texturizzare una mesh con colori, mappature 3D o 1D e colorazione di facce o motivi.

 1
Author: José Pereda, 2017-10-31 18:52:53

Senza un esempio è difficile dire cosa sta andando storto. Ma penso che tu sia sulla strada sbagliata comunque. La domanda è cosa ti aspetti che accada quando i triangoli risultanti della mesh triangolare sono riempiti. Pensa a quante aree colorate dovresti creare e gestire nella tua trama se permetti combinazioni arbitrarie di tripli di colore per i vertici di un triangolo.

 0
Author: mipa, 2017-10-17 07:59:21