我從-1型的爲1 3個值的27種組合:如何將27個vector3編碼成0-256值?
Vector3(0,0,0);
Vector3(-1,0,0);
Vector3(0,-1,0);
Vector3(0,0,-1);
Vector3(-1,-1,0);
... up to
Vector3(0,1,1);
Vector3(1,1,1);
我需要將它們轉換到和從8位爲sbyte /字節數組。
一種解決方案是說第一個數字,的256 = X的第二個數字是Y和第三個是Z ...
所以
Vector3(-1,1,1) becomes 022,
Vector3(1,-1,-1) becomes 200,
Vector3(1,0,1) becomes 212...
我更願意對其進行編碼以更緊湊的方式,也許使用字節(我無能爲力),因爲上述解決方案使用了大量的乘法和循環函數來解碼,你有一些建議嗎?另一個選項是寫入27條件,如果將Vector3組合寫入數組,看起來效率不高。
感謝惡德的指導下,我改變了代碼有點0-1值添加到第一位,並適應它unity3d:
function Pack4(x:int,y:int,z:int,w:int):sbyte {
var b: sbyte = 0;
b |= (x + 1) << 6;
b |= (y + 1) << 4;
b |= (z + 1) << 2;
b |= (w + 1);
return b;
}
function unPack4(b:sbyte):Vector4 {
var v : Vector4;
v.x = ((b & 0xC0) >> 6) - 1; //0xC0 == 1100 0000
v.y = ((b & 0x30) >> 4) - 1; // 0x30 == 0011 0000
v.z = ((b & 0xC) >> 2) - 1; // 0xC == 0000 1100
v.w = (b & 0x3) - 1; // 0x3 == 0000 0011
return v;
}
非常酷,謝謝,這是非常困難的,如果沒有良好的話題知識。我用xyzw爲vector4更改了代碼。 –
好吧,我有一個錯誤,以轉換vec4版本,我修好了,歡呼聲。 –
@comprehensible:用(v.x << 4)+(v.y << 2)+ v.z + 21'稍快。 –