2011-09-20 18 views
10

मेरे पास अंक का एक सेट है और प्रत्येक के पास "प्रभाव" या अनिवार्य रूप से त्रिज्या का क्षेत्र है। मैं एक सरल परिपत्र रेखा के रूप में सभी बिंदुओं के लिए इन प्रभाव मंडलियों में से प्रत्येक को आकर्षित करने में सक्षम होना चाहता हूं।सर्कल को छेड़छाड़ करने की रेखाचित्र

वे ओवरलैप होंगे हालांकि मैं आकार के बाहर के बाहर खींचना चाहता हूं। मुझे पता है कि शायद मुझे काम करने की आवश्यकता होगी जहां वे छेड़छाड़ करते हैं और किसी भी तरह से आकर्षित करने के लिए कुल आकार बनाते हैं। समस्या यह है कि कुछ बिंदु दूसरों को भी छू नहीं सकते! इसलिए मुझे इसे भी काम करने में सक्षम होना चाहिए।

मैं वर्णन करने के लिए मैं बस क्या मतलब है की कोशिश की है:

enter image description here

ध्यान दें कि मैं बस काली रेखा, कोई भरण आकर्षित करने के लिए कामना करता हूं। ऐसा इसलिए है क्योंकि मैं पृष्ठभूमि छवियों और अन्य ज्यामिति को दिखाने के लिए चाहता हूं।

मैं इसे ओपनजीएल में कर रहा हूं, इसलिए सर्कल संभवतः जीएल_लाइनईएस या कुछ ऐसे घटकों के साथ बनायेगा जो घटता है लेकिन मुझे वास्तव में इस परिधि को कैसे काम करेगा इस बारे में कोई जानकारी नहीं है।

अगर किसी के पास कोई सलाह है या मुझे यह बता सकता है कि मैं इसे कैसे काम करने के बारे में सोच सकता हूं तो इसकी सराहना की जाएगी!

यह गणित प्रश्न का अधिक हो सकता है, मैं कोड के बिट्स की तलाश नहीं कर रहा हूं लेकिन वास्तव में इन आकृतियों को कैसे काम करने के बारे में जाना है। मैं बस यह नहीं सोच सकता कि इसे कैसे करें!

***** संपादित करें: समाधान के साथ मैं आया, उम्मीद है कि किसी और की मदद कर सकता है!

इसलिए मैंने सुझाए गए विचारों का उपयोग किया और मूल रूप से निर्णय लिया कि स्टैंसिल बफर का उपयोग करके आकर्षित करने का सबसे अच्छा तरीका होगा। इसका मतलब यह है कि मैं अपने बिंदुओं के माध्यम से 3 बार लूप करता हूं लेकिन मुझे वैसे भी दृश्यमान लोगों को खोजने के लिए उनमें से कुछ सावधानीपूर्वक छंटनी करने की ज़रूरत है।

तो कोड बुद्धिमान मैं अब इस राशि:

private void stencilCircleAroundStars() 
{ 
    //Lets try and draw something here using stencil 
    glColorMask(false, false, false, false); //Disable colour mask 
    glEnable(GL_STENCIL_TEST); // Enable Stencil Buffer For "marking" the outer circle 
    glDisable(GL_DEPTH_TEST);// Disable Depth Testing 

    for (Object value : stars.values()) 
    { 
     Star star = (Star)value; 

     glStencilFunc(GL_ALWAYS, 1, 1); // Always Passes, 1 Bit Plane, 1 As Mask 
     glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE); // We Set The Stencil Buffer To 1 Where We Draw Any Polygon 

     //Draw the large circle 
     starOb.location.copy(star.location); 
     starOb.setScale(2000); 
     starOb.draw(); 
    } 

    for (Object value : stars.values()) 
    { 
     Star star = (Star)value; 
     //Now we change the functions and remove a slightly smaller circle from buffer. 
     glStencilFunc(GL_ALWAYS, 0, 0); // Always passes, 0 bit plane, 0 as mask; 
     glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE); // We Set The Stencil Buffer To 0 Where We Draw Any Polygon 
     starOb.location.copy(star.location); 
     starOb.setScale(1900); 
     starOb.draw(); 
    } 

    //Now we enable the colour 
    glColorMask(true, true, true, true); 
    glStencilFunc(GL_EQUAL, 1, 1); // We Draw Only Where The Stencil Is 1 
    glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); // Don't Change The Stencil Buffer 

    glColor4f(0.5f, 1.0f, 0.5f, 0.5f); 
    for (Object value : stars.values()) 
    { 
     Star star = (Star)value; 
     starOb.location.copy(star.location); 
     starOb.setScale(2000); 
     starOb.draw(); 
    } 

    //Now we are done .. disable 
    glDisable(GL_STENCIL_TEST); 
} 

मेरे अंक सार संस्थाओं मेरा कार्यक्रम के उद्देश्य के लिए "सितारों" और StarOb मैं एक फ़ाइल जो फार्म से भरी हुई है quads का एक संग्रह है कहा जाता है में हैं एक अच्छा चिकनी सर्कल।

मैं एक बार के माध्यम से रंग मुखौटा और मैं पाश को निष्क्रिय सबसे बड़ा वृत्त स्टेंसिल बफर में मैं कर सकते हैं ड्राइंग और 1. मैं तो पाश आसपास फिर से स्टेंसिल बफर में छोटे बढ़ाया सर्कल ड्राइंग का एक मूल्य की स्थापना लेकिन इस बार एक की स्थापना, 0 का मान। यह किसी भी स्टार के चारों ओर एक सीमा छोड़ देना चाहिए जो अन्य सितारों को छू नहीं रहा है और प्रभावी रूप से हटाएगा जहां वे ओवरलैप करते हैं।

