java—从3d图形中获取对象的最有效方法

vuktfyat  于 2021-06-30  发布在  Java
关注(0)|答案(2)|浏览(264)

所以,我在做一个游戏,我有一个问题。我需要一些方法来有效地获取位于三维图形中的对象。
然而,问题是,它们都可以覆盖多个值来获取。例如,值'foo'可能覆盖x范围400-500,y范围10-20和z范围30-60。
我想知道是否有一种更有效的方法来存储和获取这些值,而不是仅仅将它们存储在一个数组中并搜索它们,这是我不愿意做的,因为这些值太多了。
这是为游戏选择生物群落。然而,我选择把这个放在这里与gamedev比较,因为这似乎更像是一个数据结构的问题。不过,我可能错了,如果我是的话,我很乐意把这个关上,把那个打开。
还有别的办法吗?

public static Tile getTile(int height, int moisture, int temperature) {
    for(Tile tile : tileList){

        boolean isTile = true;

        if(!(tile.heightMax > height && tile.heightMin < height)){
            isTile = false;
        }

        if(!(tile.temperatureMax > temperature && tile.temperatureMin < temperature)){
            isTile = false;
        }

        if(!(tile.moistureMax > moisture && tile.moistureMin < moisture)){
            isTile = false;
        }

        if(isTile){
            return tile;
        }
    }
}

这是我的搜索方法。如您所见,我使用一个列表来存储所有的tile,并搜索符合条件的tile。有没有其他的方法来尽可能快地使用许多瓷砖呢?

nnsrf1az

nnsrf1az1#

我不完全确定我是否理解你的问题所在,但它似乎非常类似于三维空间中的碰撞检测算法。如果是这样的话,八叉树可能就是你要找的:http://www.codeproject.com/articles/108761/octrees

f8rj6qna

f8rj6qna2#

我过去解决这个问题的方法是定义表示三维空间区域的区域,然后从对象空间重叠的所有区域存储到每个对象的Map。然后,当您要在某个位置查找对象时,首先使用Map查找与该位置区域重叠的所有对象,然后再遍历这些对象以在该位置查找对象。
让我给你一个代码视图。要构建区域Map,请执行以下操作:

Map<Region, List<Item>> regionMap = new TreeMap<>();

添加项目时:

item.getOverlappingRegions().forEach(region -> {
    if (!regionMap.containsKey(region))
        regionMap.put(region, new ArrayList<>());
    regionMap.get(region).add(item)
});

然后,当您在某个位置搜索项目时:

if (regionMap.containsKey(location.getRegion()) {
    regionMap.get(location.getRegion()).stream()
        .filter(item -> item.contains(location))
        ....
}

这里面肯定有开销,但是如果你的区域足够小的话,搜索速度会非常快。
这是为三维空间设计的,但它可以扩展到您想要的任意多个维度:这都是在实现的 Region 以及 Location 班级。

相关问题