Jos*_*les 3 3d animation ios scenekit
我想以编程方式更改使用iOS中的SceneKit渲染的对象的材质。但是我想使用动画图像文件。PNG序列在iOS中可以很好地用于UIImageViews之类的东西-如何将它们用作SceneKit中的材料?
这样的事情不工作:
floor.firstMaterial.diffuse.contents = [UIImage animatedImageNamed:@"ANIMATION_" duration:6.0f];
Run Code Online (Sandbox Code Playgroud)
谢谢!
有一个更简单的解决方案(或者至少我认为它更简单),尽管我无法证明它是否更有效。我已经在iPad mini(第一代)上对其进行了测试,并且效果很好。
您可以在其中放置一个SKScene对象,而不是在材质的内容中放置一个Spritesheet的纹理(并用着色器摆弄)。
这样,您就可以在SKScene中使用SKSpriteNode对象,并使用SCNAction对象为其设置动画。然后,无需触摸着色器代码即可轻松,强大地控制所有动画。
NSArray<SKTexture*> *cursorTextures =
@[
[SKTexture textureWithImageNamed:@"tilecursor1.png"],
[SKTexture textureWithImageNamed:@"tilecursor2.png"],
[SKTexture textureWithImageNamed:@"tilecursor3.png"],
[SKTexture textureWithImageNamed:@"tilecursor4.png"],
[SKTexture textureWithImageNamed:@"tilecursor5.png"]
];
SKSpriteNode *cursorSprite = [SKSpriteNode spriteNodeWithTexture:cursorTextures[0]];
cursorSprite.position = CGPointMake(cursorSprite.size.width/2.0, cursorSprite.size.height/2.0);
[cursorSprite runAction:[SKAction repeatActionForever:[SKAction animateWithTextures:cursorTextures timePerFrame:0.1]]];
SKScene *cursorScene = [SKScene sceneWithSize:cursorSprite.size];
cursorScene.backgroundColor = [UIColor clearColor];
[cursorScene addChild:cursorSprite];
...
self.cursor.material.diffuse.contents = cursorScene;
Run Code Online (Sandbox Code Playgroud)
没有任何东西可以开箱即用。
我会使用着色器修改器来做到这一点。如果将所有图像打包在单个图像中,则可以使用修改器(在入口SCNShaderModifierEntryPointGeometry
点)根据 更新对象的纹理坐标,u_time
以便每隔t ms 使用另一个图像(或图集的子图像)。