簡體   English   中英

從3D圖形獲取對象的最有效方法

[英]Most efficient way to get an object from a 3D Graph

所以,我在做游戲,但遇到了問題。 我需要一些方法來有效地獲取位於3d圖形中的對象。

但是,問題在於它們全都可以涵蓋不止一個價值。 因此,例如,值'foo'可能涵蓋x范圍400-500,y范圍10-20和z范圍30-60。

我想知道是否存在一種更有效的方式來存儲和獲取它們,然后僅將它們存儲在Array中並對其進行搜索,由於這些值很多,我不希望這樣做。

這是用於為游戲選擇生物群系。 但是,我選擇將其與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;
        }
    }
}

這是我的搜索方法。 如您所見,我正在使用一個列表來存儲所有圖塊,並在搜索符合條件的圖塊。 還有其他方法可以盡快處理許多圖塊嗎?

我過去解決此問題的方法是定義代表3D空間區域的區域,然后從對象空間重疊的所有區域存儲到每個對象的地圖。 然后,當您要在某個位置查找對象時,請先使用地圖查找與該位置的區域重疊的所有對象,然后遍歷它們以在該位置查找對象。

讓我給您一個代碼視圖。 要構建區域地圖:

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))
        ....
}

這肯定有開銷,但是如果您的區域足夠小,則搜索非常快。

這是為3D空間設計的,但可以根據需要擴展為任意尺寸:全部在RegionLocation類的實現中。

我不能完全確定我是否了解您的問題,但它似乎與3D空間中的碰撞檢測算法非常相似。 如果是這種情況,八進制可能就是您要查找的內容: http : //www.codeproject.com/Articles/108761/Octrees

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM