2016-09-21 21 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); 

上の計算を行うことを試みたが、数式は正しくありません。 私は何かがある場合、法線、接線、およびbinormalsを浮動小数点数からバイト数にパッキングすることについてお読みになりたいです。

答えて

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; 
bxby、および bzがあなたの入力値がある

、およびdxdy、およびdzがあなたの出力です。これはあなたが期待した値を正確には生成しませんが、になるはずです。

より具体的なものが必要な場合は、例が使用する数字のどこから来たのか、同じベクトルを表す必要があると思われる理由について詳しく説明する必要があります。

+0

私が提供した出力ベクトルは、少し無効にすることができます。あなたの説明は私が見つけることができた最高です、入力ベクトルを正規化することについてインターネットにいくつかの情報がありましたが、それは理解するのに十分ではありませんでした。素晴らしいおかげで、あなたの答えは完璧です! –

関連する問題