2017-10-17 31 views
2

Je travaille sur un maillage triangulaire pour lequel je dois colorier chaque vertext avec une couleur spécifique. J'ai suivi l'exemple fourni icijavafx 3d colorier chaque sommet en maille triangle avec couleur spécifique

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

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 de numColors, j'ai essayé la même chose pour mon ensemble de tableaux de couleurs spécifiques j'ai, la palette est créée mais les sommets ne sont pas colorés dans l'ordre que je voulais, Tout exemple sur ce serait vraiment aider, comment colorer chaque sommet dans un triangle maillage avec un ensemble de couleurs spécifiques fournis (pour chaque sommet) en cerant 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:

this is my output

et c'est le résultat attendu: and this is the expected output

+1

Pourriez-vous poster votre code en modifiant cette question? –

+1

Pouvez-vous également créer un lien vers "l'exemple fourni ici"? – jewelsea

+0

J'ai édité mon post pour ajouter l'exemple de code et le lien vers l'exemple. –

Répondre

1

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

  • Une image de texture, essentiellement une petite .png où chaque pixel a une couleur qui sera plus tard regardé.

Vous avez créé un, mais il semble que les couleurs sont distribués au hasard:

  • Une façon de cartographier les sommets du maillage à un pixel dans l'image.

Les visages dans votre maillage définissent les indices des points de , normals et textures. Par exemple, 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 cartographie (getTextureLocation), ces indices ont les coordonnées:

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

qui sont les couleurs:

Comme vous pouvez voir que ces sommets utilisent exactement cette couleur :

Face 0

Avec cette coloration aléatoire, pour chaque paire (x, y) à l'intérieur de la face 0, la texture est interpolée entre ces valeurs.

Vous pouvez vérifier cela en permettant PickResult sur la souris enfoncé:

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 en entre 55 et 80, il donne [x = 0.51, y = 0.71], qui devrait: {(0.9 + 0.1)/2, (0.6+0.8)/2)}. En d'autres termes, il passera de la couleur (55) à la couleur (80), utilisant toutes les couleurs dans cette gamme:

De toute évidence, ce n'est pas ce que vous voulez, mais il fait ce que tu lui as dit de faire.

L'astuce ici est d'avoir une texture avec un gradient 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:

second texture

Ce qui est plus proche de ce que vous vouloir, mais pas encore là.

La dernière astuce consiste à utiliser un mappage entre vos indices de texture, basés sur les sommets, en fonction d'une fonction mathématique. En utilisant une fonction f(x, y, z) basée sur les coordonnées de vertex, il devrait vous donner une valeur entre les couleurs minimum et maximum. Cette couleur a un index, et cet index est celui que vous devriez utiliser pour la texture.

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

Puisque dans votre cas, x va de 0 à 30, vous pouvez modifier la cartographie de l'emplacement de texture facilement:

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, en fonction du gradient je définissais:

final result

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

Références

Pour d'autres références, ont un oeil à FXyz3D library. Un groupe de formes 3D primitives est créé en utilisant une classe TexturedMesh qui permet de texturer un maillage avec des couleurs, un mappage 3D ou 1D et une coloration de face ou de motif.

+0

Merci pour l'exemple détaillé qui a beaucoup aidé. –

+0

Super. Pensez à marquer la réponse comme acceptée (cochez la case à gauche), afin qu'elle puisse être utile pour d'autres. –

0

Sans un examen 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 ce que vous attendez lorsque les triangles résultants du triangle sont remplis. Pensez simplement au nombre de zones colorées que vous auriez à 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

J'ai ajouté l'exemple de code et le lien vers l'exemple auquel je me référais. –

+0

J'ai également ajouté l'image de ma sortie actuelle et la sortie attendue. –