javafx 3d coloriant chaque sommet dans un maillage triangulaire avec une couleur spécifique


Je travaille sur un maillage triangulaire pour lequel je dois colorer chaque vertext avec une couleur spécifique. J'ai suivi l'exemple fourni ici

Utiliser la texture pour le maillage triangle sans avoir à lire / écrire un fichier image

Ce qui a beaucoup aidé, mais je suis coincé avec tecturing les sommets, l'exemple ci-dessus décrit la coloration de chaque sommet en créant une palette à partir de numColors, j'ai essayé la même chose pour mon ensemble de tableaux de couleurs spécifiques que j'ai, la palette est créée mais les sommets ne sont pas colorés dans l'ordre que je voulais, Tout exemple à ce sujet aiderait vraiment, comment colorer chaque sommet dans un maillage triangulaire avec un ensemble spécifique de couleurs fourni (pour chaque sommet) en cerating une palette de couleurs.

Merci

Voici mon exemple

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

}

Ceci est ma sortie:

ceci est ma sortie

Et c'est la sortie attendue: et c'est la sortie attendue

Author: José Pereda, 2017-10-17

2 answers

Comme indiqué dans la question que vous avez mentionnée, vous avez besoin de:

  • Une image de texture, essentiellement un petit png où chaque pixel a une couleur qui sera recherchée plus tard.

Vous en avez créé un, mais il semble que les couleurs soient distribuées au hasard:

  • Un moyen de mapper les sommets du maillage à un pixel dans l'image.

Les faces de votre maillage définissent les indices des points, normales et textures.

C'est-à-dire que votre visage 0 est 80, 80, 80, 55, 55, 55, 56, 56, 56, ce qui signifie que vos indices de texture sont 80, 55, 56.

Selon votre mappage (getTextureLocation), ces indices ont des coordonnées:

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

Quelles sont les couleurs:

Comme vous pouvez le voir, ces sommets utilisent exactement cette couleur:

Face 0

Avec cette coloration aléatoire, pour chaque paire (x, y) dans la face 0, la texture est interpolée entre ces valeurs.

Vous pouvez le vérifier en activant PickResult lorsque la souris est enfoncée:

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

Par exemple, pour un point compris entre 55 et 80, cela donne [x = 0.51, y = 0.71], ce qui est attendu: {(0.9 + 0.1)/2, (0.6+0.8)/2)}. En d'autres termes, il passera de la couleur (55) à la couleur (80), en utilisant toutes les couleurs de cette plage:

Évidemment, ce n'est pas ce que vous voulez, mais il fait ce que vous lui avez dit de faire.

L'astuce ici est d'avoir une texture avec un dégradé linéaire de couleurs, donc quand l'interpolation est faite, les différences sont petites.

, Par exemple, ceci:

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

Vous donnera cette image:

Et ce résultat:

deuxième texture

Qui est plus proche de ce que vous voulez, mais pas encore là.

La dernière astuce consiste à utiliser un mappage entre vos indices de texture, qui sont basés sur les sommets, basés sur une fonction mathématique.

En utilisant une fonction f(x, y, z) basée sur vertex coordonnées, il devrait vous donner une valeur entre les couleurs minimum et maximum. Cette couleur a un index, et cet index est celui que vous devez utiliser pour la texture.

Comme cas d'utilisation rapide ici, je vais utiliser f(x, y, z) = x, en fonction du résultat souhaité.

Puisque dans votre cas, {[13] } va de 0 à 30, vous pouvez modifier facilement le mappage d'emplacement de texture:

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

Avec ce résultat, basé sur le gradient que j'ai défini:

résultat final

Maintenant c'est à vous de générer l'image de texture et le mappage de texture appropriés.

Références à

Pour d'autres références, consultez la bibliothèque FXyz3D . Un tas de formes 3D primitives sont créées à l'aide d'une classe TexturedMesh qui permet de texturer un maillage avec des couleurs, un mappage 3D ou 1D et une coloration de visage ou de motif.

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

Sans exemple, il est difficile de dire ce qui ne va pas. Mais je pense que vous êtes sur la mauvaise voie de toute façon. La question est de savoir à quoi vous attendez-vous lorsque les triangles résultants du maillage triangulaire sont remplis. Pensez simplement au nombre de zones colorées que vous devrez créer et gérer dans votre texture si vous autorisez des combinaisons arbitraires de triplets de couleurs pour les sommets d'un triangle.

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