正規化座標 Structured Grid

如果需要在三維空間裡以一個特定的長度來簡化坐標, 我暫且稱呼這個為 Grid based coordinate. (因為不清楚應該怎樣稱呼或許是 Grid Position) 期望有人糾正一下.

這東西該稱呼為 正規化座標, Structured Grid

這邊借 MineCraft 來說明一下情況, 在遊戲世界所有東西都是一個個方格, 那麼…我們該怎樣換算方格放置時對應的格子坐標?

minecraft的圖片搜尋結果

Minicraft 畫面示意圖.

 

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) 來修正這問題… 但這個又會令到負數時的計算不對…
其結果就是分離正負的數字再計算.
所得出的程序碼.

修正 halfExtent 的結果

這是最終的結果.

final result.

以上, 其實有很多字眼也不清楚, 期望有高人指導.

, , , ,

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *

*