javafx 3d用特定颜色着色三角形网格中的每个顶点

时间:2017-10-17 05:01:19

标签: javafx javafx-8 javafx-3d

我正在研究一个三角形网格,我需要用特定颜色为每个椎体上色。我按照这里提供的示例

Using texture for triangle mesh without having to read/write an image file

这有很多帮助,但是我坚持用顶点来构造,上面的例子描述了通过从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);
    }

}

这是我的输出:

this is my output

这是预期的输出: and this is the expected output

2 个答案:

答案 0 :(得分:1)

正如你提到的问题所指出,你需要:

  • 纹理图像,基本上是一个小png,其中每个像素都有一个稍后会被查找的颜色。

您已经创建了一个,但似乎颜色是随机分布的:

  • 将网格顶点映射到图像中的像素的方法。

网格中的面定义了法线纹理的索引。

即,您的面部080, 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]

是颜色:

正如您所看到的,这些顶点正在使用这种颜色:

Face 0

使用此随机着色,对于面0中的每对(x,y),纹理在这些值之间插值

您可以通过在鼠标按下时启用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());
}

会给你这个形象:

,结果如下:

second texture

哪个更接近你想要的,但还没有。

最后一个技巧是使用基于顶点的纹理索引之间的映射,基于一些数学函数。

使用基于顶点坐标的函数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));
            });    

使用此结果,基于我定义的渐变:

final result

现在由您来生成适当的纹理图像和纹理映射。

参考

如需进一步参考,请查看FXyz3D library。使用TexturedMesh类创建一堆原始3D形状,允许使用颜色,3D或1D映射以及面或图案着色对网格进行纹理化。

答案 1 :(得分:0)

如果没有例子,很难说出错了什么。但我认为你无论如何都走错了路。问题是,当填充三角形网格的结果三角形时,您期望发生什么。如果您允许一个三角形的顶点的任意颜色三元组合,请考虑在纹理中创建和管理多少个彩色区域。