2016-09-21 6 views
1

Ich habe 1 Byte Vertex normal (X, Y und Z für jedes). Wie kann ich den Wert von Byte in Gleitkomma übersetzen? Beispiele Bytes in hex:Vertex normal von Byte zu Float

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

Und hier ist der Ausgang in Schwimmers (verwendete Software zur Berechnung): jemand

0.382027 0.718028 0.5818 

Weiß wie kann ich eine Berechnungsformel machen? Ich dachte, es ist einfach eine Aufteilung des Wertes auf 255 (129/255, 238/255 und 191/255), aber es hat nicht funktioniert.

Versucht eine Berechnung auf C#

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

Aber die Formel ist nicht richtig zu machen. Ich würde gerne Packing Normalen, Tangenten und binormals von Float zu Bytes lesen, wenn es etwas zu lesen gibt.

Antwort

0

Ich bin nicht davon überzeugt, dass die Eingabe, die Sie beschreiben, (129, 238, 191), ist in der Tat der gleiche Vektor wie die Ausgabe, die Sie wünschen, (0.382027, 0.718028, 0.5818).

Der Ausgabevektor ist ein Einheitsvektor. I.e. es wurde "normalisiert" und so hat es Länge 1. Theoretisch sollten Sie in der Lage sein, den Eingabevektor in das normalisierte Format zu konvertieren, indem Sie einfach die Komponenten des Eingabevektors durch die Länge dieses Vektors (331.3095) dividieren. Wenn ich das tue, bekomme ich einen normalisierten Vektor von (0.389363997, 0.718361482, 0.576500181).

Der wichtige Hinweis zu diesem Vektor ist, dass die X- und Y-Komponenten größer sind als in der gewünschten Ausgabe, während die Z-Komponente kleiner ist. I.e. Dieser Vektor zeigt einfach nicht in die gleiche Richtung wie die gewünschte Ausgabe.

Es ist möglich, dass in Ihrem Beispielsystem ein Rundungsfehler vorliegt, der diese Diskrepanz berücksichtigt, entweder bei der Konvertierung in das Format byte oder möglicherweise sogar in den Referenzausgangswert. Es gibt nicht genug Informationen in Ihrer Frage, um den Unterschied zu erklären.

Unabhängig davon, scheint es mir klar, dass die grundlegende Umwandlung erfordert nichts weiter als von dem Eingangsvektor in seine normalisierte Form zu konvertieren:

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; 

Wo bx, by und bz sind Ihre Eingabewerte und dx, dy und dz sind Ihre Ausgaben. Dies erzeugt nicht genau die Werte, die Sie erwartet haben, aber ich bin einigermaßen zuversichtlich, dass es die Werte erzeugt, die Sie erwarten sollten .

Wenn Sie etwas genaueres brauchen, müssen Sie Ihre Frage so verbessern, dass sie genauere Informationen darüber enthält, woher die Zahlen kommen, aus denen Ihr Beispiel stammt, und warum Sie glauben, dass sie den gleichen Vektor darstellen.

+0

Das Ding ist Ausgabevektoren, die ich zur Verfügung gestellt werde, kann ein wenig ungültig sein. Ihre Erklärung ist die beste, die ich finden konnte, es gab einige Informationen im Internet über die Normalisierung der Eingabevektoren, aber es war nicht genug zu verstehen. Vielen Dank, Ihre Antwort ist perfekt! –

Verwandte Themen