正規化座標 Structured Grid

正規化座標 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.

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

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

*

這個網站採用 Akismet 服務減少垃圾留言。進一步瞭解 Akismet 如何處理網站訪客的留言資料