2017-11-07 8 views
2

javafx에서 각 메쉬면을 4 점으로 표시해야합니다. fxyz library에서 삼각형 메쉬 예제를 시도했지만 사각형이 어떻게 작동하는지 모를 수 있습니다. javafx에서 예제를 가리킬 수 있습니까? 사변형 메쉬의 경우.Javafx 사변형 메쉬

답변

2

OpenJFX repository에서 사용할 수있는 3DViewer 프로젝트에는 이미 PolygonalMeshimplementation이 포함되어있어 얼굴 당 여러 개의 점을 허용하므로 모든 다각형이 얼굴이 될 수 있습니다.

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

PolygonMesh of triangles

을하지만을 우리가 결합하는 경우 프리즘의 같은면에있는면의 삼각형, 우리는 쉽게 quadrilate를 생성 할 수 있습니다. 랠 얼굴. pointstexCoords는 동일하게 유지한다는 참고

로 사용될
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)); 
    ... 
} 

가 예상 결과주는 : 그

PolygonMesh of quadrilaterals

참고이 샘플 각 얼굴 포인트와 텍스처 인덱스를 사용하고 있지만 일반 인덱스를 추가 할 수도 있습니다.

+0

항상 감사드립니다. –