我正在研究一个三角形网格,我需要用特定颜色为每个椎体上色。我按照这里提供的示例
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);
}
}
这是我的输出:
这是预期的输出:
答案 0 :(得分:1)
正如你提到的问题所指出,你需要:
您已经创建了一个,但似乎颜色是随机分布的:
网格中的面定义了点,法线和纹理的索引。
即,您的面部0
为80, 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]
是颜色:
正如您所看到的,这些顶点正在使用这种颜色:
使用此随机着色,对于面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());
}
会给你这个形象:
,结果如下:
哪个更接近你想要的,但还没有。
最后一个技巧是使用基于顶点的纹理索引之间的映射,基于一些数学函数。
使用基于顶点坐标的函数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));
});
使用此结果,基于我定义的渐变:
现在由您来生成适当的纹理图像和纹理映射。
参考
如需进一步参考,请查看FXyz3D library。使用TexturedMesh
类创建一堆原始3D形状,允许使用颜色,3D或1D映射以及面或图案着色对网格进行纹理化。
答案 1 :(得分:0)
如果没有例子,很难说出错了什么。但我认为你无论如何都走错了路。问题是,当填充三角形网格的结果三角形时,您期望发生什么。如果您允许一个三角形的顶点的任意颜色三元组合,请考虑在纹理中创建和管理多少个彩色区域。