首页 文章

spritekit中不规则形状的物理实体

提问于
浏览
2

我为我的一个物理机构制作了以下代码:

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” . 有没有人看到我的代码有什么问题或者知道为什么这不起作用?如果你需要我指明任何问题,我会很高兴 .

1 回答

  • 2

    我的代码出现以下错误:

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

    以下小代码片段将在您的精灵上绘制轮廓:

    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个点(或者无论你的最大值是多少) .

    这有一个很大的优势,一旦你编码它,你可以完全忘记为你的图形定义多边形轮廓,它们只是在几毫秒内即时计算 .

相关问题