もきもき3D

アクセスカウンタ

zoom RSS iteminfo->param(PIVOT_ROT)と->limits(ROT)の誤差

<<   作成日時 : 2008/12/22 18:15   >>

ブログ気持玉 0 / トラックバック 0 / コメント 0

 それぞれで取得されるのは->param(ROT)と同様にdouble型のfloat精度値。
 なだけでなく、何か致命的に値が違う('A`)

 試したところ、PI/2(90度)当りFLT_EPSILON足りないのが判明('A`)
 PI(180度)だとFLT_EPSILON * 2。

 PivotRotation 90 0 0で90度を作り、
{
 float f;
 double vec[3];
 itemInfo->param(~, PIVOT_ROT, vec);
 vec[] + FLT_EPSILON;
 f = (float)vec[] * 180.0f / PI_F; // Degreeにして
 vec[] = (double)f * PI / 180.0; // Radianにする
}
 とするとdouble型のdouble精度の妥当なRadian(PI/2)になる。

 但し、任意角度において与えるべき分量が判別つかないからダメポ('A`)
 上記、vec + FLT_EPSILON; の代わりに、
 vec[] = vec[] + (vec[] / (PI - (FLT_EPSILON * 2))) * (FLT_EPSILON * 2);
 とする事で妥当な精度の任意角度におけるRadian値に還元出来る('з`) と思う。
 vec[] = vec[] + (vec[] / (PI/2.0 - FLT_EPSILON)) * FLT_EPSILON; だと除算が足を引っ張るかも。

 param(ROT)の場合はFLT_EPSILONを足さずに(Dbl)Radian→(Flt)Degree→(Dbl)Radian変換するだけでマシな値になる。
 でも↑の加算が判った今では逆に半端な誤差を抱えた嫌な数値に成り下がったけど('A`)

 channelInfo(envelopeFunc)からdoubleのまま取り出せるけど、LW9以前のシーンはFloat記述なのでシーンロード直後はFloat精度値('A`)
 レイアウト下の数値欄からの入力でもFloat精度値(更に90、180度を入力出来ないので論外な機能な気がする(・з・))。

----
 param(ROT)を取り、Degreeが必要な場合は
  f = (float)vec * 180.0f / PI_F; だけでOK。
 param(PIV_ROT)、limits(ROT)の場合は
  vec = vec + (vec / (PI - (FLT_EPSILON * 2))) * (FLT_EPSILON * 2);
  f = (float)vec * 180.0f / PI_F;

 Radianが必要な場合は↑に加え
  vec = (double)f * PI / 180.0;

テーマ

関連テーマ 一覧


月別リンク

ブログ気持玉

クリックして気持ちを伝えよう!
ログインしてクリックすれば、自分のブログへのリンクが付きます。
→ログインへ

トラックバック(0件)

タイトル (本文) ブログ名/日時

トラックバック用URL help


自分のブログにトラックバック記事作成(会員用) help

タイトル
本 文

コメント(0件)

内 容 ニックネーム/日時

コメントする help

ニックネーム
本 文
iteminfo->param(PIVOT_ROT)と->limits(ROT)の誤差 もきもき3D/BIGLOBEウェブリブログ
文字サイズ:       閉じる