2017-12-13 92 views
5

मैंने इस question का अध्ययन किया, लेकिन मुझे अभी भी यह नहीं मिला है। नीचे दिया गया सबसे छोटा संभव कोड Pyramid पूरी तरह से ग्रे दिखाता है, जबकि मैं pyramid विभिन्न रंगों को बनाने के लिए 6 triangles देने का प्रयास करता हूं। तो ... ये रंग क्यों नहीं दिखते?जावाएफएक्स 3 डी रंग चेहरे ... फिर

ध्यान दें कि मैंने उस प्रश्न से getTexCoords().addAll(..) कथन उधार लिया है, लेकिन स्पष्ट रूप से मैं अभी भी कुछ गलत कर रहा हूं। क्या यह uv mapping है? वैसे भी क्या है? मैंने एक स्थलीय स्पष्टीकरण देखा है (sphere < ->map), लेकिन यह बनावट/रंगों के साथ क्या करना है ...?

आपकी मदद की सराहना - माइकल

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

बीटीडब्ल्यू, जिस व्यक्ति ने मुझे अपने पाठ में कोड बिट्स 'हाइलाइट' की सिफारिश की है: मैं यह कैसे कर सकता हूं? धन्यवाद ... –

उत्तर

4

को समझने के लिए कैसे JavaFX 3 डी किसी भी 3 डी आकार का रंग परिभाषित करता है, PhongMaterialjavadoc पर एक नजर है (बोल्ड मेरा है):

PhongMaterial कक्षा गुणों की परिभाषा प्रदान करता है जो फोंग छायांकित सामग्री का प्रतिनिधित्व करते हैं। यह मेष की सतह के साथ प्रकाश की बातचीत का वर्णन करता है, इसे लागू किया जाता है। फोंगमटेरियल एक परिवेश और एक विशिष्ट रोशनी के साथ एक फैलाव और specular घटक के मामले में प्रकाश को दर्शाता है। एक ज्यामितीय सतह पर एक बिंदु का रंग इन चार घटकों के गणितीय कार्य है।

इसका मतलब है कि आपको पहले स्थान पर सामग्री की आपूर्ति करने की आवश्यकता है, और फिर आपको उन घटकों में से किसी एक को निर्दिष्ट करने की आवश्यकता है, उदाहरण के लिए प्रसार घटक।

आप उद्धृत question से चित्र को कॉपी करते हैं:

palette

और इसके साथ एक सामग्री उदाहरण बनाने के लिए:

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

आप देख सकते हैं कि इस छवि के लिए रंग लागू करने के लिए प्रयोग किया जाता है आपका पिरामिड:

textured pyramid

यदि आप चेहरों के लिए बनावट सूचकांक संशोधित करते हैं, तो आपको बनावट निर्देशांक के आधार पर अलग-अलग रंग मिलेंगे।

इसके बारे में और जानने के लिए, आप FXyz3D library पर एक नज़र डाल सकते हैं, जो इस अवधारणा में आधारित TexturedMesh कक्षा प्रदान करता है। वहां आपको कई अलग-अलग 3 डी आकार "बनावट" प्राइमेटिव मिलेगा, जो विभिन्न बनावट "मोड" का उपयोग कर सकते हैं। उन तरीकों में से अधिकांश को एक छवि की भी आवश्यकता नहीं होती है, क्योंकि यह आंतरिक रूप से बनाया जाता है। यह गणितीय कार्यों के आधार पर उदाहरण रंग ग्रेडियेंट बनाने की अनुमति देता है।

यह एक TetrahedraMesh का एक उदाहरण, घनत्व नक्शा परिभाषित करने के लिए एक 3 डी समारोह का उपयोग करता है कि है:

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

TetrahedraMesh

+0

जोस, बहुत धन्यवाद - मुझे यह उपयोग करने के लिए काम करने के लिए मिला। पीएनजी फ़ाइल। मैं अभी भी चिंतित हूं कि आप रंगीन सरणी में इंडेक्स नहीं कर सकते हैं (जैसा कि प्रभावी रूप से वह है .png फ़ाइल एक चौराहे के रास्ते में है, लेकिन ... मुझे और आगे मिला, इसलिए धन्यवाद! –

+0

जावाएफएक्स 3 डी सामान्य बुनियादी कार्यान्वयन में प्रदान करता है। लेकिन उनको आसानी से बढ़ाया जा सकता है। हमने FXyz3D के साथ ऐसा किया है। किसी भी नए विचारों के साथ योगदान करने के लिए आपका स्वागत है। और यदि उत्तर आपके लिए काम करता है, तो कृपया इसे स्वीकार के रूप में चिह्नित करें, इसलिए यह दूसरों के लिए भी सहायक होगा। –

+0

मैं ' FXyz3D पर एक नज़र डालेंगे (एक चुनौतीपूर्ण पैकेज की तरह दिखता है! ;-) –

संबंधित मुद्दे