2017-12-13 23 views
5

나는이 question을 공부했지만, 아직 이해가 가지 않습니다. 가능한 가장 짧은 코드는 Pyramid이 완전히 회색 인 반면, 나는 pyramid 다른 색을 구성하는 6을 제공하려고 시도합니다. 그래서 ... 왜이 색들이 나타나지 않는 걸까요?JavaFX 3D 컬러링 얼굴 ... 다시

나는이 질문에서 getTexCoords().addAll(..) 명세서를 빌 렸지만 분명히 여전히 잘못된 것을하고있다. uv mapping입니까? 어쨌든 그게 뭐야? 토폴로지 설명 (sphere < ->map)을 보았지만 텍스처/색상과 관련이 있습니다 ...?

당신의 도움을 주셔서 감사합니다 - 마이클 PhongMaterialjavadoc 한 번 봐 가지고, 자바 FX 3D는 주어진 3 차원 형상의 색상을 정의하는 방법을 이해하기 위해

public class ColoredPyramid extends Application { 
    public void start(Stage primaryStage) { 
     Group root = new Group(); 
     Scene scene = new Scene(root, 200, 200, true); 
     primaryStage.setTitle("Colored Pyramid"); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 

     TriangleMesh colouredPyramid = new TriangleMesh(); 
     float height = 100; 
     float hypotenuse = 150; 
     colouredPyramid.getPoints().addAll(0, 0, 0); //0-index:: top 
     colouredPyramid.getPoints().addAll(0, height, -hypotenuse/2); //1-index:: x=0, z=-hyp/2 ==> Closest to user 
     colouredPyramid.getPoints().addAll(-hypotenuse/2, height, 0); //2-index:: x=hyp/2, z=0 ==> Leftest 
     colouredPyramid.getPoints().addAll(hypotenuse/2, height, 0); //3-index:: x=hyp/2, z=0 ==> rightest 
     colouredPyramid.getPoints().addAll(0, height, hypotenuse/2); ////4-index:: x=0, z=hyp/2 ==> Furthest from user 

     //Next statement copied from stackoverflow.com/questions/26831871/coloring-individual-triangles-in-a-triangle-mesh-on-javafx 
     colouredPyramid.getTexCoords().addAll(
      0.1f, 0.5f, // 0 red 
      0.3f, 0.5f, // 1 green 
      0.5f, 0.5f, // 2 blue 
      0.7f, 0.5f, // 3 yellow 
      0.9f, 0.5f // 4 orange 
     ); 

     colouredPyramid.getFaces().addAll(0, 0, 2, 0, 1, 0); //Left front face ---> RED 
     colouredPyramid.getFaces().addAll(0, 1, 1, 1, 3, 1); //Right front face ---> GREEN 
     colouredPyramid.getFaces().addAll(0, 2, 3, 2, 4, 2); //Right back face ---> BLUE 
     colouredPyramid.getFaces().addAll(0, 3, 4, 3, 2, 3); //Left back face ---> RED 
     colouredPyramid.getFaces().addAll(4, 4, 1, 4, 2, 4); //Base: left triangle face ---> YELLOW 
     colouredPyramid.getFaces().addAll(4, 0, 3, 0, 1, 0); //Base: right triangle face ---> ORANGE 

     MeshView meshView = new MeshView(colouredPyramid); 
     Group group = new Group(meshView); 
     group.setTranslateX(100); 
     group.setTranslateY(80); 
     root.getChildren().add(group); 
    } 

    public static void main(String[] args) { 
     launch(args); 
    } 
} 
+1

당신이 대답해야 할 첫 번째 질문 : 어디 이미지가 당신 것입니다 텍스처로 적용할까요? 설정 한 텍스처 좌표가 해당 이미지를 조사합니다. 힌트 : 이미지가 필요하고 물질 확산 맵을 설정해야합니다. –

+0

호세 감사합니다.하지만 ... 당신을 이해하지 못합니다. 버텍스를 텍스처에 매핑하는 데 이미지가 필요한 이유는 무엇입니까? –

+0

Btw, 내 텍스트의 코드 비트를 '강조 표시'하는 사람에게 : 어떻게해야합니까? 감사합니다 ... –

답변

4

(굵게은 내 꺼야) :

PhongMaterial 클래스는 Phong 음영 처리 된 자료를 나타내는 속성의 정의를 제공합니다. 빛이 적용된 메쉬의 표면과 빛의 상호 작용을 설명합니다. PhongMaterial은 주변 및 자기 조명 용어와 함께 확산 및 경면 구성 요소 측면에서 빛을 반사합니다. 기하학 서페이스상의 한 점의 색은이 네 가지 구성 요소 인의 수학적 기능입니다.

즉, 먼저 재료를 공급해야하며 그런 다음 이러한 구성 요소 중 하나를 지정해야합니다 (예 : 확산 부품). 당신이 인용 question의 이미지 복사하는 경우

:

palette

을하고 그것으로 재료 인스턴스를 생성 :

PhongMaterial material = new PhongMaterial(); 
material.setDiffuseMap(new Image(getClass().getResourceAsStream("bB2jV.png"))); 
meshView.setMaterial(material); 

당신이 이미지에 색상을 적용하는 데 사용되는 것을 볼 수 있습니다 피라미드 :

textured pyramid

면의 텍스처 인덱스를 수정하면 텍스처 좌표를 기준으로 다른 색상이 나타납니다.

자세한 내용은 FXyz3D library을 참조하십시오.이 글꼴은이 개념을 기반으로 TexturedMesh 클래스를 제공합니다. 여기서 다양한 텍스처 "모드"를 사용할 수있는 다양한 3D 모양의 "텍스처 된"프리미티브를 찾을 수 있습니다. 대부분의 모드는 내부적으로 만들어지기 때문에 이미지가 필요하지 않습니다. 이를 통해 예를 들어 수학 함수를 기반으로 한 색상 그라디언트를 만들 수 있습니다.

은 밀도 맵을 정의하기 위해 3D 기능을 사용하게하는 TetrahedraMesh의 예입니다 :

TetrahedraMesh tetra = new TetrahedraMesh(10, 5, null); 
tetra.setTextureModeVertices3D(1530, p -> p.magnitude()); 

TetrahedraMesh

+0

호세, 많은 감사합니다. png 파일. 여전히 색상 배열에 색인을 생성 할 수 없다는 사실에 당황 스럽습니다. (실제로는 .png 파일이 로터리 방식으로 작동하지만 실제로는 ... 감사합니다. –

+0

JavaFX 3D는 일반적으로 기본 구현을 제공합니다. FXyz3D를 통해 우리가 한 것입니다. 누구나 새로운 아이디어를 제공 할 수 있으며, 답변이 도움이된다면 받아 들일 수있는 것으로 표시하여 다른 사람들에게도 도움이 될 것입니다. –

+0

' FXyz3D를 보게 될 것입니다. (웃기는 패키지처럼 보입니다!) –