2011-03-31 19 views
18

ठीक है,मैं WebGL में एक वस्तु कैसे चेतन कर सकते हैं

मैं 3 डी ग्राफिक्स के लिए नया हूँ और मैं एक मॉडल (नहीं पूरे मॉडल बदल देती है) में अलग-अलग विशिष्ट कोने चेतन करना चाहते हैं (विशिष्ट कोने नहीं पूर्ण रूपांतरण संशोधित) । मेरी लिपि काफी हद तक एनईएचई वेबग्ल ट्यूटोरियल पर आधारित है। इस ट्यूटोरियल में सभी ऑब्जेक्ट शिखर एक बफर में संग्रहीत होते हैं, जिसे प्रोग्राम पहली बार चलाने पर एक बार शुरू किया जाता है। यहाँ प्रवर्तन कोड है: * नोट कोने कोने

vertexBuffer = gl.createBuffer(); 
gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer); 
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices), gl.STATIC_DRAW); 
vertexBuffer.itemSize = 3; 
vertexBuffer.numItems = parseInt(vertices.length/vertexBuffer.itemSize); 

अब क्योंकि इन शुरू में प्रारंभ कर रहे हैं, जाहिर है कोने सरणी बदल रहा है कोई कार्य नहीं करेगा की एक सरणी में शामिल है। तो मैं सोच रहा था कि रीयल-टाइम में कोष्ठकों को संशोधित करने का सबसे अच्छा तरीका कैसा है, जबकि यह अभी भी आसानी से चलाने के लिए पर्याप्त कुशल रखता है।

क्या बफर को किसी भी तरह से पुनर्जीवित करना संभव है जैसे प्रत्येक एनीमेशन टिक पर इस कोड को फिर से चलाएं?

gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer); 
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices), gl.STATIC_DRAW); 

चीयर्स, जम्मू

उत्तर

45

शुद्ध के माध्यम से खुदाई की एक पूरी बहुत कुछ के बाद ठीक है। मैंने पाया है कि निम्नलिखित परिवर्तन किए जाने चाहिए; सबसे पहले, आपको वर्टेक्स सरणी बफर गतिशील बनाना होगा। यह गणनाकर्ता 'gl.DYNAMIC_DRAW' का उपयोग करके संभव हो गया है, जहां पहले अधिकांश ट्यूटोरियल में हमारे पास 'gl.STATIC_DRAW' है। निम्नलिखित में जिसके परिणामस्वरूप:

gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices), gl.DYNAMIC_DRAW); 

दूसरा परिवर्तन (या टिकटिक, या एनीमेशन) समारोह अपने पाश में शुरू हो रहा होना चाहिए। सरणी को अद्यतन करने के लिए एक नया फ़ंक्शन कॉल किया जाता है। आप offcourse पहले पिछले गतिशील सरणी बफर पहले से आबद्ध करना होगा:

gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer); 

तो इस के बाद आप पुराने कोने निम्नलिखित समारोह के साथ अद्यतन:

gl.bufferSubData(gl.ARRAY_BUFFER, 0, new Float32Array(vertices)); 

कहाँ मापदंडों < buffer_type हैं>, < array_offset> , < new_data>

स्रोत: http://www.khronos.org/files/webgl/webgl-reference-card-1_0.pdf

आशा है कि इस मदद करता है किसी को :)

जम्मू

+0

इससे मुझे बहुत मदद मिली है! मेरे पास एक ही प्रश्न था और आपने एक समझदार स्पष्टीकरण के साथ एक समाधान समाधान प्रदान किया है। धन्यवाद! – Thomas

+0

क्या इस उत्तर का कोई कारण है और मूल प्रश्न 'gl.bufferData' के बजाय 'bufferData' है? मैं टाइपो मान रहा हूं लेकिन चूंकि इसे शायद ही किया जा रहा है, मुझे कुछ याद आ रही है। – Grumdrig

+0

अच्छा स्पॉटिंग, spec से कॉपी किया होगा। अपडेट होगा :) –

3

वैकल्पिक रूप से आप कदम के रूप में http://learningwebgl.com/blog/?p=239 में विस्तार से बताया पालन कर सकते हैं।

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