我有1个字节的顶点法线(每个的X,Y和Z)。如何将值从byte转换为float? 例如,十六进制的字节:
0x81 0xEE 0BF (129 238 191 in bytes)
这里是float中的输出(用于计算的软件):
0.382027 0.718028 0.5818
有谁知道如何制作计算公式? 我认为它只是255(129 / 255,238 / 255和191/255)的价值划分,但它没有用。
试图在c#
上进行计算normX = rawNormX * (1.0f / 255.0f);
但公式不正确。 如果有什么东西需要阅读的话,我很乐意阅读有关将法线,切线和副法从float转换为字节的信息。
答案 0 :(得分: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;
bx
,by
和bz
是您的输入值,dx
,dy
和dz
是您的输出。这并不能准确地生成您期望的值,但我有理由相信它会产生您应该期望的值。
如果您需要更具体的内容,则必须改进您的问题,以便更详细地说明您的示例所使用的数字来自何处以及您认为它们应代表相同向量的原因。