SCNMaterialProperty.contents
的文档声明它是一个可动画的属性,实际上我可以在两种颜色之间执行交叉渐变。但是我无法在两张图片之间交叉淡入淡出。
所以我开始怀疑这是否可行,或者我是否需要为此创建自定义着色器?
我尝试过隐式动画,在这种情况下,它会立即显示'after'图像:
.vjs-progress-control {
position: absolute;
bottom: 26px; /* The height of the ControlBar minus 4px. */
left: 0;
right: 0;
width: 100%;
height: 10px; /* the height must be reduced from 30 to 10px in order to allow the buttons below (e.g. play) to be pushed */
}
.vjs-progress-holder {/* needed to have a real 100% width display. */
margin-left: 0px;
margin-right: 0px;
}
显式动画,不执行任何操作:
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
答案 0 :(得分:7)
根据我自己的测试,当涉及纹理值(而不是纯色值)时,看起来这个属性实际上是不可动画的。这可能是SceneKit中的一个错误(即它的目的是可动画,但它不起作用),或者它是Apple的文档中的一个错误(即它的错误)不打算动画,但他们说它是)。无论哪种方式,您都应该file that bug,以便在Apple修复它时收到通知。
(看起来这也不是特定于tvOS的问题 - 我也在OS X上看到它。)
我可以理解为什么动画纹理过渡可能不存在......从GL / Metal角度来看,这需要在过渡期间绑定额外的纹理单元并且每个像素(而不是一个)具有两个纹理查找。
我可以想到几个不错的潜在解决方法:
使用着色器修改器。写一个看起来像这样的GLSL(ish)片段:
uniform sampler2D otherTexture;
uniform float fadeFactor;
#pragma body
vec4 otherTexel = texture2D(otherTexture, _surface.diffuseTexcoord);
_surface.diffuse = mix(_surface.diffuse, otherTexel, fadeFactor);
使用SCNShaderModifierEntryPointSurface
入口点在要设置动画的素材上进行设置。然后使用setValue:forKey:
将SCNMaterialProperty
与otherTexture
和CABasicAnimation
相关联,将fadeFactor
的动画从0设为1。
使用更具动画效果的内容(如SpriteKit场景)作为材质属性内容,并设置动画以执行过渡。 (作为奖励,当你这样做时,你可以使用其他过渡风格。)
答案 1 :(得分:1)
你的动画没有发生,因为"内容"仅当设置为不是图像的颜色时,属性才是动画。您可以在Apple有关内容属性的文档中阅读。