2011-12-10 14 views
6

मेरी समस्या यह है कि मैं 9 बार सिलेंडर घुमाने में सक्षम होना चाहता हूं। 360/9 40 है इसलिए मुझे बस इतना करना चाहिए कि 40 डिग्री 9 गुना घुमाएं। यह तब तक काम नहीं करता है जब मैं 40 डिग्री के बजाय पहली बार सिलेंडर घुमाता हूं तो यह 39.9 9 डिग्री से घूमता है। यह अन्य घूर्णन पर भी होता है।गलत मूल्य पर घूर्णन ऑब्जेक्ट एकता का घूर्णन

मैं ऐसा करके घूम रहा हूं।

if(Input.GetKeyUp("i")) 
     transform.GetChild(m_Section).Rotate(0,40.0f,0); 

मेरे पास एकता संस्करण 3.4 है यह समर्थक नहीं है और मैं सी # में कोडिंग कर रहा हूं।

किसी भी मदद की सराहना की क्योंकि मैंने अभी एकता सीखने की कोशिश शुरू कर दी है।

उत्तर

1

यूनिटी 3 डी स्टोर एक सुंदर अमूर्त गणितीय प्रतिनिधित्व में quaternion नामक रोटेशन करता है। ट्रांज़ॉर्मेशन से और यूलर कोण (जो आप एकता संपादक में देखते हैं) में त्रिकोणमितीय कार्यों का एक कैस्केड शामिल है और इस प्रकार विशेष रूप से साधारण फ्लोट प्रकार के लिए त्रुटियों को गोल करने के लिए प्रवण होता है।

अपने मामले में इस समस्या को हल करने के लिए मैं घूमने से पहले प्रारंभिक क्वाटरनियन ऑब्जेक्ट को संग्रहीत करने और प्रक्रिया के अंत में सेट करने की सलाह देने की सलाह देता हूं। कुछ छद्म कोड:

public class RotationController : MonoBehaviour { 
    Quaternion rotationAtStart; 
    int numOfRotations = 0; 

    void rotate() { 
     numOfRotations++; 
     if (numOfRotations == 1) { 
      rotationAtStart = transform.rotation; 
     } else if (numOfRotations < 9) { 
      transform.Rotate (new Vector3 (0,40.0f,0)); 
     } else if (numOfRotations == 9) { 
      transform.rotation = rotationAtStart; 
     } 
    } 
    void Update() { 
     if (numOfRotations < 9) { 
      rotate(); 
     } 
    } 
} 

360 डिग्री की विशेष स्थिति इस दृष्टिकोण को स्थिर बनाती है। 360 डिग्री से कम के लिए आपको छोटी गोलियों की त्रुटियों के साथ रहना होगा। इस मामले के लिए मैं लक्ष्य quaternion Quaternion.RotateTowards की गणना करने की सिफारिश करता हूं और इसे 360 केस के अंतिम चरण एनालॉग में सेट करता हूं।

आपके लिए एक और उपयोगी बात Animations है। आप एनीमेशन को चिकनी या असतत चरणों के रूप में परिभाषित कर सकते हैं और अगर "i" दबाया जाता है तो बस GameObject.animation.Play("MyRotation") पर कॉल करें। एनीमेशन समाप्त होने पर सूचित होने के लिए अंत में एक एनीमेशन इवेंट का उपयोग करें।

और आखिरी मैथ में एक फ़ंक्शन Approximately है जो फ़्लोटिंग पॉइंट अपर्याप्तता की समस्या से संबंधित है।

+0

अगर मैं एक एनीमेशन की तरह आपको लगता है कि वस्तुओं स्थानीय अक्ष बदल जाएगा सुझाव दिया है या यह केवल वस्तु बारी बारी से होगा इस्तेमाल किया? – Dave

+0

आप गेम ऑब्जेक्ट के ट्रांसफॉर्म के सदस्यों को एनिमेट करते हैं। transform.rotation यूलर कोण – Kay

+0

आपकी मदद के लिए धन्यवाद है। हालांकि यह एक फिक्स की तुलना में समस्या को हल करने का एक तरीका है। मैं यह कहने में सक्षम नहीं होगा कि (transform.eulerAngles.y == 40.0f) क्योंकि भले ही घुमाएं, एक और सटीक परिणाम देता है, फिर भी त्रुटियां हैं। मैंने अभी तक एनीमेशन सुझाव की कोशिश नहीं की है, लेकिन मैं इसे अभी अभी जाऊंगा। – Dave

0

के जवाब Kungfoomanin this post पर एक नज़र, वह 90 डिग्री से अधिक रोटेशन के साथ समस्या descripes या 90 डिग्री के साथ-साथ 270 डिग्री पर है। वह एक एक्सटेंशन प्रदान करता है जो उस मान के लिए Quaternion के सही लटकन की गणना करेगा जो आप सेट करना चाहते हैं। एक नज़र यहाँ है:

using UnityEngine; 
using System.Collections; 

public class ExtensionVector3 : MonoBehaviour { 

    public static float CalculateEulerSafeX(float x){ 
     if(x > -90 && x <= 90){ 
      return x; 
     } 

     if(x > 0){ 
      x -= 180; 
     } else { 
      x += 180; 
     } 
     return x; 
    } 

    public static Vector3 EulerSafeX(Vector3 eulerAngles){ 
     eulerAngles.x = CalculateEulerSafeX(eulerAngles.x); 
     return eulerAngles; 
    } 
} 

और मैं इसे इस तरह इस्तेमाल किया:

Quaternion newQuat = m_directionalLight.transform.rotation; 
Vector3 nL = new Vector3(ExtensionVector3.CalculateEulerSafeX(xNewValueLight), 
         0, 
         0); 
newQuat.eulerAngles = nL; 

m_directionalLight.transform.rotation = 
    Quaternion.Lerp(m_directionalLight.transform.rotation, 
        newQuat, 
        Time.deltaTime); 
संबंधित मुद्दे