2015-10-20 7 views
7

SCNMaterialProperty.contentsのドキュメントでは、アニメーション可能なプロパティであり、実際には2つの色の間のクロスフェードを実行できます。しかし、私は2つの画像をクロスフェードできません。SceneKit - クロスフェードマテリアルプロパティテクスチャ

だから私はこれがまったく可能か、これに対してカスタムシェーダを作成する必要があるのだろうかと思っています。何もしない

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

同じマテリアルプロパティの2つの内容値の間ではなく、2つのマテリアル間で変更をアニメーション化しようとしましたか? – rickster

答えて

6

テクスチャ値が含まれていると、実際にはこのプロパティがアニメ化できないように見えます(単色値ではなく)。これはSceneKitのバグです(つまり、アニメーション化されていても動作しないことを意図しています)か、Appleのドキュメントのバグです(アニメーション化はできませんが、それはそうです)。いずれにせよ、あなたはfile that bugでなければなりません。アップルがそれを修正したときに通知を受けます。

(それはまた、このように見えないことtvOS固有の問題である - 私もOS X上でそれを参照してください。)から...アニメーションテクスチャ遷移が存在しないかもしれない理由を私は理解することができます

追加のテクスチャユニットをバインドする必要があり、トランジション中にピクセルごとに2つのテクスチャルックアップ(1つではなく)を必要とするGL/Metalパースペクティブです。

私はまともな潜在的な回避策のカップルを考えることができます。

  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)スニペットを書きます。次に、あなたの材料特性の内容として、より多くの(SpriteKitベースシーンのような)アニメーション1.

  2. 使用のものに0からfadeFactorをアニメーション化するotherTextureCABasicAnimationSCNMaterialPropertyを関連付けるためにsetValue:forKey:を使用して、移行を実行することをアニメーション化。 「内容」プロパティがない画像の色に設定した場合にのみアニメーション可能ですので(ボーナスとして、あなたはこのようにそれを行う際に、あなたは他の遷移スタイルを使用することができます。)

+0

ありがとう、それは完璧に動作します!以前はKVCを通してテクスチャをバインドしようとしましたが、振り返ってみるとSCNMaterialPropertyを使わずに間違ってイメージを直接割り当てました。レーダーをすぐに提出します。 – alloy

+0

レーダー:https://openradar.appspot。com/23283570 – alloy

0

あなたのアニメーションは起きていません。あなたはcontentsプロパティに関するAppleのドキュメントでそれを読むことができます。

+0

私はドキュメントをもう一度見ましたが、アニメーション化に適していない画像については何も見つかりません。 – alloy

+0

ドキュメント: プロパティの内容: 受信者のコンテンツを指定します。色(NSColor/UIColor)、画像(NSImage/CGImageRef)、レイヤー(CALayer)、パス(NSStringまたはNSURL)、SpriteKitシーン(SKScene)またはテクスチャ(SKTexture、id またはGLKTextureInfo) 。色に設定されているとアニメーション可能です。 –

+0

ええ、私が「カラーに設定されているときにアニメーション可能」の検索を行っても、このページで見つけることができません:https://developer.apple.com/library/prerelease/ios/documentation/SceneKit/Reference/ SCNMaterialProperty_Class/index.html#// apple_ref/occ/instp/SCNMaterialProperty/contents。これはどこで見ていますか? – alloy