2013-06-15 5 views
6

मैंने कोर एनीमेशन का उपयोग करके वाई अक्ष के चारों ओर 50 डिग्री दृश्य घुमाया है। मैं दृश्य के किनारे को स्क्रीन के किनारे को छूने के लिए चाहता हूं। मैं यह कैसे कर सकता हूं?यह निर्धारित करने के लिए कि स्क्रीन के किनारे से 3 डी घुमावदार वस्तु कितनी दूर है

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

CATransform3D rotation = CATransform3DIdentity; 
rotation.m34 = -1.0/500.0; 
rotation = CATransform3DRotate(rotation, 50.0 * M_PI/180, 0.0, 1.0, 0.0); 
view.layer.transform = rotation; 
view.layer.zPosition = 200; 

enter image description here

+0

एक परिवर्तित ऑब्जेक्ट के फ्रेम का डिफ़ॉल्ट मान वही रहता है। फ़्रेम सबसे छोटा असंगत आयताकार है जिसमें संबंधित दृश्य की संपूर्णता हो सकती है, तो यह अभी भी क्यों काम नहीं करता है? – CodaFi

+0

क्या आपको वास्तव में जेड-अक्षिस के साथ अनुवाद करने के लिए दृश्य की आवश्यकता है? –

+0

@ कोडाफ़ी, मुझे नहीं लगता कि पर्यवेक्षण के किनारे पर फ्रेम को अस्तर बनाना ऐप्पल से काम करेगा: यदि यह संपत्ति पहचान परिवर्तन नहीं है, तो फ्रेम प्रॉपर्टी का मान अपरिभाषित है और इसलिए इसे अनदेखा किया जाना चाहिए। – marchinram

उत्तर

1

अगर मैं तुम्हें सही ढंग से समझ में आया, आप निम्नलिखित की तरह कुछ हैं:

Final view

अपनी गणना आप CALayer की anchorPoint साथ खेलने के लिए की जरूरत को कम करने के लिए। anchorPoint वह जगह है जहां परिवर्तन लागू होते हैं, और इसके प्रभाव घूर्णन में विशेष रूप से दिखाई देते हैं। हम जो करने जा रहे हैं वह CALayer को अपने बिंदुओं में से एक को घूमने के लिए बताएं, केंद्र (जो डिफ़ॉल्ट है) नहीं।

यह मेरा loadView:

UIView *view = [[UIView alloc] initWithFrame:[UIScreen mainScreen].applicationFrame]; 
view.backgroundColor = [UIColor whiteColor]; 

CGRect frame = CGRectMake(view.frame.size.width - 100.f, 
          view.frame.size.height/2.f - 50.f, 
          100.f, 100.f); 
UIView *red = [[UIView alloc] initWithFrame:frame]; 
red.backgroundColor = [UIColor redColor]; 
[view addSubview:red]; 

CATransform3D rotation = CATransform3DIdentity; 
rotation.m34 = -1.0/500.0; 
// Since the anchorPoint is displaced from the center, the position will move with 
// it, so we have to counteract it by translating the layer half its width. 
rotation = CATransform3DTranslate(rotation, 50.f, 0, 0); 
rotation = CATransform3DRotate(rotation, 50.0 * M_PI/180, 0.0, 1.0, 0.0); 
// We tell the anchorPoint to be on the right side of the layer (the anchor point 
// position is specified between 0.0-1.0 for both axis). 
red.layer.anchorPoint = CGPointMake(1.f, 0.5f); 
red.layer.transform = rotation; 
red.layer.zPosition = 200; 

और क्या मैं प्राप्त छवि ऊपर दिखने वाला है।

उम्मीद है कि यह मदद करता है!

0

आप अपने दृश्य के किनारे जो दूरी आप की गणना करने की कोशिश कर रहे हैं के अंत अंक के लिए (M34 परिवर्तन सहित) अपने अंतिम परिवर्तन मैट्रिक्स लागू करना चाहते हैं। इससे आपको अनुमानित स्थान में आपके बिंदु का अंतिम स्थान मिलेगा।

आईओएस 5 ने जीएलकिट जोड़ा, जिसमें मैट्रिक्स और वेक्टर गणना करने के लिए कार्यों की पूरी लाइब्रेरी शामिल है। उदाहरण के लिए, GLKMatrix4MultiplyVector3 पर एक नज़र डालें। यह फ़ंक्शन 3 भाग वेक्टर लेता है और इसे 4x4 मैट्रिक्स द्वारा गुणा करता है, और परिणामी 3-घटक वेक्टर देता है।

आपको GLKMatrix4MultiplyVector4 की आवश्यकता हो सकती है, क्योंकि अगर मुझे सही ढंग से याद है कि आप अपने वेक्टर को अक्षों की संख्या से 1 और घटक रखना चाहते हैं (इसलिए 3 डी वेक्टर के लिए आप 4 घटक वेक्टर चाहते हैं।) वेक्टर गणित मेरा मजबूत सूट नहीं है , इसलिए मुझे इसका उपयोग करने की आवश्यकता होने पर मुझे यह सामान देखना होगा।

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