[英]Data Structure and Algorithm for a 3D Volume?
我一直在修補一些Minecraft Bukkit插件開發,目前我正在開發一些我需要能夠定義空間“體積”並確定實體(播放器)何時從該卷外部移動到內部(或副本)的東西反之亦然)。
如果我將“音量”限制為方框,它應該很簡單。 數據結構可以只維持X / Y / Z邊界整數(因此總共6個整數)並計算兩個點的移入/退出(從移動到移動)應該只是確定A)是否所有三個To值都是在所有三個范圍內和B)至少一個From值超出其相應范圍。
(雖然如果有一種更好,更高效的存儲和計算方法,我會全力以赴。)
但是,如果“音量”不是一個簡單的盒子怎么辦? 假設我有一個形狀奇特的房間,想要封閉那個房間的音量。 我可以單獨排列多個“卷”以填充整個空間,但是當實體從一個實體移動到另一個實體時,這會導致誤報。
以前沒有在游戲或3D引擎上工作,我在如何構建這樣的東西上畫了一個空白。 但是我發現這可能是一個已經解決的問題並且已經確定了已建立的模式。 基本上,我試圖:
是否有既定的模式和做法?
我不知道之前是否已經在任何類型的視頻游戲中使用過,但首先想到的是經典的Eratosthenes實現的Sieve ,唯一的變化就是使boolean
數組3D,並使用鍵作為坐標。 顯然,雖然在Minecraft中x
和y
值可能很大,但您可能希望通過在世界0,0
位置和您的選擇之間保存偏移來節省空間,如下所示:
class OddArea
{
static final int MAX_SELECTION_SIZE = 64; //Or whatever
public final int xOffset, yOffset;
// 256 = Chunk height
public final boolean[][][] squares = new boolean[MAX_SELECTION_SIZE][MAX_SELECTION_SIZE][256];
OddArea()
{
this(0, 0);
}
OddArea(final int xOffset, final int yOffset)
{
this.xOffset = xOffset;
this.yOffset = yOffset;
}
void addBlock(final int x, final int y, final int z)
{
this.squares[x - this.xOffset][y - this.yOffset][z] = true;
}
boolean isInsideArea(final int x, final int y, final int z)
{
return this.squares[x - this.xOffset][y - this.yOffset][z];
}
}
z
不需要偏移,因為Minecraft世界只有256塊高。
我能想到這個設置的唯一問題是你必須在開始填充對象之前知道最低的x
, y
坐標
通常,您應該使用類似於kd樹的數據結構。 您可以將體積表示為立方體或球體的並集,並且應該很容易評估對象是否進入體積。
順便說一句,要計算兩個球是否相交,檢查中心之間的距離是否小於半徑之和。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.