2016-09-21 55 views
1

我有1個字節的頂點法線(每個X,Y和Z)。如何將字節值轉換爲浮點值? 爲例子,字節十六進制:頂點法線從字節到浮點數

0x81 0xEE 0BF (129 238 191 in bytes) 

而這裏的浮法輸出(用軟件計算):

0.382027 0.718028 0.5818 

有誰知道我怎麼能做出一個計算公式? 我認爲這只是255(129/255,238/255和191/255)上的價值分割,但它不起作用。

中爭取在C#

normX = rawNormX * (1.0f/255.0f); 

的計算,但公式是不正確的。 我很想閱讀關於將float,正切和binormal從浮點數打包到字節,如果有任何要讀取的。

回答

0

我不相信你所描述的輸入,(129, 238, 191),實際上是與你想要的輸出相同的向量,(0.382027, 0.718028, 0.5818)

輸出矢量是單位矢量。即它已被「標準化」,所以它的長度爲1。理論上,只需將輸入向量的分量除以該向量的長度(即331.3095),就可以將輸入向量轉換爲規範化格式。這樣做,我得到一個歸一化的矢量(0.389363997, 0.718361482, 0.576500181)

要注意這個向量的重要一點是,X和Y分量比你想要的輸出大,而Z分量更小。即這個矢量並不指向與你想要的輸出相同的方向。

在您的示例系統中,可能會有一些舍入誤差導致這種差異,無論是在轉換爲byte格式還是可能在參考輸出值中。您的問題中沒有足夠的信息來解釋差異。

無論如何,它似乎很清楚,我認爲基本的轉換要求無非就是將來自輸入向量到它的標準形式:

byte bx = 129, by = 238, bz = 191; 
double length = Math.Sqrt((bx * bx) + (by * by) + (bz * bz)); 
double dx = bx/length, dy = by/length, dz = bz/length; 

bxbybz是你的輸入值,並dxdydz是您的輸出。這並不會產生您期望的值,但我相當有信心它會產生您期望的值。

如果您需要比此更具體的任何內容,您必須改進問題,以便它包含有關您的示例使用的數字來自哪裏的更多細節以及爲什麼您認爲它們應代表相同的矢量。

+0

東西是我提供的輸出向量可能有點無效。你的解釋是我能找到的最好的解釋,互聯網上有一些關於歸一化輸入向量的信息,但它不足以理解。非常感謝,你的回答是完美的! –