javafx에서 각 메쉬면을 4 점으로 표시해야합니다. fxyz library에서 삼각형 메쉬 예제를 시도했지만 사각형이 어떻게 작동하는지 모를 수 있습니다. javafx에서 예제를 가리킬 수 있습니까? 사변형 메쉬의 경우.Javafx 사변형 메쉬
2
A
답변
2
OpenJFX repository에서 사용할 수있는 3DViewer 프로젝트에는 이미 PolygonalMesh
implementation이 포함되어있어 얼굴 당 여러 개의 점을 허용하므로 모든 다각형이 얼굴이 될 수 있습니다.
MeshView
대신 PolygonMeshView
에서 메쉬 구현을 사용할 수 있습니다.
삼각형이 유효한 다각형이기 때문에 TriangleMesh
은 쉽게 PolygonMesh
으로 사용할 수 있습니다.
private PolygonMesh getTriangleMesh(float width, float height, float depth) {
float L = 2f * width + 2f * depth;
float H = height + 2f * depth;
float hw = width/2f, hh = height/2f, hd = depth/2f;
float[] points = new float[] {
hw, hh, hd, hw, hh, -hd,
hw, -hh, hd, hw, -hh, -hd,
-hw, hh, hd, -hw, hh, -hd,
-hw, -hh, hd, -hw, -hh, -hd
};
float[] texCoords = new float[] {
depth/L, 0f, (depth + width)/L, 0f,
0f, depth/H, depth/L, depth/H,
(depth + width)/L, depth/H, (2f * depth + width)/L, depth/H,
1f, depth/H, 0f, (depth + height)/H,
depth/L, (depth + height)/H, (depth + width)/L, (depth + height)/H,
(2f * depth + width)/L, (depth + height)/H, 1f, (depth + height)/H,
depth/L, 1f, (depth + width)/L, 1f
};
int[][] faces = new int[][] {
{0, 8, 2, 3, 1, 7}, {2, 3, 3, 2, 1, 7},
{4, 9, 5, 10, 6, 4}, {6, 4, 5, 10, 7, 5},
{0, 8, 1, 12, 4, 9}, {4, 9, 1, 12, 5, 13},
{2, 3, 6, 4, 3, 0}, {3, 0, 6, 4, 7, 1},
{0, 8, 4, 9, 2, 3}, {2, 3, 4, 9, 6, 4},
{1, 11, 3, 6, 5, 10}, {5, 10, 3, 6, 7, 5}
};
int[] smooth = new int[] {
1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6
};
PolygonMesh mesh = new PolygonMesh(points, texCoords, faces);
mesh.getFaceSmoothingGroups().addAll(smooth);
return mesh;
}
이것은 다음과 같은 결과 제공 : 예를 들어
는 FXyz library에서 CuboidMesh
는 가정 다음 구현 PolygonMesh
가
private double mouseOldX, mouseOldY = 0;
private final Rotate rotateX = new Rotate(0, Rotate.X_AXIS);
private final Rotate rotateY = new Rotate(0, Rotate.Y_AXIS);
@Override
public void start(Stage primaryStage) {
PolygonMeshView meshView = new PolygonMeshView(getTriangleMesh(100, 150, 200));
meshView.setDrawMode(DrawMode.LINE);
meshView.setCullFace(CullFace.NONE);
meshView.setMaterial(new PhongMaterial(Color.LIGHTYELLOW));
Scene scene = new Scene(new Group(meshView), 500, 300, true, SceneAntialiasing.BALANCED);
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();
});
PerspectiveCamera camera = new PerspectiveCamera(false);
camera.setNearClip(0.1);
camera.setFarClip(10000.0);
camera.getTransforms().addAll(rotateX, rotateY, new Translate(-250, -150, 0));
scene.setCamera(camera);
primaryStage.setTitle("Hello World!");
primaryStage.setScene(scene);
primaryStage.show();
}
을하지만을 우리가 결합하는 경우 프리즘의 같은면에있는면의 삼각형, 우리는 쉽게 quadrilate를 생성 할 수 있습니다. 랠 얼굴. points
및 texCoords
는 동일하게 유지한다는 참고
private PolygonMesh getQuadrilateralMesh(float width, float height, float depth) {
float L = 2f * width + 2f * depth;
float H = height + 2f * depth;
float hw = width/2f, hh = height/2f, hd = depth/2f;
float[] points = new float[] {
hw, hh, hd, hw, hh, -hd,
hw, -hh, hd, hw, -hh, -hd,
-hw, hh, hd, -hw, hh, -hd,
-hw, -hh, hd, -hw, -hh, -hd
};
float[] texCoords = new float[] {
depth/L, 0f, (depth + width)/L, 0f,
0f, depth/H, depth/L, depth/H,
(depth + width)/L, depth/H, (2f * depth + width)/L, depth/H,
1f, depth/H, 0f, (depth + height)/H,
depth/L, (depth + height)/H, (depth + width)/L, (depth + height)/H,
(2f * depth + width)/L, (depth + height)/H, 1f, (depth + height)/H,
depth/L, 1f, (depth + width)/L, 1f
};
int[][] faces = new int[][] {
{0, 8, 2, 3, 3, 2, 1, 7},
{4, 9, 5, 10, 7, 5, 6, 4},
{0, 8, 1, 12, 5, 13, 4, 9},
{2, 3, 6, 4, 7, 1, 3, 0},
{0, 8, 4, 9, 6, 4, 2, 3},
{1, 11, 3, 6, 7, 5, 5, 10}
};
int[] smooth = new int[] {
1, 2, 3, 4, 5, 6
};
PolygonMesh mesh = new PolygonMesh(points, texCoords, faces);
mesh.getFaceSmoothingGroups().addAll(smooth);
return mesh;
}
:
@Override
public void start(Stage primaryStage) {
PolygonMeshView meshView = new PolygonMeshView(getQuadrilateralMesh(100, 150, 200));
...
}
가 예상 결과주는 : 그
참고이 샘플 각 얼굴 포인트와 텍스처 인덱스를 사용하고 있지만 일반 인덱스를 추가 할 수도 있습니다.
항상 감사드립니다. –