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

问题描述:

Iam工作在三角形网格上,我需要用特定颜色为每个vertext着色。我跟着这里的例子提供javafx 3d为特定颜色的三角形网格中的每个顶点着色

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

这帮助了很多,但我坚持tecturing顶点,上面的例子描述了通过创建从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

+1

你能通过编辑这个问题发布你的代码吗? –

+1

你还可以链接到“这里提供的例子”吗? – jewelsea

+0

我编辑了我的帖子,添加了示例代码和链接。 –

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

  • 纹理图像,基本上是一个小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映射以及面部或图案着色来对网格进行纹理化。

+0

谢谢你提供了很多帮助的详细例子。 –

+0

太好了。考虑将答案标记为已接受(在左侧打勾),因此它对其他人也有用。 –

没有考试很难说出错的是什么。但我认为你无论如何都处在错误的轨道上。问题是当三角形网格的结果三角形被填充时,你期望发生什么。只要想想如果允许任意组合一个三角形顶点的颜色三元组,就可以在纹理中创建和管理多少个颜色区域。

+0

我已经添加了示例代码以及我引用的示例链接。 –

+0

我还添加了当前输出和预期输出的图像。 –