2017-03-20 14 views
5

मेरे ऐप में, मुझे डिवाइस रोटेशन से अवगत होना चाहिए। अगर मैं बस उत्पादन है कि स्क्रीन के लिए और एक सर्कल में कर देते हैं (सीधे ऊपर और नीचे मेरे फोन पकड़ेएकता: इनपुट .gyro.attitude सटीकता

var y = Input.gyro.attitude.eulerAngles.y;

...: मैं निम्नलिखित का उपयोग कर जाइरोस्कोप से y- अक्ष मूल्य खींचने के लिए कोशिश कर रहा हूँ के रूप में यदि आप स्क्रीन पर) देख रहे थे, मैं निम्नलिखित मिल:

270, 270, 270, 270, आदि ... 270, 290, 310, 20, 40, 60, 80 (बहुत जल्दी) ... 90, 9 0, 9 0, 9 0, आदि ... blah ...

क्या इस कूद के लिए संख्याओं में कोई तरीका है?

+0

हाँ यूलर उपयोग करने से बचें:

आप बस कोण वे y दिशा मैं कुछ इस तरह की सिफारिश कर सकते हैं में सामना कर रहे हैं दिखाने के लिए चाहते हैं, इस 0 180 डिग्री करने के लिए y कोण गिर्द घूमती है। एकता quaternion का उपयोग करता है जबकि यूलर सिर्फ एक दोस्ताना और पठनीय प्रतिनिधित्व पाने के लिए हैं। मैं नहीं जानता कि आप मूल्यों के साथ क्या करना चाहते हैं ... लेकिन बस केवल यूलर के बारे में भूल जाओ और उपलब्ध विधियों के साथ quaternion का उपयोग करें (lerp, slerp, lookrotation ...) – Everts

उत्तर

2

आप तेजी से कूदने के लिए अधिकतम रोटेशन सेट कर सकते हैं।

y_diff = new_y - last_y; 
y = y + Mathf.Clamp(y_diff, -limit, limit); 
1

आप इस प्रभाव को प्राप्त करने के लिए रैखिक इंटरपोलेशन का उपयोग कर सकते हैं। केवल एक चीज जिस पर आपको विचार करने की आवश्यकता है वह यह है कि आप इसे कितनी तेजी से करेंगे, क्योंकि फोन लगातार घूर्णन करेगा और आप नहीं चाहते हैं कि आपके मूल्य कम हो जाएं।
एक Mathf.Lerp का उपयोग कर उदाहरण:

// Your values 
    var y = 0;  

    // speed for the Lerp 
    static float t = 1.0f; 

    void Update() 
    { 
     float old = y 
     float new = Input.gyro.attitude.eulerAngles.y; 
     // Interpolate 
     y = Mathf.Lerp(old, new, t * Time.deltaTime);  
    } 

से here

4

गिम्बल लॉक

संदर्भित आप जो देख रहे कुछ जिम्बल ताला अधिक जानकारी here कहा जाता है। यह यूलर कोण 360 विमान या अधिक विशेष रूप से पार करता है (तीन अक्षों में से दो समानांतर विन्यास में संचालित होते हैं), और यही कारण है कि लोग Quaternions का उपयोग करते हैं।

Quaternions

आप यूलर कोण सीधे खींच नहीं किया जाना चाहिए। मैं कुछ इस तरह की सिफारिश करेंगे:

Quaternion q = Input.gyro.attitude.rotation; 

Quaternion का इस्तेमाल करके उनकी यूलर कोण से हम जिम्बल ताला से बचने और इसलिए 360, 0 समस्या से बचने के द्वारा।

/// <summary> 
/// This method normalizes the y euler angle between 0 and 180. When the y euler 
/// angle crosses the 180 degree threshold if then starts to count back down to zero 
/// </summary> 
/// <param name="q">Some Quaternion</param> 
/// <returns>normalized Y euler angle</returns> 
private float normalizedYAngle(Quaternion q) 
{ 
    Vector3 eulers = q.eulerAngles; 
    float yAngle = eulers.y; 
    if(yAngle >= 180f) 
    { 
     //ex: 182 = 182 - 360 = -178 
     yAngle -= 360; 
    } 
    return Mathf.Abs(yAngle); 
}