2015-10-20 6 views
7

SCNMaterialProperty.contents के लिए प्रलेखन बताता है कि यह एक एनिमेटेबल संपत्ति है और वास्तव में मैं दो रंगों के बीच एक क्रॉसफ़ेड कर सकता हूं। हालांकि मैं दो छवियों के बीच क्रॉसफैड करने में असमर्थ हूं।सीनकेट - क्रॉसफ़ेड सामग्री संपत्ति बनावट

तो मुझे आश्चर्य है कि यह संभव है या नहीं, अगर मुझे इसके लिए कस्टम शेडर बनाना है?


मैं एक अंतर्निहित एनीमेशन, जिस स्थिति में इसे तुरंत पता चलता कोशिश की है छवि 'के बाद':

node.geometry.firstMaterial.diffuse.contents = [UIImage imageNamed:@"before"]; 
[SCNTransaction begin]; 
[SCNTransaction setAnimationDuration:5]; 
node.geometry.firstMaterial.diffuse.contents = [UIImage imageNamed:@"after"]; 
[SCNTransaction commit]; 

एक स्पष्ट एनीमेशन, जो कुछ नहीं करता है:

CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"contents"]; 
animation.fromValue = (__bridge id)[UIImage imageNamed:@"before"].CGImage; 
animation.toValue = (__bridge id)[UIImage imageNamed:@"after"].CGImage; 
animation.duration = 5; 
[node.geometry.firstMaterial.diffuse addAnimation:animation forKey:nil]; 

साथ ही CALayer के माध्यम से, जो कुछ भी नहीं करता है:

CALayer *textureLayer = [CALayer layer]; 
textureLayer.frame = CGRectMake(0, 0, 793, 1006); 
textureLayer.contents = (__bridge id)[UIImage imageNamed:@"before"].CGImage; 
node.geometry.firstMaterial.diffuse.contents = textureLayer; 

CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"contents"]; 
animation.fromValue = (__bridge id)[UIImage imageNamed:@"before"].CGImage; 
animation.toValue = (__bridge id)[UIImage imageNamed:@"after"].CGImage; 
animation.duration = 5; 
[textureLayer addAnimation:animation forKey:nil]; 
+0

क्या आपने एक ही भौतिक संपत्ति के लिए दो सामग्रियों के मूल्यों के बजाय दो सामग्रियों के बीच परिवर्तन को एनिमेट करने का प्रयास किया है? – rickster

उत्तर

6

अपने स्वयं के परीक्षण से, ऐसा लगता है कि यह गुण वास्तव में एनिमेटेबल नहीं है जब बनावट मूल्य शामिल होते हैं (ठोस रंग मानों के बजाय)। या तो यह सीनकेकिट में एक बग है (यानी यह एनिमेटेबल होने का इरादा है लेकिन यह काम नहीं कर रहा है) या यह ऐप्पल के दस्तावेज़ों में एक बग है (यानी यह एनिमेटेबल होने का इरादा नहीं है लेकिन वे कहते हैं)। किसी भी तरह से, आपको file that bug होना चाहिए ताकि जब आप इसे ठीक कर लें तो आपको अधिसूचित किया जाएगा।

(यह भी इस तरह नहीं दिखता है एक tvOS विशेष मुद्दा है - मैं भी ओएस एक्स पर यह देखते हैं।) से

मैं समझ सकता क्यों एनिमेटेड बनावट संक्रमण वहाँ नहीं हो सकता है ... एक जीएल/धातु परिप्रेक्ष्य, जिसके लिए संक्रमण के दौरान एक अतिरिक्त बनावट इकाई को बाध्यकारी और दो पिक्सेल लुकअप प्रति पिक्सेल (एक के बजाय) की आवश्यकता होती है।

मैं सभ्य संभावित समाधानों की एक जोड़ी के बारे में सोच सकते हैं:

  1. एक शेडर संशोधक का उपयोग करें।

    uniform sampler2D otherTexture; 
    uniform float fadeFactor; 
    #pragma body 
    vec4 otherTexel = texture2D(otherTexture, _surface.diffuseTexcoord); 
    _surface.diffuse = mix(_surface.diffuse, otherTexel, fadeFactor); 
    

    यह सामग्री आप SCNShaderModifierEntryPointSurface प्रवेश बिंदु का उपयोग कर चेतन करना चाहते हैं पर सेट करें: एक GLSL (ish) स्निपेट है, जो कुछ इस तरह दिखता लिखें। तब otherTexture और एक CABasicAnimation के साथ एक SCNMaterialProperty संबद्ध करने के लिए setValue:forKey: उपयोग करने के लिए 1.

  2. उपयोग कुछ और एनिमेटेड (एक SpriteKit दृश्य की तरह) अपनी सामग्री संपत्ति सामग्री के रूप में 0 से fadeFactor चेतन करने के लिए, और चेतन कि संक्रमण प्रदर्शन करने के लिए । (एक बोनस के रूप में, जब आप इसे इस तरह करते हैं, आप अन्य संक्रमण शैलियों का उपयोग कर सकते हैं।)

+0

बहुत बहुत धन्यवाद, यह पूरी तरह से काम करता है! मैंने केवीसी के माध्यम से पहले एक बनावट बांधने की कोशिश की थी, लेकिन मैंने गलत तरीके से 'एससीएनएमटेरियल प्रॉपर्टी' के उपयोग के बिना छवि को असाइन किया था, जो पीछे की ओर देखकर मूर्खतापूर्ण लगता है। मैं उस रडार को तुरंत फाइल करूंगा। – alloy

+0

रडार: https: //openradar.appspot।कॉम/23283570 – alloy

0

आपका एनीमेशन नहीं हो रहा है क्योंकि "सामग्री" संपत्ति animatable केवल जब एक रंग करने के लिए छवि के लिए सेट नहीं है। आप सामग्री संपत्ति के बारे में सेब के दस्तावेज पर इसे पढ़ सकते हैं।

+0

मैंने अभी दस्तावेज़ों पर एक और नज़र डाली है, लेकिन मुझे एनिमेटिंग के लिए उपयुक्त नहीं होने वाली छवि के बारे में कुछ भी नहीं मिला है। – alloy

+0

प्रलेखन से: संपत्ति सामग्री: रिसीवर की सामग्री निर्दिष्ट करता है। यह एक रंग (एनएससीओएलओआर/यूआईसीओलर), एक छवि (एनएसआईमेज/सीजीआईमेजआरफ), एक परत (कैलियर), एक पथ (एनएसएसटींग या एनएसआरएल), एक स्प्राइटकिट दृश्य (एसकेसीसीन) या एक बनावट (एसकेटेक्चर, आईडी या जीएलकेटेक्चरइन्फो) हो सकता है । एक रंग पर सेट जब एनिमेटेबल। –

+0

हू, यहां तक ​​कि जब मैं "रंग पर सेट होने पर एनिमेटेबल" की खोज करता हूं, तो मुझे इसे इस पृष्ठ पर नहीं मिल रहा है: https://developer.apple.com/library/prerelease/ios/documentation/SceneKit/Reference/ SCNMaterialProperty_Class/index.html # // apple_ref/OCC/instp/SCNMaterialProperty/सामग्री। आप इसे कहां देख रहे हो – alloy

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