SpriteKit:计算两个纹理遮罩之间的距离

3
我在SpriteKit中有两个不规则的形状,我想计算太空船底部和下方(不规则)地形之间的垂直距离。有没有办法做到这一点?谢谢!enter image description here

如果地形是一个填充多边形,你可以计算距离。 - Epsilon
2个回答

2
将一个形状为线的SKPhysicsBody放置在您的飞船中心,宽度为1,高度与场景相同。然后,在didBeginContact方法中,获取2个接触点。现在您知道了2个点,只需使用距离公式(在这种情况下只是y2-y1),您就得到了答案。

如果您担心身体是全身,而接触点从船的中央到底部抓住每个点的情况,那么答案就是最低y点,并且地面相反,就是最高y点。 - Knight0fDragon
@Knight0fDragon 我猜可以这样做。我原本以为你在说整个场景垂直的那条线 :) - Whirlwind
它不起作用,因为矩形的SKPhysicsBody是刚性的,我的飞船无法向下移动(实际上,它在矩形的顶部像花朵一样在其茎上振荡!) - berfis
你的意思是它不起作用?你所说的两件事都与我的答案无关。 - Knight0fDragon
为什么它会阻止任何事情?确保您只使用碰撞位于希望进行碰撞的对象上。 - Knight0fDragon
显示剩余11条评论

0

我找到了一种不同的方法来解决我的问题,但我认为KnightOfDragon的方法在概念上更好(尽管我没有成功地使它工作)。

地形纹理本质上是一个具有不透明和透明像素的位图。因此,我决定解析这些像素,为每列存储最高的不透明像素,构建一个“雷达高度图”。因此,我只需要计算船底和其正下方中心的列的高度差:

CFDataRef imageData = CGDataProviderCopyData(CGImageGetDataProvider(terrain.texture.CGImage));
const UInt32 *pixels = (const UInt32*)CFDataGetBytePtr(imageData);

NSMutableArray *radar = [NSMutableArray new];
for (long col = 0; col < terrain.size.width; col++)
    [radar addObject:@(0)];

for (long ind = 0; ind < (terrain.size.height * terrain.size.width); ind++)
{
    if (pixels[ind] & 0xff000000) // non-transparent pixel
    {
        long line = ind/terrain.size.width;
        long col = ind - (line*terrain.size.width);
        if ([radar[col]integerValue] <terrain.size.height-line) radar[col] = @(terrain.size.height-line);
    }
}

当然,这个解决方案可以进行优化。这只是基本思路。

我添加了一张图片来展示原始纹理,它的不透明/透明像素表示以及通过放置小白色节点来检查“表面”位置的测试。 enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接