【问题标题】:Physics bodies for irregular shapes in spritekitspritekit中不规则形状的物理体
【发布时间】:2014-03-14 21:37:24
【问题描述】:

我为我的一个物理实体编写了以下代码:

    CGFloat offsetX = ship.frame.size.width * ship.anchorPoint.x;
    CGFloat offsetY = ship.frame.size.height * ship.anchorPoint.y;

    CGMutablePathRef path2 = CGPathCreateMutable();

    CGPathMoveToPoint(path2, NULL, 10 - offsetX, 1 - offsetY);
    CGPathAddLineToPoint(path2, NULL, 8 - offsetX, 12 - offsetY);
    CGPathAddLineToPoint(path2, NULL, 10 - offsetX, 14 - offsetY);
    CGPathAddLineToPoint(path2, NULL, 10 - offsetX, 37 - offsetY);
    CGPathAddLineToPoint(path2, NULL, 5 - offsetX, 44 - offsetY);
    CGPathAddLineToPoint(path2, NULL, 0 - offsetX, 36 - offsetY);
    CGPathAddLineToPoint(path2, NULL, 0 - offsetX, 16 - offsetY);
    CGPathAddLineToPoint(path2, NULL, 2 - offsetX, 11 - offsetY);
    CGPathAddLineToPoint(path2, NULL, 0 - offsetX, 1 - offsetY);
    CGPathAddLineToPoint(path2, NULL, 0 - offsetX, 0 - offsetY);
    CGPathAddLineToPoint(path2, NULL, 10 - offsetX, 0 - offsetY);

    CGPathCloseSubpath(path2);

    ship.physicsBody = [SKPhysicsBody bodyWithPolygonFromPath:path2];

这对我来说似乎很好,但每当我运行它时,我都会收到一条错误消息:“线程 1:信号 SIGABRT”。 有没有人看到我的代码有什么问题或者知道为什么这不起作用? 如果您需要我指定任何内容,请直接询问,我会很乐意。

【问题讨论】:

  • 了解如何使用 UIBezierPath。
  • 多边形必须是凸的,并且点按逆时针顺序

标签: sprite-kit skphysicsbody


【解决方案1】:

您的代码出现以下错误:

断言失败:(区域 > 1.19209290e-7F),函数 ComputeCentroid,文件 /SourceCache/PhysicsKit/PhysicsKit-6.5.4/PhysicsKit/Box2D/Collision/Shapes/b2PolygonShape.cpp,第 122 行。

以下小代码 sn-p 将在您的精灵上绘制轮廓:

        SKShapeNode *outline = [SKShapeNode node];
        outline.name = @"outline";
        outline.path = path2;
        [outline setLineWidth:0.5];
        [outline setStrokeColor:[UIColor cyanColor]];
        [self addChild:outline];

错误很明显:你的多边形轮廓不是凸的,它在导弹形状的尾部进出。

如果您不知道,快速谷歌会解释凸的含义: http://www.mathopenref.com/polygonconvex.html

我在自己的应用中采用的一种更有趣的方法是从图像位图自动生成物理轮廓。

这个太复杂了,这里就不详细贴了,但是算法的工作原理如下:

  • 沿位图轮廓生成点(我通过跟踪从外部到中心的光线来找到在任何给定方向上最远的点)。

  • 枚举所有点,并删除距离由其两个相邻点定义的线段的最小距离以下的任何点。

  • 删除所有非凸点(即:如果线段向右弯曲,则使用点积)

  • 增加容差并迭代,直到我们的点数少于 12(或您的最大值)。

这具有很大的优势,即一旦您对其进行编码,您就可以完全忘记为图形定义多边形轮廓,它们只是在几毫秒内即时计算出来的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多