如果需要在三維空間裡以一個特定的長度來簡化坐標, 我暫且稱呼這個為 Grid based coordinate. (因為不清楚應該怎樣稱呼或許是 Grid Position) 期望有人糾正一下.
這東西該稱呼為 正規化座標, Structured Grid
這邊借 MineCraft 來說明一下情況, 在遊戲世界所有東西都是一個個方格, 那麼…我們該怎樣換算方格放置時對應的格子坐標?
public Bounds GetCell(Vector3 point, float halfExtent) { float size = halfExtent * 2f; Vector3 size3D = new Vector3(size, size, size); point = new Vector3( Mathf.Sign(point.x) * (Mathf.Abs(point.x) + halfExtent), Mathf.Sign(point.y) * (Mathf.Abs(point.y) + halfExtent), Mathf.Sign(point.z) * (Mathf.Abs(point.z) + halfExtent)); Vector3 remainder = new Vector3( point.x % size, point.y % size, point.z % size); Vector3 center = point - remainder; return new Bounds(center, size3D); }
其實重點只是簡單的減去 mod 後的餘數. 像這樣.
point.x – (point.x % size)
先假定 size = 1f, point.x = 1.5f
= 1.5f – (1.5f mod 1f)
= 1.5f – 0.5f
= 1f
但這邊還有一點小問題, 就是這像取得結果, 餘數 0.5f 被抹去了.
造成 坐標都在 1f 的時候, 還剛好可以在 size 的範圍內, 超過則變成有間隙的狀態, 直到下一個能夠完整 mod 的坐標以前都是偏移的.
那度 size / 2f 的間隙就是需要修正的東西.
所以我們加上 halfExtent (size/2f) 來修正這問題… 但這個又會令到負數時的計算不對…
其結果就是分離正負的數字再計算.
所得出的程序碼.
這是最終的結果.
以上, 其實有很多字眼也不清楚, 期望有高人指導.