2016-09-21 5 views
1

У меня есть 1 байт вершин нормальный (X, Y и Z для каждого). Как я могу перевести значение из байта в float? Для примера, байты в шестнадцатеричном:Vertex normal from byte to float

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 до байтов, если есть что прочитать.

ответ

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 - ваши выходы. Это не дает точно значений, которые вы ожидали, но я достаточно уверен, что он дает значения, которые вы должны должен ожидать.

Если вам нужно что-то более конкретное, вам нужно будет улучшить свой вопрос, чтобы он включал в себя больше подробностей о том, откуда берутся ваши примеры, и почему вы полагаете, что они должны представлять один и тот же вектор.

+0

Вещь выведенные векторы, которые я предоставил, могут быть недействительными. Ваше объяснение лучше всего я мог найти, была некоторая информация в Интернете о нормализации входных векторов, но этого было недостаточно, чтобы понять. Большое спасибо, ваш ответ прекрасен! –