【问题标题】:Converting radian angle to CGVector将弧度角转换为 CGVector
【发布时间】:2013-10-15 16:25:51
【问题描述】:

使用 Sprite Kit 我试图设置一个 SKPhysicsBody 根据给定的角度移动,例如,如果您希望精灵向右移动,您可以指定 1.571 弧度。要将指定的角度转换为速度,我使用以下方法将弧度转换为CGVector。我从记忆中实现的原始版本具有将所有角度偏移 90 度的奇怪效果。 (即如果使用 0 度,则精灵向右移动(就像您指定 90 度时一样)

问题:

我在新版本中通过交换 dxdy 分配修复了这个问题。我的问题是为什么会发生这种情况,我在原件中是否有错误(似乎确实有其他人在网络上这样做)或者是否有基于所使用的特定坐标系的某些原因。

// ORIGINAL
- (CGVector)convertAngleToVector:(CGFloat)radians {
    CGVector vector;
    vector.dx = cos(radians) * 10;
    vector.dy = sin(radians) * 10;
    NSLog(@"DX: %0.2f DY: %0.2f", vector.dx, vector.dy);
    return vector;
}


// NEW, SWAPPED DX & DY
- (CGVector)convertAngleToVector:(CGFloat)radians {
    CGVector vector;
    vector.dy = cos(radians) * 10;
    vector.dx = sin(radians) * 10;
    NSLog(@"DX: %0.2f DY: %0.2f", vector.dx, vector.dy);
    return vector;
}

注意: 同样在 Sprite Kit 中顺时针旋转是负数,到目前为止 convertAngleToVector 正在顺时针正旋转(即 1.571 弧度是正确的,应该在左边)我可以做 @987654328 @ 和 sin(radians*-1) 但基于我交换 dx 和 dy 可能有一些根本原因。

Sprite 工具包(SKView 坐标):

【问题讨论】:

    标签: iphone objective-c sprite-kit skview


    【解决方案1】:

    是的,SpriteKit 默认为右侧。 Physics Collision 示例项目通过实现此方法解决了这个问题:

    - (CGFloat)shipOrientation
    {
        // The ship art is oriented so that it faces the top of the scene, but Sprite Kit's rotation default is to the right.
        // This method calculates the ship orientation for use in other calculations.
        return self.zRotation + M_PI_2;
    }
    

    然后,您可以通过调用以下命令来获取现有方向:

    CGFloat shipDirection = [self shipOrientation];
    

    然后从那里调整 zRotation 属性。

    【讨论】:

      【解决方案2】:

      来自Sprite Kit Programming Guide(已添加重点):

      Sprite Kit 也有一个标准的旋转约定。图 4-2 显示了极坐标约定。 0 弧度的角度指定 x 轴的正方向。 正角度表示逆时针方向。

      在这个坐标系中,一个零弧度指向右边的角度是正确的。如果您想使用一个零角度垂直向上(沿着正 y 轴)并顺时针增加的系统,您需要先转换角度,然后再将它们转换为矢量。

      【讨论】:

        猜你喜欢
        • 2015-11-28
        • 1970-01-01
        • 1970-01-01
        • 2015-05-24
        • 1970-01-01
        • 2020-04-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多