2011-02-23 21 views
5

तो मैं ओपनजीएल के साथ खेल रहा हूं और कुछ मज़ेदार आकृतियों को आकर्षित करने का तरीका जानने का प्रयास कर रहा हूं।ओपनजीएल ट्यूब पथ के साथ

अभी, मैं एक ट्यूब पर काम कर रहा हूं।

void tube(GLfloat radius, GLfloat segment_length) { 
    glPolygonMode(GL_BACK, GL_NONE); 
    glPolygonMode(GL_FRONT, GL_FILL); 

    glPushMatrix(); { 
     GLfloat z1 = 0.0; 
     GLfloat z2 = segment_length; 

     GLfloat y_offset = 0.0; 
     GLfloat y_change = 0.00; 

     int i = 0; 
     int j = 0; 
     for (j = 0; j < 20; j++) { 
      glPushMatrix(); { 
       glBegin(GL_TRIANGLE_STRIP); { 
        for (i = 360; i >= 0; i--) { 
         GLfloat theta = i * pi/180; 
         GLfloat x = radius * cos(theta); 
         GLfloat y = radius * sin(theta) + y_offset; 

         glVertex3f(x, y, z1); 
         glVertex3f(x, y, z2); 
        } 
       } glEnd(); 
      } glPopMatrix(); 

      // attach the front of the next segment to the back of the previous 
      z1 = z2; 
      z2 += segment_length; 

      // make some other adjustments 
      y_offset += y_change; 
     } 
    } glPopMatrix(); 
} 

हालांकि, मैं पता लगा नहीं है कि कैसे ट्यूब एक सर्पिल, या यहाँ तक कि एक साधारण लाइन की तरह किसी भी पूर्वनिर्धारित मार्ग का अनुसरण करने के लिए: मैं एक सीधे ट्यूब के साथ ठीक आकर्षित कर सकते हैं। यदि आप y_change को 0.01 जैसे कुछ में बदलते हैं, तो यह प्रत्येक ट्यूब सेगमेंट को y दिशा में अतिरिक्त 0.01 ऑफ़सेट करेगा। वह महान है, लेकिन मैं उस दिशा में प्रत्येक खंड बिंदु कैसे बना सकता हूं? दूसरे शब्दों में, अभी, प्रत्येक खंड खींचा गया है ताकि वे सभी एक ही दिशा का सामना कर सकें, और दिशा ट्यूब की दिशा नहीं है (चूंकि y_change = 0.01 के साथ, दिशा थोड़ा "ऊपर" है)।

मुझे यकीन नहीं है कि कैसे आगे बढ़ना है। मैंने पिछले सेगमेंट और वर्तमान के बीच वेक्टर प्राप्त करके वैक्टर के साथ खेला है, लेकिन मुझे सच में यकीन नहीं है कि इसके साथ क्या करना है।

+1

आप लाल किताब के फूल की कुर्सी उदाहरण (एक उदाहरण के लिए) को देखा है? http://www.opengl.org/resources/code/samples/redbook/torus.c –

उत्तर

17

विचार को पथ नियंत्रित एक्सट्रूज़न कहा जाता है, यानी आपके पास मूल एन आयामी आकार है और इसे एन + 1 आयामी वक्र के साथ निकाला जाता है। मैं तुम्हारा चेहरा पढ़ सकता हूं: "हू, वह क्या कह रहा है?"

तो यहां एक मोटे रूपरेखा है। सबसे पहले आपको एक ऐसे फ़ंक्शन की आवश्यकता होती है जो एक मूल्य को मैप करती है, जिसे आमतौर पर टी में कहा जाता है, एक निरंतर, अंतरिक्ष में चिकनी वक्र के लिए। उदाहरण के लिए एक पेंच:

path(t): R → R³, t ↦ (a·sin(k·t), b·cos(k·t), c·t) 

विचार है, उस मार्ग के संबंध में आपके कोने पदों को परिभाषित करने के एक स्थानीय समन्वय आधार खोजने के लिए - यह समझ में आता है, कि समन्वय से एक पथ के समानांतर में गठबंधन है, तो आप इसे टेंगेंट खोजना चाहते हैं। वक्र की बात t पर

tangent(t): R → R³, t ↦ (k·a·cos(k·t), -k·b·sin(k·t), c) = d/dt path(t) 

तो यह स्थानीय आधार वेक्टर कि वक्र के सहारे की ओर इशारा करते है, स्थानीय समन्वय प्रणाली के मूल के साथ: यह अपनी ढाल पाने के द्वारा किया जाता है।

लेकिन हमें पूर्ण 3 डी आधार बनाने के लिए दो अन्य वैक्टरों की आवश्यकता है।

normal(t): R → R³, t ↦ (-k²·a·sin(k·t), -k²·b·cos(k·t), 0) = d/dt tangent(t) = d²/dt² path(t) 

यह सामान्य कहा जाता है: यह आमतौर पर वक्रता करने के लिए खड़ा दूसरा आधार बिंदु है जिस पर आप स्पर्श की कर्ल का पता लगाकर प्राप्त एक अच्छा विकल्प है।

थर्ड बेस वेक्टर प्राप्त किया जा सकता है, सामान्य और स्पर्शक के क्रॉस उत्पाद को लेना, बिनोर्मल प्रदान करना। मैं आपको एक व्यायाम के रूप में समझने दूँगा।

अब वक्र के साथ एक आकार निकालने के लिए, आपको पथ को विभाजित करने के लिए t को फिर से सेट करके विभाजित करना होगा, जिससे आप स्थानीय मूल दे सकते हैं। आपके निकाले गए आकार के बिंदु इस मूल पथ (टी) के सापेक्ष हैं। मान लें कि आपका आकार अंक एक्स-y विमान तो में P_n के होते हैं:

for t in [k..l]: 
    for p in P_n: 
     yield_vertex(path(t).x + binormal(t).x * p.x, 
         path(t).y + normal(t).y * p.y, 
         path(t).z) 

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

+1

+1: उत्कृष्ट उत्तर। यदि आप टुकड़े के अनुसार रैखिक कार्य में रूचि रखते हैं, तो आप टेंगेंट को v (n) (अंतिम बिंदु से वेक्टर) के औसत के रूप में पा सकते हैं और v (n + 1) (इस बिंदु से वेक्टर अगले एक के लिए)। –

+0

कमाल, इस उत्तर के लिए धन्यवाद। मैं इस के माध्यम से काम करने में कुछ समय बिताने जा रहा हूं। मैं आपको बता दूंगा कि मैं कौन सी प्रगति करता हूं (हालांकि स्कूल और काम मेरे कुछ मनोरंजन समय का उपभोग कर सकता है जिसे मैंने इसके लिए अलग किया है)। – gregghz

+0

हाँ, मुझे डर है कि मेरे गणित कौशल इस तक नहीं हैं (समस्या का हिस्सा यह हो सकता है कि मैं पूरी तरह से आपके नोटेशन को समझ नहीं पा रहा हूं)। मैं ओपनजीएल में इसका अनुवाद नहीं कर सकता, ऐसा लगता है कि मैं क्या करता हूं, ट्यूब खंड हमेशा एक दिशा का सामना करते हैं। – gregghz

1

इसे previously-solved problem पर कम करें।

+0

जीएलई एक्सट्रूज़न लाइब्रेरी थोड़ी पुरानी है, कुछ कीड़े हैं, और कुछ पुनर्विक्रय की आवश्यकता है। – sancelot

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