अंततः मैं रंग मुखौटा को फिर से सक्षम करता हूं और वास्तव में रंगीन मंडलियों को खींचता हूं। स्टैंसिल बफर अंदरूनी हिस्सों को प्रस्तुत करने से रोकता है और मुझे वह चाहिए जो मैं चाहता था! मैं फिर स्टैंसिल बफर अक्षम करता हूं।Video of it running

यह इस प्रकार से (पृष्ठभूमि जबकि परीक्षण तैयार नहीं किया गया था) बाहर आया था की एक कम गुणवत्ता संस्करण है:

तुम सच में इसे देखना चाहती थी, तो यहां अंक के कई बढ़ती मात्रा में पैदा करने की एक वीडियो है

Overlapping circles with centre not drawn due to stencil

उत्तर

6

सबसे पहले, कल्पना करें कि पृष्ठभूमि वहां नहीं थी। मुझे पूरा यकीन है कि आप यह जान लेंगे कि यह कैसे करना है, प्रत्येक सर्कल को खींचें, फिर अंदर की चाप को हटाने के लिए अपने अंदरूनी (एक भरे सर्कल में) खींचें।

अब एक छवि पर ऐसा करने के लिए, आप इन चीजों में से कोई भी कर सकते हैं। एक चीज जो आप कर सकते हैं वह रंग बफर पर लेखन अक्षम करना है, उस प्रक्रिया को करें और स्टैंसिल बफर को बदलें। फिर रंग बफर पर लेखन सक्षम करें और एक संपूर्ण स्क्रीन आयत खींचें जिसके परिणामस्वरूप स्टैंसिल बफर में चिह्नित पिक्सेल भर जाते हैं।

स्टैंसिल बफर आपके लिए उपयोगी नहीं हो सकता है हालांकि कुछ कारणों से, जैसे कि आप इसे किसी और चीज़ के लिए उपयोग कर रहे हैं। इस मामले में, एक ही विकल्प करना एक विकल्प होगा, लेकिन स्टैंसिल बफर में प्रतिपादन करने के बजाय, आप एक बनावट में प्रस्तुत करते हैं। फिर उस बनावट को बांधें और स्क्रीन पर एक आयत खींचें।

मैं काफी कुछ आप संचय बफर भी साथ इस लक्ष्य को हासिल कर सकता हूँ, लेकिन मैं यह कभी उपयोग नहीं किया तो मैं सच में नहीं बता सकता है (अगर किसी को भी इस बारे में जानता है, कृपया मेरा उत्तर संपादित करें और हमें बताएं कि)

+0

आपके सुझाव के लिए धन्यवाद, मैंने इसे स्टैंसिल बफर के साथ करने में कामयाब रहा है और मेरे समाधान के साथ अपने प्रश्न को अपडेट करने के लिए वापस आया है, जो कि आप सुझाव दे रहे थे। यकीन नहीं है कि मुझे अब किसको टिकना चाहिए! – iexus

+1

शायद हम दोनों को +1 दें? : डी – Shahbaz

+0

हो गया: डी मैंने यह दिखाने के लिए अपना प्रश्न अपडेट कर दिया है कि मैंने क्या समाप्त किया।क्या आप जिस तरह से सोच रहे थे? मैं opengl ज्ञान में थोड़ा कमी है .. – iexus

3

दो गुजरता:

  1. GL_LINES याके माध्यम से सभी अपने सर्कल की रूपरेखा ड्रा। सुनिश्चित करें कि आप अपना glLineWidth()3 या इससे अधिक सेट करें।
  2. ड्रा भरा हलकों (GL_TRIANGLE_STRIP उपयोगी हो सकता है) अपने "पृष्ठभूमि" रंग और कदम से हलकों के रूप में ही त्रिज्या के साथ 1.

चरण 2 में भरा हलकों चरण 1 से सभी रूपरेखा पिक्सल के ऊपर लिख देगा लेकिन केवल वे कहां ओवरलैप करते हैं। इससे आपको गैर-ओवरलैपिंग रूपरेखा बरकरार रहती है।

आप रूपरेखा चौड़ाई का एक व्यापक रेंज चाहते हैं (यानी, वे अधिक से अधिक ~ 10 कि ज्यादातर ओपन कार्यान्वयन glLineWidth() अनुमति देते हैं) आप एक बड़ा त्रिज्या के साथ छोड़कर चरण 1 में चरण 2 से भरा सर्कल रेंडरर पुनः उपयोग करना चाहिए।

+0

कारण मैं केवल रूपरेखा तैयार करना चाहता था, पृष्ठभूमि छवि (और विभिन्न परतों/पहले खींची गई इकाइयों) को दिखाने के लिए अनुमति देना था। अगर मैं उस पर छोड़ देता हूं तो यह पहला विकल्प होगा जो मैंने किया होगा! – iexus

+2

मैं ऊपर की प्रक्रिया का उपयोग करता हूं, लेकिन मंडलियों को स्टैंसिल बफर में खींचता हूं, और अपनी शेष ज्यामिति को चित्रित करते समय स्टैंसिल बफर परीक्षण सक्षम करता हूं। –

+0

आह मैं ईमानदार रहूंगा मैंने इसके बारे में सोचा नहीं था। मैं इससे बहुत परिचित नहीं हूं इसलिए मैं थोड़ा सा पढ़ूंगा। मुझे लगता है कि आप ऐसा कुछ करते हैं, बड़े सर्कल को एक निश्चित रंग/मूल्य को स्टैंसिल में खींचें और छोटे से स्टैंसिल में भी अलग-अलग करें। यदि मूल्य स्टैंसिल परीक्षण बड़ा वैल्यू है तो खंड को रंग दें और यदि नहीं तो कुछ भी नहीं करें? – iexus

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