ओपनजीएल में प्रेत एनीमेशन


9

मुझे ओपन ईएस में स्प्राइट एनीमेशन को लागू करने में समस्याओं का सामना करना पड़ रहा है। मैं इसे googled है और केवल एक चीज जो मुझे मिल रही है वह है कैनवस के माध्यम से ट्यूटोरियल को लागू करना।

मुझे इसका तरीका पता है लेकिन मुझे इसे लागू करने में समस्या हो रही है।

मुझे क्या चाहिए: टक्कर का पता लगाने पर एक प्रेत एनीमेशन।

मैंने क्या किया: Collision Detection फंक्शन ठीक से काम कर रहा है।

पुनश्च: सब कुछ ठीक काम कर रहा है, लेकिन मैं केवल OPENGL में एनीमेशन को लागू करना चाहता हूं। कैनवस मेरे मामले में काम नहीं करेगा।

------------------------ EDIT -----------------------

मेरे पास अब एक स्प्राइट शीट है, नीचे बताएं कि कुछ निश्चित निर्देशांक हैं, लेकिन कहां से (u, v) को-ऑर्डिनेट शुरू होगा? क्या मुझे अपने यू पर विचार करना चाहिए, (0,0) या (0,5) से को-ऑर्डिनेट करना चाहिए और मुझे उनकी सूची में किस पैटर्न में स्टोर करना चाहिए ..? ----> बाएं से दाएं या ----> ऊपर से नीचे तक

क्या मुझे अपने स्प्राइट वर्ग में 2D सरणी की आवश्यकता है? यहाँ एक बेहतर समझ के लिए छवि है।

स्प्राइट शीट मैं मान रहा हूं कि मेरे पास एक NxN स्प्राइट शीट है, जहां N = 3,4,5,6, .... और इसी तरह।

class FragileSquare{

FloatBuffer fVertexBuffer, mTextureBuffer;

ByteBuffer mColorBuff;

ByteBuffer mIndexBuff;

int[] textures = new int[1];

public boolean beingHitFromBall = false;

int numberSprites = 49;

int columnInt = 7;      //number of columns as int

float columnFloat = 7.0f; //number of columns as float

float rowFloat = 7.0f;


public FragileSquare() {
    // TODO Auto-generated constructor stub

    float vertices [] = {-1.0f,1.0f,            //byte index 0
                         1.0f, 1.0f,            //byte index 1
                                    //byte index 2
                         -1.0f, -1.0f,
                         1.0f,-1.0f};           //byte index 3


    float textureCoord[] = {
                            0.0f,0.0f,
                            0.142f,0.0f,
                            0.0f,0.142f,
                            0.142f,0.142f           


    };


    byte indices[] = {0, 1, 2,
            1, 2, 3 };

    ByteBuffer byteBuffer = ByteBuffer.allocateDirect(4*2 * 4); // 4 vertices, 2 co-ordinates(x,y) 4 for converting in float
    byteBuffer.order(ByteOrder.nativeOrder());
    fVertexBuffer = byteBuffer.asFloatBuffer();
    fVertexBuffer.put(vertices);
    fVertexBuffer.position(0);

    ByteBuffer byteBuffer2 = ByteBuffer.allocateDirect(textureCoord.length * 4);
    byteBuffer2.order(ByteOrder.nativeOrder());
    mTextureBuffer =  byteBuffer2.asFloatBuffer();
    mTextureBuffer.put(textureCoord);
    mTextureBuffer.position(0);

}



public void draw(GL10 gl){


    gl.glFrontFace(GL11.GL_CW);

    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
    gl.glVertexPointer(1,GL10.GL_FLOAT, 0, fVertexBuffer);
    gl.glEnable(GL10.GL_TEXTURE_2D);
    int idx = (int) ((System.currentTimeMillis()%(200*4))/200);
    gl.glMatrixMode(GL10.GL_TEXTURE); 
    gl.glTranslatef((idx%columnInt)/columnFloat, (idx/columnInt)/rowFloat, 0);
    gl.glMatrixMode(GL10.GL_MODELVIEW); 
    gl.glEnable(GL10.GL_BLEND);
    gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);

    gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[0]); //4
    gl.glTexCoordPointer(2, GL10.GL_FLOAT,0, mTextureBuffer); //5
    gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
    gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4); //7
    gl.glFrontFace(GL11.GL_CCW);
    gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
    gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
    gl.glMatrixMode(GL10.GL_TEXTURE);
    gl.glLoadIdentity();
    gl.glMatrixMode(GL10.GL_MODELVIEW);
}

public void loadFragileTexture(GL10 gl, Context context, int resource)
{
    Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), resource);
    gl.glGenTextures(1, textures, 0);
    gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[0]);
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_LINEAR);
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR);
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S, GL10.GL_REPEAT);
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T, GL10.GL_REPEAT);
    GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0);
    bitmap.recycle();
}

}


1
स्प्राइट एनीमेशन और टकराव का पता लगाने का एक दूसरे से कोई लेना-देना नहीं है।
एपीआई-बीस्ट

आप किस तरह का एनीमेशन चाहते हैं? कंकाल, स्प्राइट शीट, कुछ और?
गेमडेव-एर

@ GameDev-er मेरे पास स्प्राइट शीट है।
सिद्धार्थ-वर्मा

1
@ Mr.Beast मुझे पता है कि उनका एक-दूसरे से कोई लेना-देना नहीं है। मेरा उद्देश्य टक्कर के बाद स्प्राइट एनीमेशन को प्राप्त करना है। अब तक मैं टक्कर का पता लगाने में सक्षम हूं। लेकिन जहाँ तक स्प्राइट एनीमेशन का सवाल है .. मैं इसे करने में असमर्थ हूँ। पुनश्च: मैं ES को खोलने के लिए एक नौसिखिया हूँ और यहाँ भी .. इसलिए मेरी किसी भी टिप्पणी के लिए खेद है, यदि कोई हो।
सिद्धार्थ-वर्मा

@ क्या आपके पास x / y मिश्रित क्यों है? :( X क्षैतिज अक्ष है। (मुझे पता है कि यह स्वाभाविक नहीं है, लेकिन यह एक सम्मलेन है जिसे किसी के खिलाफ नहीं जाना चाहिए)
doppelgreener

जवाबों:


6

यह एक कोड स्निपेट है जिसे मैं अपने एंड्रॉइड एप्लिकेशन में उपयोग कर रहा हूं।

gl.glEnable(GL10.GL_TEXTURE_2D);
gl.glMatrixMode(GL10.GL_TEXTURE);    //edit the texture matrix
gl.glTranslatef(u, v, 0);            //translate the uv space (you can also rotate, scale, ...)
gl.glMatrixMode(GL10.GL_MODELVIEW);  //go back to the modelview matrix
gl.glBindTexture(GL10.GL_TEXTURE_2D, getTexture());
gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);           //map the texture on the triangles
gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, getTextureBuffer()); //load texture coordinates

यहाँ चाल glMatrixMode glTranslatef द्वारा पीछा का उपयोग करने के लिए है। यह आपको uv स्थान का अनुवाद करने की अनुमति देगा।

यूवी निर्देशांक (0,0) से (1,1) तक है

मान लीजिए कि आपके पास 4 फ्रेम के साथ एक चौकोर बनावट है और आप एक क्वाड को टेक्सचराइज करना चाहते हैं। मैं uv स्पेस में फ्रेम को परिभाषित करने के लिए निम्नलिखित निर्देशांक का उपयोग करूंगा (पसंद आप पर है)

पहला (0, 0) (0.5, 0.5)

दूसरा (0.5, 0) (1, 0.5)

तीसरा (0, 0.5) (0.5, 1)

4th (0.5, 0.5) (1, 1)

GlTexCoordPointer के साथ आपको अपने क्वाड पर 1 फ्रेम को मैप करना चाहिए तब जब आप दूसरा फ्रेम दिखाना चाहते हैं, तो आप 3rd और glTranslatef (0.5, 0.5, 0) के लिए glTranslatef (0, 0, 0, 0) को कॉल करें। ) 4 के लिए।

उपरोक्त कोड का परीक्षण किया गया है और बहुत अच्छी तरह से काम करता है, मुझे आशा है कि उदाहरण पर्याप्त स्पष्ट है।


संपादित करें:

अपने ड्रा फ़ंक्शन के अंत में आपको अपनी बनावट मैट्रिक्स को रीसेट करना चाहिए इस कोड को सफेद करें।

gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
gl.glMatrixMode(GL10.GL_TEXTURE);
gl.glLoadIdentity();
gl.glMatrixMode(GL10.GL_MODELVIEW);

