2012-05-08 16 views
5

लिए मैं निम्नलिखित समारोह का उपयोग कर रहा एक दृश्यCATransform3D से CGAffineTransform

- (void)pulse { 

    CATransform3D trasform = CATransform3DScale(self.layer.transform, 1.15, 1.15, 1); 
    trasform = CATransform3DRotate(trasform, angle, 0, 0, 0); 

    CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"transform"]; 
    animation.toValue = [NSValue valueWithCATransform3D:trasform]; 
    animation.autoreverses = YES; 
    animation.duration = 0.3; 
    animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]; 
    animation.repeatCount = 2; 
    [self.layer addAnimation:animation forKey:@"pulseAnimation"]; 

} 

मैं CATransform3D स्वयं के बजाय CGAffineTransform self.transform का उपयोग कर एक ही परिणाम प्राप्त करने के लिए चाहते हैं के लिए एक नाड़ी प्रभाव लागू करने। layer.transform। क्या यह संभव है?

+1

, क्यों करेंगे यदि आप पहले से ही परिणाम प्राप्त कर रहे हैं तो क्या आप पहले से ही परिणाम प्राप्त कर रहे हैं, यदि आप एक दृश्य बनाम एक CGAffineTransform बनाम एक परत के लिए CATransform3D लागू कर रहे थे, तो आप परवाह है? –

+0

क्योंकि self.layer.transform का प्रारंभिक मान self.transform से अलग है, है ना? – Abramodj

+0

मैं मतलब, नाड़ी विधि में आने से पहले मैं देखने के लिए कुछ Affine परिवर्तनों को लागू करने, लेकिन मैं परत को स्पर्श नहीं करते, इसलिए मुझे लगता है कि बदलने पहचान मेरी जानकारी के लिए वहाँ – Abramodj

उत्तर

2

बेशक। यदि आप Xcode दस्तावेज़ों में CGAffineTransform पर कोई खोज करते हैं, तो आपको "CGAffineTransform संदर्भ" शीर्षक वाला एक अध्याय मिलेगा। उस अध्याय में "कार्य" नामक एक खंड है। इसमें ऐसे फ़ंक्शन शामिल हैं जो CATransform3DScale (CGAffineTransformScale) और CATransform3DRotate (CGAffineTransformRotate) के बराबर हैं।

ध्यान दें कि CATransform3DRotate करने के लिए अपने कॉल वास्तव में कोई मतलब नहीं है। आपको धुरी के चारों ओर घूमने की जरूरत है, और आप सभी 3 अक्षों के लिए 0 गुजर रहे हैं। आमतौर पर आप Z अक्ष के चारों ओर घुमाने के लिए CATransform3DRotate (trasform, कोण, 0, 0, 1.0) का उपयोग करना चाहते हैं। दस्तावेज़ों को उद्धृत करने के लिए:

यदि वेक्टर की लंबाई शून्य है तो व्यवहार अपरिभाषित है।

+0

लेकिन बिंदु (शायद मेरे प्रश्न से स्पष्ट नहीं है) यह है कि कैसे [CAMediaTimingFunction functionWithName: kCAMediaTimingFunctionEaseInEaseOut] के बराबर है; – Abramodj

+1

आप वास्तव में स्पष्ट नहीं हो रहे हैं। मैं इस तथ्य से अनुमान लगा रहा हूं कि CGAffineTransform का उपयोग विचारों के लिए किया जाता है और CATransform3D परतों के लिए उपयोग किया जाता है जिन्हें आप जानना चाहते हैं कि व्यू-आधारित एनीमेशन कैसे करें जो एक अलग समय कार्य निर्दिष्ट करता है। इसके लिए आप एनिमेट विथ अवधि का उपयोग करना चाहते हैं: देरी: विकल्प: एनिमेशन: समापन: UIView क्लास विधि। विकल्प पैरामीटर में UIViewAnimationOptionCurveEaseInOut, UIViewAnimationOptionCurveLinear, आदि जैसे मान शामिल हैं। बस इच्छित विकल्प निर्दिष्ट करें, और उसके बाद एनिमेशन ब्लॉक में परिवर्तन बदलें। –

7

यह संभव है CATransform3D को CGAffineTransform पर परिवर्तित करें, लेकिन आप कुछ क्षमताओं को खो देंगे। मुझे एक परत और उसके पूर्वजों के कुल परिवर्तन को CGAffineTransform में परिवर्तित करने के लिए उपयोगी पाया गया ताकि मैं इसे कोर ग्राफिक्स के साथ प्रस्तुत कर सकूं। की कमी कर रहे हैं:

  • आपका इनपुट XY विमान में के रूप में फ्लैट माना जाएगा
  • आपका आउटपुट XY विमान भी
  • परिप्रेक्ष्य/.m34 से foreshortening neutralized हो जाएगा के रूप में फ्लैट माना जाएगा

कि अपने उद्देश्यों के लिए ठीक लगता है:

// m13, m23, m33, m43 are not important since the destination is a flat XY plane. 
    // m31, m32 are not important since they would multiply with z = 0. 
    // m34 is zeroed here, so that neutralizes foreshortening. We can't avoid that. 
    // m44 is implicitly 1 as CGAffineTransform's m33. 
    CATransform3D fullTransform = <your 3D transform> 
    CGAffineTransform affine = CGAffineTransformMake(fullTransform.m11, fullTransform.m12, fullTransform.m21, fullTransform.m22, fullTransform.m41, fullTransform.m42); 

यो आप अपने सुपरलेयर से मिलकर पहले 3 डी ट्रांसफॉर्म में अपना पूरा काम करना चाहते हैं, और फिर अंततः CATransform3D को CGAffineTransform पर परिवर्तित करें। यह देखते हुए कि परतों को फ्लैट लक्ष्य पर शुरू करने और प्रस्तुत करने के लिए फ्लैट हैं, मुझे यह बहुत उपयुक्त लगता है क्योंकि मेरे 3 डी रोटेशन 2 डी शीर्स बन गए हैं। मुझे इसे फोरशॉर्टिंग बलिदान के लिए स्वीकार्य भी मिला। इसके आस-पास कोई रास्ता नहीं है क्योंकि एफ़िन ट्रांसफॉर्म को समांतर रेखाओं को संरक्षित करना होता है।

एक 3 डी-बदल परत का उपयोग मुख्य ग्राफ़िक्स, उदाहरण के लिए, आप रूपांतरण जोड़ सकता है रेंडर करने के लिए (! लंगर अंक का सम्मान), तो Affine में बदलने का है, और अंत: जिज्ञासा से बाहर

CGContextSaveGState(context); 
    CGContextConcatCTM(context, affine); 
    [layer renderInContext:context]; 
    CGContextRestoreGState(context); 
+0

धन्यवाद, यह सही जवाब है। दुर्भाग्यवश, यह उन कार्यों में से एक है जिन्हें * कोको एपीआई में शामिल किया जाना चाहिए, लेकिन ऐसा इसलिए नहीं है क्योंकि यह "पूर्ण" रूपांतरण नहीं है (और कभी नहीं हो सकता है)। – SG1

+0

मुझे बहुत खुशी है कि मैंने यह पाया। मैं अब एक सप्ताह के लिए "3 डी से 2 डी मैट्रिक्स" खोज रहा हूं और केवल गणितीय गड़बड़ी का एक गुच्छा पाया है। – xtravar

+0

आपने यह कैसे पता लगाया? यह कमाल का है! मैं आपके गणित प्रतिभा के लिए धनुष। – jjxtra

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