2013-10-18 3 views
1

다음 코드를 사용하여 큐브에 스킨을 추가하려고하지만 스킨이 전혀 작동하지 않습니다. 나는 그것이 기본 큐브에 추가되는지를 테스트했다. (그러나 그것을 감싸는 대신에 각면에서 전체 이미지를 반복한다. 그래서 이것을 방지하기 위해 커스텀 큐브를 만들고있다.) 어떤 도움이라도 대단히 감사하겠습니다. 당신은 올바른 ... 나는 또한 등등 캡슐, 높이지도, 토러스, 같은 기본 모양을 만들고 주변에 연주되어있다javafx에서 사용자 정의 3D 큐브를 스키닝 ​​8

private void buildGraphics() 
{ 
    Image dieImage = new Image(getClass().getResourceAsStream("images/die.gif")); 

    PhongMaterial material = new PhongMaterial(); 
    material.setDiffuseMap(dieImage); 
    material.setSpecularColor(Color.RED); 

    float hw = 100/2f; 
    float hh = 100/2f; 
    float hd = 100/2f; 

    float points[] = 
     { 
      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 tex[] = 
     { 
      100, 0, 
      200, 0, 
      0, 100, 
      100, 100, 
      200, 100, 
      300, 100, 
      400, 100, 
      0, 200, 
      100, 200, 
      200, 200, 
      300, 200, 
      400, 200, 
      100, 300, 
      200, 300 
     }; 

    int faces[] = 
     { 
      0, 10, 2, 5, 1, 9, 
      2, 5, 3, 4, 1, 9, 
      4, 7, 5, 8, 6, 2, 
      6, 2, 5, 8, 7, 3, 
      0, 13, 1, 9, 4, 12, 
      4, 12, 1, 9, 5, 8, 
      2, 1, 6, 0, 3, 4, 
      3, 4, 6, 0, 7, 3, 
      0, 10, 4, 11, 2, 5, 
      2, 5, 4, 11, 6, 6, 
      1, 9, 3, 4, 5, 8, 
      5, 8, 3, 4, 7, 3 
     }; 

    TriangleMesh mesh = new TriangleMesh(); 
    mesh.getPoints().addAll(points); 
    mesh.getTexCoords().addAll(tex); 
    mesh.getFaces().addAll(faces); 

    MeshView box = new MeshView(mesh); 
    box.setMaterial(material); 

    graphicGroup.getChildren().add(box); 

    Box box2 = new Box(100, 100, 100); 
    box2.setTranslateX(150); 
    box2.setMaterial(material); 


    graphicGroup.getChildren().add(box2); 
    world.getChildren().add(graphicGroup); 
} 
+0

Oracles OTN의 PavelSafrata에서 내 질문에 대한 대답을 얻었으므로 텍스 코디는 비례해야합니다 ... –

+1

이 상황에서 텍스처 좌표는 다음과 같아야합니다 : 'code'float tex [] = { 0.25f , 0F, 0.5F, 0F, 0F, 0.33f, 0.25f, 0.33f, 0.5F, 0.33f, 0.75f, 0.33f, 1F, 0.33f, 0F, 0.66f, 0.25 f, 0.66f, 0.5f, 0.66f, 0.75f, 0.66f, 1f, 0.66f, 0.25f, 1f, 0.5f, 1f}; –

답변

0

...

texCoords

은 고통이지만 얼굴은 더 복잡한 모양을 할 때 더욱 고통 스럽습니다. 당신이 주석으로

는 texCoords 난 아직도 내 원환 내 texCoords을 알아낼 수 없었다

당신의 사각형 이미지의 0.0 (0 %) 사이의 값을 1.0 (100 %)해야합니다 ..

나는 여전히 TriangleMesh를 구축하기 위해 시스템을 없애야한다고 생각합니다.

를 Point3D가 포인트 []에 대한 완벽한 의미가 있습니다, 아직 그들이 플로트 [] ... texCoords와 같은 ... Point2D가 훨씬 더 잘 맞는 이럴 만들 것 사용 .. 얼굴이 [] 괜찮습니다 .. . 단순한 Integer []이므로 ...

그런 식으로 물건을 처리하는 SimpleMesh 클래스를 만들 수도 있습니다 ... 어쨌든, 당신이 알아 낸 것을 기쁘게 생각합니다.

+1

Java의 현재 [value objects] (http://openjdk.java.net/jeps/169)가 부족하다는 것은 Point3D (3 개의 이중 멤버 포함)와 같은 객체 배열을 사용하면 float 배열보다 훨씬 많은 메모리를 사용한다는 것을 의미합니다. , 현재 사용되고있는 것과 같이. 또, float 배열을, Point3D 객체의 배열을 필요로하는 경우와 같은 변환을 실시하는 것이 아니라, 하위 레이어 네이티브 렌더링 로직 (JNI 경유)에 직접 입력 할 가능성이 있습니다. Point3D 객체를 기반으로 작동하는 새로운 JavaFX API 레이어를 만들 수는 있지만 상대적으로 비효율적입니다. – jewelsea

+0

정보를 주셔서 감사합니다. 포인트를 만들기위한 Point3D (x, y, z) 또는 Vector3 (x, y, z)와 같은 클래스가 있다면 훨씬 더 좋을 것이라고 말하려고합니다. uv/texCoords에 대해 2d로 매핑되는 클래스는 FloatMap과 비슷합니다. for 루프가 더 쉽습니다. 당신이 정점을보고 마우스로 포인트를 추가 할 수있게 해주는 MeshMaker를 만드는 작업을 해왔습니다 ... – jdub1581

관련 문제