2012-03-03 30 views
1

我正在處理巨大的3D模型,我需要將它們寫入文件供以後使用。我的磁盤空間有限,所以我需要找到節省空間的方法。組合3個花車?

對於我想以某種方式「結合」的模式每個頂點的X,Y和Z值(浮點),然後可以加載數據時要破譯它們。

浮點數將只有最大3位精度(即3.456)。

起初我有想得到平均值,如果3浮點數,然後有另一個值,我可以以某種方式提取X和Y值,然後我可以從平均值得到Z值。但嘗試後,我無法讓它正常工作。

我的目標是能夠在3輛彩車以某種方式合併成一個單一的整數,但我不認爲這是可行的。

有沒有人有任何想法,我該怎麼做呢?

謝謝! ;)

+0

它們是否有某種最大值,例如總是少於10? – Ryan 2012-03-03 22:39:49

+1

非常重複http://stackoverflow.com/questions/9224893/is-it-possble-to-combine-number-of-float-values-into-one-float-value-and-extract儘管語言是不同的。 – 2012-03-03 22:43:36

+0

@minitech不,它全部依賴於3D模型sadly – Alex 2012-03-03 22:46:13

回答

2

如果數字真的有3位精度(例如3.45),並且在0和9.99之間的所有有值,則可以很容易地適合他們在一個單一的32位整數:

int value = 
    (int)Math.Round(x * 100.0) * 1000000 + 
    (int)Math.Round(y * 100.0) * 1000 + 
    (int)Math.Round(z * 100.0); 

如果數字具有4位精度(例如3.456),則需要多位,即至少40位。如果值可能大於9.99,則需要另外6位來描述應該放置小數點分隔符的位置。

1

使用像zlib這樣的壓縮庫通常比試圖聰明地保存位更高效。 (事實上​​,如果你以後決定使用zlib,聰明會傷到你。)

如果你知道你需要的精度,並且所有的3個數字都是相同的比例,你可以存儲一個指數和3個mantissas 。但是我會在採用這種方法之前先嚐試zlib。

我會補充說,zlib的或沒有,這將是有幫助的存儲每個號碼作爲從附近的一些錨點偏移。許多3D模型格式已經通過具有相對定位對象的層次結構來實現這一點。這樣偏移量可以更小,因此對於相同的絕對精度,所需的位數就更少。

0

我不知道CLR如何處理它,但在Ada中,您可以定義定點數值類型,並指定它應該佔用的大小。

type MY_FIXED is delta 0.001 range -4.0..12.0; -- Or whatever your valid range. 
For MY_FIXED'Size use SIZE_IN_BITS; 

你可以得到一個.NET Ada編譯這裏:http://libre.adacore.com/libre/download2

(確保Windows的DOTNET)就是你得到的一個......我沒有做這件事,但我聽說你可以將它集成到Visual Studio中。