2017-10-17 4 views
2

각 정점을 특정 색상으로 채색해야하는 삼각형 메쉬에서 작업하고 있습니다. 나는 예를 들어 여기에 많은 도움 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

샘플 코드와 링크를 예제에 추가하기 위해 내 게시물을 편집했습니다. –

답변

1

으로는 당신이 언급 한 문제의 지적이 필요합니다

  • 텍스처 이미지, 각 픽셀 이상이어야 고개됩니다 색상을 가지고 기본적으로 작은 PNG를.

가 당신은 하나를 만들었습니다,하지만 색상이 무작위로 배포됩니다 보인다

  • 이미지의 픽셀에 메쉬의 정점을지도 할 수있는 방법을. 메시의

얼굴은 , 법선텍스처의 인덱스를 정의합니다.

즉, 080, 80, 80, 55, 55, 55, 56, 56, 56이고, 이는 텍스쳐 인덱스가 80, 55, 56임을 의미합니다.이러한 정점이 정확하게 색상을 사용하고 있는지 당신이 볼 수 있듯이

: 색상입니다

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

:

은 당신의 매핑 (getTextureLocation)에 따르면,이 지수는 좌표가 :

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

분명히

, 이것은 당신이 원하는 것은 아니지만하고있다 : 즉, 그 범위에 모든 색상을 사용하여 색상 (80)에 컬러 (55), 에서 이동합니다 당신이 말한대로해야합니다.

여기서 트릭은 색상의 선형 그래디언트가있는 텍스처이므로 보간이 완료되면 차이가 작습니다. 예를 들어

이 :

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 30 0에서 간다, 당신은 쉽게 질감 위치 매핑을 조정할 수 있습니다

final result

: 나는 정의 기울기에 따라이 결과에

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

을,

이제 적절한 텍스처 이미지와 텍스처 매핑을 생성하는 것은 여러분에게 달려 있습니다.

참조 추가 참조의

는 FXyz3D library를 보라. 원시적 인 3D 도형은 TexturedMesh 클래스를 사용하여 생성됩니다.이 클래스를 사용하면 색상, 3D 또는 1D 매핑,면 또는 패턴 채우기로 텍스처를 만들 수 있습니다.

+0

많은 도움을 주신 상세한 사례를 가져 주셔서 감사합니다. –

+0

좋아요. 그 답을 받아 들일 수있는 것으로 표시하고 (왼쪽 눈금), 다른 사람들에게도 유용 할 수 있습니다. –

0

그게 잘못 될지 말하기는 어렵습니다. 하지만 어쨌든 당신이 잘못된 길을 가고 있다고 생각합니다. 질문은 삼각형 메쉬의 결과 삼각형이 채워질 때 발생할 것으로 예상되는 것입니다. 하나의 삼각형의 꼭지점에 대해 색상 삼중 조합을 임의로 조합 할 수 있다면 텍스처에서 만들고 관리해야 할 색상 영역의 수를 생각해보십시오.

+0

샘플 코드를 추가했으며 참조했던 예제에 대한 링크도 추가했습니다. –

+0

나는 나의 현재 출력과 예상 출력의 이미지도 추가했다. –