如何围绕节点的 Y 轴旋转 SKSpriteNode?

Posted

技术标签:

【中文标题】如何围绕节点的 Y 轴旋转 SKSpriteNode?【英文标题】:How to rotate an SKSpriteNode around the node's Y-axis? 【发布时间】:2013-11-21 15:37:27 【问题描述】:

我正在尝试围绕它的 Y 轴旋转一个 SKSpriteNode 节点。我知道有 zRotation 属性,它将顺时针或逆时针旋转节点;但是,我想围绕它自己的 Y 轴旋转节点(例如跳舞的芭蕾舞演员),我似乎找不到任何功能可以这样做。最好的推荐方法是什么?

【问题讨论】:

这称为动画或 3D。你不能在 2D 框架中做 3D。 她站起来了。显然,如果它是自上而下的外观,zRotation 会起作用。 尝试将 xScale 从 1.0 更改为 -1.0,这是最接近 3D 类型旋转的方法 【参考方案1】:
    SKSpriteNode *sprite = [SKSpriteNode spriteNodeWithImageNamed:@"Spaceship"];
    sprite.position = location;
    SKAction* action0 = [SKAction scaleXTo:1.0 duration:0.5];
    SKAction* action1 = [SKAction scaleXTo:0.1 duration:0.5];
    SKAction* action2 = [SKAction scaleXTo:-0.1 duration:0.5];
    SKAction* action3 = [SKAction scaleXTo:-1.0 duration:0.5];

    SKAction* action = [SKAction sequence:@[action0, action1, action2, action3]];
    [sprite runAction:[SKAction repeatActionForever:action]];

    [self addChild:sprite];

这将为您提供看起来像 3D 卡片翻转的效果,但显然,如果您希望对象具有深度,您将无法通过缩放以编程方式获得。

或者更少的动画(正如 LearnCocos2D 建议的那样):

    SKSpriteNode *sprite = [SKSpriteNode spriteNodeWithImageNamed:@"Spaceship"];
    sprite.position = location;
    SKAction* action0 = [SKAction scaleXTo:1.0 duration:0.5];
    SKAction* action1 = [SKAction scaleXTo:-1.0 duration:0.5];

    SKAction* action = [SKAction sequence:@[action0, action1]];
    [sprite runAction:[SKAction repeatActionForever:action]];

    [self addChild:sprite];

【讨论】:

【参考方案2】:

通常,如果我想旋转您所描述的东西,并且希望它看起来不错,我会通过描绘不同旋转度数的精灵帧来实现。

您确实可以通过将 xScale 属性从 1 补间到 -1 来稍微伪造一下,反之亦然。

xScale 技巧可能对卡片(或纸质马里奥)是可行的,但对于芭蕾舞演员来说,则不然。您正在寻找 2D 对象的 3D 旋转,而这不会通过该方法发生。

因此,如果 xScale 技巧无法满足您的需求,您将需要通过精灵帧来处理它。

这是一个 3d SpriteSheet 示例,它可以让您实现所需的旋转:

这个动画 gif 是获得 y 旋转的精灵帧示例:

【讨论】:

【参考方案3】:
SpriteNode *spriteNode = [SKSpriteNode spriteNodeWithImageNamed@"Sprite"];
spriteNode.position = position;

SKAction *action = [SKAction repeatActionForever:[SKAction customActionWithDuration:duration actionBlock:^(SKNode *node, CGFloat elapsedTime) 
    node.xScale = sin(2 * M_PI * elapsedTime / duration);
]];

[self addChild:spriteNode];

但是,精灵看起来没有厚度。

【讨论】:

【参考方案4】:

虽然 SpriteKit 没有完整的 2.5D 功能(沿 X、Y 和 Z 轴旋转和变换),但我已经开发了一种解决方法,用于围绕 X 或 Y 轴旋转 SKSpriteNodes。因为 SKView 是 UIView 的子类,所以我们可以使用 CATransform3D 在 3D 空间中旋转它,就像旋转 UIView 一样。

重点是,需要在Y轴上旋转的精灵生活在自己的场景中,呈现在自己的SKView中。

在循环中触发以下代码将在 y 轴上为您的 SKView(包含 SKScene 和 SKSpriteNode)设置动画。您仍然可以让主场景在后台同时运行,并在 y 轴上交换需要动画的精灵,然后在动画完成时将它们交换出来,并删除 Y 旋转场景。这不是一个很好的解决方案,但在 Apple 增加更好的 2.5D 功能之前,它就是一切。

如果您需要更多信息,我已经编写了关于 SpriteKit 和 2.5D 的教程,其中包含示例代码。 http://www.sdkboy.com/?p=283

self.rotAngle -= 10;

float angle = (M_PI / 180.0f) * self.rotAngle/10;

CATransform3D transform3DRotation = CATransform3DMakeRotation(1.0, angle, 0.0, 0.0);

self.mySKView.layer.transform = transform3DRotation;

【讨论】:

以上是关于如何围绕节点的 Y 轴旋转 SKSpriteNode?的主要内容,如果未能解决你的问题,请参考以下文章

css旋转180度怎么转

ARcore:如何围绕Y轴旋转对象?

如何围绕任意轴旋转一个点?

围绕 X 或 Y 轴旋转的两层视图

围绕 y 轴旋转两个图像,使它们的边界相交

将围绕任意轴的旋转解析为围绕 X、Y 和 Z 轴的旋转