ठीक है, चलो एक उदाहरण के रूप में 5 पंक्तियाँ और 4 कॉलम लेते हैं। आपके स्प्राइटसेट में अधिकतम 20 स्प्राइट हैं, इसलिए int idx = (int) ((System.currentTimeMillis))% 200 * number_of_sprites)) / 200) का उपयोग करें;

idx अब 0 से number_of_sprites-1 तक जा सकता है (<20 हो सकता है यदि आपके पास उदाहरण के लिए 5 पंक्तियाँ, 4 कॉलम हैं, लेकिन केवल 18 स्प्राइट हैं) तो इसे बदलना हर 200ms का मूल्य है। यह मानते हुए कि आपके पास अपने स्प्राइट को बाएं से दाएं और ऊपर से नीचे तक मिल रहा है, ऐसा करने पर आप अपने फ्रेम को uv स्पेस में समन्वित कर सकते हैं।

int c = 4;      //number of columns as int
float cf = 4.f; //number of columns as float
float rf = 5.f; //number of rows as float
gl.glTranslatef((idx%c)/cf, (idx/c)/rf, 0);

जब आप idx% c करते हैं तो आप अपना कॉलम इंडेक्स पाते हैं, परिणाम हमेशा 0 और c-1 के बीच होता है

idx% c एक पूर्णांक है, आपको इसे 0.0 और 1.0 के बीच मान पर स्केल करने की आवश्यकता है ताकि आप cf द्वारा विभाजित करें, cf एक फ्लोट है इसलिए यहाँ एक निहित कास्ट है

idx / c एक ही बात है लेकिन पंक्तियों के लिए, idx और c दोनों पूर्णांक हैं इसलिए परिणाम अभी भी पूर्णांक है, और यह पंक्ति सूचकांक है, rf द्वारा विभाजित करने पर आपको 0.0 और 1.0 के बीच मान मिलता है।


मैं यहां एक त्रिकोण पट्टी का उपयोग कर रहा हूं। तो क्या यह इस मामले में काम करेगा?
सिद्धार्थ-वर्मा

एक और बात .. मुझे किस तरीके से को-ऑर्डिनेट्स को स्टोर करना चाहिए? ----> 1D सरणी ----> 2 डी सरणी? यदि 1D है, तो मुझे सरणी में किन सभी समन्वयकों पर विचार करना चाहिए?
सिद्धार्थ-वर्मा

@ हाँ, यह वही बात है, आपको बस सही यूएवी मैपिंग निर्देशांक का उपयोग करने की आवश्यकता है। यदि आपको अपने कोड को पोस्ट करने में अधिक मदद की आवश्यकता हो, तो मेरे कोड स्निपेट को अपने अनुकूल बनाने की कोशिश करें
मार्को मार्टिनली

GlidexCoordPointer के लिए @Sid यूवी निर्देशांक 1D सरणी में संग्रहीत करने की आवश्यकता है
मार्को

1
पहली समस्या के लिए मुझे नहीं पता, यह यहाँ ठीक काम कर रहा है, दूसरे के लिए, आपको आईडी 0 पर वापस जाने के लिए आईडीएक्स को रोकने की आवश्यकता है, इसलिए यह एक सरल चाल है। int oldIdx;पहले एक वैरिएबल घोषित करें public FragileSquare()फिर ड्रा विधि में ऐसा करें: int idx = oldIdx==(numberSprites-1) ? (numberSprites-1) : (int)((System.currentTimeMillis()%(200*numberSprites))/200); oldIdx = idx; जिस तरह से मुझे लगता है कि हम ओटी जा रहे हैं, मूल प्रश्न का उत्तर दिया गया था, शायद आपको यह बंद करना चाहिए और यदि आवश्यक हो तो एक नया खोलें।
मार्को मार्टिनेली

1

मेरा सुझाव: अपनी एनीमेशन के सभी फ़्रेमों (साथ-साथ) में बनावट बनाएं। जिस बनावट को आप प्रदर्शित करना चाहते हैं, उसके अनुसार बनावट के निर्देशांक बदलें।


