2011-01-02 9 views
24

एंड्रॉइड गेम My Paper Plane झुकाव नियंत्रण को कार्यान्वित करने का एक शानदार उदाहरण है, लेकिन मैं यह समझने के लिए संघर्ष कर रहा हूं कि मैं कुछ ऐसा कैसे कर सकता हूं।मैं "माई पेपर प्लेन" जैसे झुकाव नियंत्रणों के लिए सेंसर मैनेजर.getऑरिएंटेशन का उपयोग कैसे कर सकता हूं?

मेरे पास निम्न उदाहरण है जो सेंसर मैनेजर से getOrientation() का उपयोग करता है। पूरी बात pastebin here पर है। यह केवल टेक्स्ट फ़ील्ड में अभिविन्यास मान प्रिंट करता है। यहाँ सबसे अधिक प्रासंगिक टुकड़ा है:

private void computeOrientation() { 
    if (SensorManager.getRotationMatrix(m_rotationMatrix, null, 
             m_lastMagFields, m_lastAccels)) { 
     SensorManager.getOrientation(m_rotationMatrix, m_orientation); 

     /* 1 radian = 57.2957795 degrees */ 
     /* [0] : yaw, rotation around z axis 
     * [1] : pitch, rotation around x axis 
     * [2] : roll, rotation around y axis */ 
     float yaw = m_orientation[0] * 57.2957795f; 
     float pitch = m_orientation[1] * 57.2957795f; 
     float roll = m_orientation[2] * 57.2957795f; 

     /* append returns an average of the last 10 values */ 
     m_lastYaw = m_filters[0].append(yaw); 
     m_lastPitch = m_filters[1].append(pitch); 
     m_lastRoll = m_filters[2].append(roll); 
     TextView rt = (TextView) findViewById(R.id.roll); 
     TextView pt = (TextView) findViewById(R.id.pitch); 
     TextView yt = (TextView) findViewById(R.id.yaw); 
     yt.setText("azi z: " + m_lastYaw); 
     pt.setText("pitch x: " + m_lastPitch); 
     rt.setText("roll y: " + m_lastRoll); 
    } 
} 

समस्या यह है कि मानों यह बकवास की तरह देखो बाहर थूक, या कम से कम वहाँ अलग करने के लिए उपयोगकर्ता प्रदर्शन गति के प्रकार कोई रास्ता नहीं है है।

Figure 1. Pitch and roll

(ऐसा इसलिए है: रोल/स्टीयरिंग के लिए पिच के लिए 1. "झुकाव" और 2. "बारी बारी से" - मैं एक चित्र गति के 2 प्रकार से संकेत मिलता है कि मैं पता लगाने के लिए करना चाहते हैं तैयार कर लिया है लैंडस्केप मोड में एक फोन का एक आइसोमेट्रिक-आश दृश्य, ज़ाहिर है)

जब मैं फ़ोन को अपने लंबे अक्ष के साथ आगे और पीछे झुकाता हूं - 1 दिखाया गया - मुझे उम्मीद है कि केवल 1 मानों को बदलने के लिए, लेकिन सभी उनमें से भारी रूप से बदलना प्रतीत होता है। इसी प्रकार, यदि मैं स्क्रीन से बाहर आने वाली एक काल्पनिक रेखा के बारे में फ़ोन घुमाता हूं - 2 में दिखाया गया है - मुझे उम्मीद है कि केवल रोल मान बदल जाएगा, लेकिन सभी मान बहुत बदलते हैं।

समस्या तब होती है जब मैं अपने खेल को कैलिब्रेट करता हूं - जिसका मतलब है कि कोण x, y और z के मौजूदा मानों को रिकॉर्ड करना - मुझे बाद में यह नहीं पता कि आने वाले अपडेट किए गए कोणों को कैसे कहें "ठीक है, ऐसा लगता है कि आपने झुका हुआ है फोन और आप 3 डिग्री बाएं रोल करना चाहते हैं "। यह "ठीक है, आपने फोन को स्थानांतरित कर दिया है और आप एक ही समय में एक-टिल्टिन 'और ए-रोलिन' हैं, भले ही इरादा केवल एक रोल था। सही बात?

कोई विचार? मैंने remapCoordinateSystem का उपयोग करके यह देखने के लिए प्रयास किया है कि अक्ष को बदलने से कोई प्रभाव पड़ता है या नहीं। कोई आनंद नहीं है। मुझे लगता है कि मैं इस :-(

उत्तर

22

के साथ कुछ बुनियादी याद कर रहा हूँ आप एक्सीलेटर और megnetic सेंसर सरणियों मिलाया कोड होना चाहिए:।

if (SensorManager.getRotationMatrix(m_rotationMatrix, null, 
            m_lastAccels, m_lastMagFields)) { 

चेक बाहर getRotationMatrix(..)

+0

ठीक है, कि शर्मनाक था। इसके अलावा: एक बड़ा, भाग्य आपको धन्यवाद! मुझे नहीं पता कि पिछले कुछ दिनों में मैंने कितने घंटे बर्बाद कर दिए हैं और इस पर जुनून लगा रहे हैं। हां, एपीआई का उपयोग करके इसका उद्देश्य बहुत बेहतर काम करता है। – richq

+0

I भावना को जानें;) इस तरह की समस्याओं के लिए आंखों की दूसरी जोड़ी वास्तव में सहायक है। –

+1

मुझे लगता है कि इस पोस्ट का उत्तर दिया जा रहा है, और थोड़ा पुराना है, लेकिन मैंने अनिवार्य रूप से एक लेखन किया है जो आप यहां खोज रहे हैं: [http://blog.samsandberg.com/2015/05/10 /tilt-for-android/](http://blog.samsandberg.com/2015/05/10/tilt-for-android/) - उम्मीद है कि यह किसी की मदद करेगी! –

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

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