我找到了一种不同的方法来解决我的问题,但我认为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);
}
}
当然,这个解决方案可以进行优化。这只是基本思路。