इसका आधा काम हो चुका है। लेकिन मुझे इस भाग को कैसे प्राप्त करना चाहिए ...... "बनावट को उस फ़्रेम के अनुसार समन्वयित करें जिसे आप प्रदर्शित करना चाहते हैं।" PS: मैं ES को ओपन करने के लिए नौसिखिया हूं।
सिद्धार्थ-वर्मा

1

आपको स्प्राइटशीट नामक कुछ का उपयोग करने की आवश्यकता है ।

यहाँ छवि विवरण दर्ज करें

एक स्प्रिटशीट सभी अलग-अलग "फ्रेम" के साथ एक एकल छवि है जो दिखाती है कि वह चरित्र दिखा सकता है। आप चयन करते हैं कि स्प्राइट शीट का कौन सा "फ़्रेम" या तो समय के आधार पर प्रदर्शित होता है (जैसा कि विस्फोट एनीमेशन के लिए) या खिलाड़ी इनपुट पर (जैसे बाएं, दाएं, या बंदूक खींचना)

ऐसा करने का सबसे आसान तरीका यह है कि सभी संबंधित स्प्राइट्स समान आकार (समान चौड़ाई और ऊंचाई) के हों, और इसलिए बाईं ओर से 4 वें स्प्राइट का (यू) समन्वय हो रहा है (sprite_width*4.0 / sprite_sheet_width)

यदि आप अनुकूलन करने और अंतरिक्ष कुशल होने का प्रयास कर रहे हैं, तो आप अपने स्प्राइट को एक शीट पर पैक करने के लिए टेक्सचरपैकर जैसे टूल का उपयोग कर सकते हैं । TexturePacker भी json या xml डेटा उत्सर्जित करता है जो आपके द्वारा लोड किए गए प्रत्येक स्प्राइट के xy स्थानों का वर्णन करता है।


मेरे पास पहले से ही एक स्प्राइट शीट है। मुझे पता है कि विधि, इसके समन्वय को स्थानांतरित करके। लेकिन मेरा मुख्य सवाल यह है कि यह कैसे हासिल किया जा सकता है? क्या आपके पास इसके लिए कोई छद्म कोड या जावा कोड है? एल्गोरिथ्म मेरे लिए काम कर सकता है।
सिद्धार्थ-वर्मा

2
एक Spriteकक्षा लिखें । Spriteकक्षा के अंदर (u, v) जोड़े की एक सूची है जो बनावट में प्रत्येक "अभी भी" के (u, v) निर्देशांक का वर्णन करती है। आपको समय ट्रैक करने के लिए 2 और चर चाहिए: एक फ्लोट को "सेकंड प्रति फ्रेम" (प्रत्येक एनीमेशन फ्रेम पर खर्च करने के लिए सेकंड), और एक और फ्लोट "घड़ी" कहा जाता है, जो एनीमेशन चक्र में "वर्तमान समय" को संग्रहीत करता है। जब आप ड्रा करने जाते हैं, तो आपको वर्तमान समय को अपडेट करना होगा। जब "सेकंड प्रति फ्रेम" पार हो जाता है, तो आप एनीमेशन के अगले फ्रेम पर चले जाते हैं, ताकि एनीमेशन चालू हो जाए।
बोबोबो

ठीक है, इसलिए सूची (यू, वी) जोड़े में 2 डी सरणी होगी?
सिद्धार्थ-वर्मा

कृपया संपादित प्रश्न देखें।
सिद्धार्थ-वर्मा

1

आप OpenGL के साथ I_COLLIDE का उपयोग कर सकते हैं ।

दुनिया में प्रत्येक इकाई को एक बॉक्स बनाओ, फिर जांचें कि क्या बॉक्स के प्रत्येक एक्सिस अन्य संस्थाओं से टकरा रहे हैं।

टकराव के लिए परीक्षण करने के लिए बड़ी मात्रा में संस्थाओं के साथ आप एक ऑक्ट्री में जांच करना चाहते हैं। आप दुनिया को सेक्टरों में विभाजित करते हैं, फिर केवल उन्हीं सेक्टरों में वस्तुओं के बीच टकराव की जांच करते हैं।

बुलेट डायनेमिक्स इंजन का भी उपयोग करें जो एक ओपन सोर्स टकराव का पता लगाने और भौतिकी इंजन है।


टक्कर का पता लगाने के लिए पहले से ही हासिल किया गया है। मेरा उद्देश्य स्प्राइट एनीमेशन बनाना है।
सिद्धार्थ-वर्मा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.