2012-09-26 16 views
6

SceneKit (OpenGL) के भीतर चिकनी कैमरा आंदोलन के लिए मानक विधि क्या है? मैन्युअल रूप से बदलते एक्स, वाई पर्याप्त चिकनी नहीं है, फिर भी CoreAnimation का उपयोग करके "स्पंदन" आंदोलन बनाता है। SceneKit पर डॉक्स बहुत इतना सीमित होने की किसी भी उदाहरण सराहना की होगी लगता है, मैं इस समय इस कर रहा हूँ:SceneKit चिकनी कैमरा आंदोलन

- (void)keyDown:(NSEvent *)theEvent { 
    int key = [theEvent keyCode]; 
    int x = cameraNode.position.x; 
    int y = cameraNode.position.y; 
    int z = cameraNode.position.z; 
    int speed = 4; 
    if (key==123) {//left 
     x-=speed; 
    } else if (key==124) {//right 
     x+=speed; 
    } else if (key==125) {//down 
     y-=speed; 
    } else if (key==126) {//up 
     y+=speed; 
    } 
    //move the camera 
    [SCNTransaction begin]; 
    [SCNTransaction setAnimationDuration: 1.0]; 
    // Change properties 
    cameraNode.position = SCNVector3Make(x, y, z); 
    [SCNTransaction commit]; 
} 
+0

परिवर्तन की गति को एक छोटे से मूल्य पर आज़माएं, और SCNTransaction की 'एनीमेशन टिमिंग फ़ंक्शन' भी देखें। सुनिश्चित करें कि 'CAMediaTimingFunction' का फ़ंक्शन नाम kCAMediaTimingFunctionLinear है, इसलिए यह पल्स नहीं करता है। – TheAmateurProgrammer

उत्तर

1

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

हालांकि यह व्यवहार सही तरीके से करने के लिए कुछ काम करता है। keyDown: और keyUp: गेम इनपुट की बात आती है जब कुछ अप्रिय व्यवहार करते हैं। उदाहरण के लिए, दोहराने की चाबियाँ। साथ ही, यदि आपके दृश्य को ध्यान में रख दिया जाता है, तो आपके दृश्य को खोने के बाद भी वे आग लग सकते हैं या आपका ऐप पृष्ठभूमि में जाता है। आदि असंभव नहीं, लेकिन कष्टप्रद।

जो मैंने अभी तक नहीं किया है वह त्वरण और मंदी है, जो मुझे लगता है कि यह चिकनी होने की धारणा की सहायता करेगा। अन्यथा यह बहुत अच्छा लगता है।

+0

मैंने किसी भी तरह का दृष्टिकोण किया - सिवाय इसके कि मैंने टाइमर का उपयोग नहीं किया - मैंने अद्यतन प्रतिनिधि के भीतर कैमरा स्थिति को अपडेट किया है, यह ज्यादातर बार में बहुत चिकनी काम करता है - हालांकि जब एफपीएस ड्रॉप करता है तो मेटल का उपयोग रेंडरर के रूप में करते समय आंदोलन आसान नहीं होता है - ओपनजीएल का उपयोग रेंडरर के रूप में करते समय यह हमेशा चिकनी होता है - लेकिन ओपनजीएल पर एफपीएस अधिक बार गिरता है ... – ColdSteel

8

(कुंजी दोहराने के कारण) स्पंदन आंदोलनों कम करने के लिए आप एक "easeOut" timingFunction उपयोग कर सकते हैं :

//move the camera 
[SCNTransaction begin]; 
[SCNTransaction setAnimationDuration: 1.0]; 
[SCNTransaction setAnimationTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut]]; 
// Change properties 
cameraNode.position = SCNVector3Make(x, y, z); 
[SCNTransaction commit]; 

जिसके अनुसार, यहाँ करने के लिए सबसे अच्छी बात शायद लक्ष्य स्थिति (एक vector3) अपने आप का प्रबंधन और हर फ्रेम पर कैमरा की स्थिति को अद्यतन सुचारू रूप से इस लक्ष्य के लिए जाने के लिए है।

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