6

बदल दिया गया है, मैं एक दृश्य में एक छद्म 3 डी परिप्रेक्ष्य प्रभाव लागू करने के लिए एक CATransform3D परिवर्तन का उपयोग कर रहा हूं।एक कैलियर के sublayers के लिए एक व्यस्त CATransform3D लागू कर रहा है जो पहले से ही

मैं ट्रांसफॉर्म के पैरामीटर को नियंत्रित करने के लिए आईफोन 4 में जीरोस्कोप का उपयोग कर रहा हूं।

View with subviews

परिणाम कुछ इस तरह है:

3D transform in action

मेरा अगला कार्य या तो किया जा रहा से subviews रोकने के लिए है

दृश्य मैं रूपांतरित होने वाले कर रहा हूँ कुछ subviews है मुख्य दृश्य के रूप में परिवर्तित किया गया है, या एक उलटा परिवर्तन लागू करने के लिए ताकि सबव्यूफ अप्रभावित रहें।

मेरा लक्ष्य पर्यवेक्षण के लिए लंबवत प्रत्येक सबव्यू होना है, यह धारणा देते हुए कि वे "खड़े" हैं।

कोड मैं के लिए उपयोग कर रहा हूँ परिणत:

- (void)update:(NSTimer *)timer 
{ 
    roll = [[[_manager deviceMotion] attitude] roll]; 
    pitch = [[[_manager deviceMotion] attitude] pitch]; 
    yaw = [[[_manager deviceMotion] attitude] yaw]; 

    CALayer *layer = [self.view layer]; 
    CATransform3D rotationAndPerspectiveTransform = CATransform3DIdentity; 
    rotationAndPerspectiveTransform = CATransform3DRotate(rotationAndPerspectiveTransform, -90 * M_PI/180.0f, 0.0f, 0.0f, 1.0f); // make landscape again 
    rotationAndPerspectiveTransform.m34 = 1.0/-500; // apply the perspective 
    rotationAndPerspectiveTransform = CATransform3DRotate(rotationAndPerspectiveTransform, roll, 1.0f, 0.0f, 0.0f); 
    rotationAndPerspectiveTransform = CATransform3DRotate(rotationAndPerspectiveTransform, yaw, 0.0f, 0.0f, 1.0f); 
    [layer setTransform:rotationAndPerspectiveTransform];  
} 

मैं बदलना, वाई अक्ष के चारों ओर subview करने के लिए एक 90 डिग्री के परिप्रेक्ष्य रोटेशन लगाने से पलट करने की कोशिश में निम्नलिखित कोड की कोशिश की है:

for (UIView *subview in [self.view subviews]) 
{ 
    CALayer *sublayer = [subview layer]; 
//CATransform3D inverseTransformation = [sublayer transform]; 
CATransform3D inverseTransformation = CATransform3DIdentity; 
rotationAndPerspectiveTransform.m34 = 1.0/-500; // apply perspective 
inverseTransformation = CATransform3DRotate(inverseTransformation, 90 * M_PI/180.0f, 0.0f, 1.0f, 0.0f); 
[sublayer setTransform:inverseTransformation]; 
} 

लेकिन यह सब करने में सफल होता है सबव्यू गायब हो जाता है। यदि मैं [sublayer transform] के साथ परत से मौजूदा ट्रांसफॉर्म का उपयोग करने का प्रयास करता हूं और इसमें 3 डी रोटेशन लागू करता हूं, तो सबव्यू झिलमिलाहट लागू करते हैं, लेकिन घूमते नहीं हैं।

मैट्रिक्स गणित का मेरा ज्ञान बहुत अच्छा नहीं है, इसलिए मुझे नहीं पता कि यह सही दृष्टिकोण है या नहीं।

मैं उप दृश्यों को सुपर व्यू पर लंबवत कैसे बैठ सकता हूं?

उत्तर

1

मैं प्रत्येक व्यक्तिगत परिवर्तन कार्य की गणना करने के मूल दृष्टिकोण को बनाने की कोशिश नहीं करने की सलाह देता हूं। साथ ही, उच्च स्तर UIView ऑब्जेक्ट्स के बजाय प्रत्येक छोटे उप दृश्यों के लिए CALayers का उपयोग करना आसान होगा। एक 3 डी मॉडल बनाने और पूरे मॉडल को बदलने का मूल दृष्टिकोण आपके लिए बेहतर काम करना चाहिए।

मुख्य परत से प्रारंभ करें, प्रत्येक छोटे वर्गों के लिए एक सब्लेयर जोड़ें, उन सब्लेयर को स्थिति में बदलें, फिर आपके प्रश्न में सूचीबद्ध update: विधि को बिना किसी संशोधन के सब कुछ बदलने के लिए काम करना चाहिए। John Blackburn has a nice little tutorial जो बहुत मदद करनी चाहिए।