2015-10-22 4 views
5

तो मेरे पास एक ऐसा प्रोजेक्ट है जो मैं करने की कोशिश कर रहा हूं। मैं गुरुत्वाकर्षण के सापेक्ष डिवाइस रोटेशन प्राप्त करने की कोशिश कर रहा हूं, और जहां से यह शुरू हुआ वहां से अनुवाद। इसलिए मूल रूप से डिवाइस के लिए "ट्रैकिंग" डेटा प्राप्त हो रहा है। मैं मूल रूप से 3 डी पीटी बनाकर इसे लागू करने की योजना बना रहा हूं जो बाद में डिवाइस से रिकॉर्ड किए गए डेटा की नकल करेगा।कृपया मुझे डिवाइस रोटेशन डेटा को सही ढंग से लागू करने में मदद करें

वैसे भी इसे प्राप्त करने का प्रयास करने के लिए मैंने सोचा कि दृश्य किट के साथ काम करना सबसे अच्छा होगा, जिस तरह से मैं 3 आयामों में चीजें देख सकता हूं जैसे डेटा रिकॉर्ड करने की कोशिश कर रहा हूं। अभी मैं जहाज को घूमने की कोशिश कर रहा हूं ताकि यह हमेशा इसके निम्नलिखित गुरुत्वाकर्षण (जैसे जमीन या कुछ पर) जैसा दिखता हो, डिवाइस रोटेशन क्या नहीं है। मुझे लगता है कि एक बार मेरे पास यह है कि यह एक बिंदु पर लागू करने के लिए एक sinch होगा। तो मैंने निम्नलिखित कोड बनाया:

if let attitude = motionManager.deviceMotion?.attitude { 
     print(attitude) 


     ship.eulerAngles.y = -Float(attitude.roll) 
     ship.eulerAngles.z = -Float(attitude.yaw) 
     ship.eulerAngles.x = -Float(attitude.pitch) 

    } 

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

मुझे लगता है कि मेरा प्रश्न है: क्या कोई जानता है कि उपरोक्त मेरे कोड को कैसे ठीक किया जाए ताकि जहाज सही ढंग से "सीधे" रहता है चाहे कोई अभिविन्यास क्या हो।

+0

यह सवाल भी तरह से, जिस तरह से बहुत व्यापक है। – nhgrif

+1

@nhgrif मैंने उपरोक्त मेरे मुख्य प्रश्न लिखे हैं। माना जाता है कि उनमें से कुछ अधिक सिद्धांत हैं तो आवेदन। हालांकि सवाल मेरी परिभाषा से बिल्कुल व्यापक नहीं है। मैंने स्पष्ट रूप से कहा कि मैं क्या उम्मीद कर रहा था, और जब मैंने ऐसा किया तो क्या गलत हुआ। –

+0

प्रश्न 1 ही बहुत व्यापक नहीं है, मुझे नहीं लगता कि। तुम बस उस सवाल करने के लिए नीचे इस पोस्ट के दायरे को कम करने पर विचार करना चाहिए ताकि इस पोस्ट असाधारण व्यापक होने के लिए बंद नहीं है। – nhgrif

उत्तर

8

जेड!

सबसे पहले एक छोटी सी चाल है। यदि आप डिफ़ॉल्ट स्थिति के रूप में आईफोन बिछाने का उपयोग करना चाहते हैं तो आपको नोटिस करना होगा कि sceneKit पर उपयोग की गई अक्ष अलग हैं तो डिवाइसमोशन द्वारा उपयोग की जाने वाली।

deviceMotion axis sceneKit axis http://developer.apple.com/library/ios/documentation/SceneKit/Reference/SceneKit_Framework/Art/3d_coordinate_system_2x.png

पहली बात आप स्थापित करने की आवश्यकता कैमरे की स्थिति है: अक्ष की जाँच करें। जब आप एक सीनकिट प्रोजेक्ट शुरू करते हैं तो यह स्थिति में आपका कैमरा बनाता है (0, 0, 15)। इसके साथ एक समस्या है:

eulerAngles = (0,0,0) के मानों का अर्थ यह होगा कि ऑब्जेक्ट विमान xz में होगा, लेकिन जब तक आप ज़ेड से देख रहे हों, तो आप इसे केवल देखें पक्ष। इसके लिए आईफोन बिछाने के बराबर होने के लिए, आपको कैमरे को ऊपर से देखने के लिए सेट करना होगा। तो यह है कि आप उस पर फोन से (एक कैमरे की तरह, idk)

// create and add a camera to the scene 
let cameraNode = SCNNode() 
cameraNode.camera = SCNCamera() 
scene.rootNode.addChildNode(cameraNode) 

// place the camera 
cameraNode.position = SCNVector3(x: 0, y: 15, z: 0) 
// but then you need to make the cameraNode face the ship (the origin of the axis), rotating it 
cameraNode.eulerAngles.x = -Float(M_PI)*0.5 //or Float(M_PI)*1.5 
इस हम ऊपर से जहाज को देखने के लिए जा रहे हैं के साथ

, तो पहले भाग से किया जाता है देख रहे थे होगा। अब हमें जहाज को डिवाइस रोटेशन के साथ "अभी भी" (जमीन का सामना करना) बना देना होगा।

//First we need to use SCNRendererDelegate 
class GameViewController : UIViewController SCNSceneRendererDelegate{ 
    private let motion = CMMotionManager(); 
... 
viewDidLoad पर

तब:

//important if you remove the sceneKit initial action from the ship. 
//The scene would be static, and static scenes do not trigger the renderer update, setting the playing property to true forces that: 
scnView.playing = true; 
if(motion.deviceMotionAvailable){ 
    motion.startDeviceMotionUpdates(); 
    motion.deviceMotionUpdateInterval = 1.0/60.0; 
} 

तो हम अद्यतन विधि करने के लिए जाना

अक्ष पर देखो: अक्ष Y और Z "बंद" कर रहे हैं आप sceneKit अक्ष तुलना और डिवाइसमोशन अक्ष। जेड फोन पर है, जबकि दृश्य पर तरफ है, और वाई फोन पर तरफ, दृश्य पर है। तो क्रमशः एक्स, वाई और जेड अक्ष से जुड़े पिच, रोल और यॉ, को पिच, यॉ और रोल के रूप में लागू किया जाएगा।

नोटिस मैंने रोल मूल्य सकारात्मक रखा है, ऐसा इसलिए है क्योंकि कुछ और "स्विच" है। कल्पना करना मुश्किल है। डिवाइस गति के वाई अक्ष को दृश्य के जेड अक्ष से सहसंबंधित देखें।अब इस अक्ष के साथ एक वस्तु रोटेशन कल्पना, एक ही दिशा में (घड़ी के लिहाज से उदाहरण के लिए), वे अक्ष के स्वभाव की वजह से विपरीत दिशाओं में जा कर दिया जाएगा। (आप रोल नकारात्मक भी सेट कर सकते हैं यह भी गलत हो जाता है)

func renderer(renderer: SCNSceneRenderer, updateAtTime time: NSTimeInterval) { 
    if let rot = motion.deviceMotion?.attitude{ 
     print("\(rot.pitch) \(rot.roll) \(rot.yaw)") 
     ship.eulerAngles.x = -Float(rot.pitch); 
     ship.eulerAngles.y = -Float(rot.yaw); 
     ship.eulerAngles.z = Float(rot.roll); 
    } 

आशा है कि मदद करता है! फिर मिलेंगे!

+0

इस तरह के एक पूर्ण जवाब के लिए बहुत बहुत धन्यवाद! –

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