これはまさしくバグですね。(^_^;)遅レスですみません。
DegNormalize は入力を 0 <= θ < 360 の範囲へ周期的にマッピングする関数ですが、
おっしゃるとおり SinCos はラジアンを入力とする関数ですし、
どんな値を入れようとも周期的な回転角として解釈されるので、
そもそも予め正規化する意味がない。
もっとも、DegToRad を入れる対処でも構いませんが、
やはり座標変換系はすべてラジアンに統一した方が効率的だと思うので、
ただ単に DegNormalize を削除してしまった方がいいと思います。
SinCos( angle, Sin, Cos );
ちなみに XE5 では、Types3D にあった座標変換系の関数がゴソッとなくなり、
各構造体のメソッドして統合されました。
・FMX.Types3D @ XE4
http://docwiki.embarcadero.com/Libraries/XE4/ja/FMX.Types3D
・FMX.Types3D @ XE5
http://docwiki.embarcadero.com/Libraries/XE5/ja/FMX.Types3D
・System.Types.TMatrix3D @ XE4
http://docwiki.embarcadero.com/Libraries/XE4/ja/System.Types.TMatrix3D
・System.Types.TMatrix3D @ XE5
http://docwiki.embarcadero.com/Libraries/XE5/ja/System.Types.TMatrix3D
・System.Types.TVector3D @ XE4
http://docwiki.embarcadero.com/Libraries/XE4/ja/System.Types.TVector3D
・System.Types.TVector3D @ XE5
http://docwiki.embarcadero.com/Libraries/XE5/ja/System.Types.TVector3D
RotateVector は Rotate というメソッドになり、バグも直っているようです。
▼ System.Types @ XE5
> function TVector3D.Rotate(const AAxis: TPoint3D; const AAngle: Single): TVector3D;
> begin
> Result := Self * TMatrix3D.CreateRotation(AAxis, AAngle);
> end;
> class function TMatrix3D.CreateRotation(const AAxis: TPoint3D; const AAngle: Single): TMatrix3D;
> var
> NormAxis: TPoint3D;
> Cosine, Sine, OneMinusCos: Single;
> begin
> SinCosSingle(AAngle, Sine, Cosine);
> OneMinusCos := 1 - Cosine;
> NormAxis := AAxis.Normalize;
>
> Result := Identity;
> Result.m11 := (OneMinusCos * NormAxis.X * NormAxis.X) + Cosine;
> Result.m12 := (OneMinusCos * NormAxis.X * NormAxis.Y) - (NormAxis.Z * Sine);
> Result.m13 := (OneMinusCos * NormAxis.Z * NormAxis.X) + (NormAxis.Y * Sine);
> Result.m21 := (OneMinusCos * NormAxis.X * NormAxis.Y) + (NormAxis.Z * Sine);
> Result.m22 := (OneMinusCos * NormAxis.Y * NormAxis.Y) + Cosine;
> Result.m23 := (OneMinusCos * NormAxis.Y * NormAxis.Z) - (NormAxis.X * Sine);
> Result.m31 := (OneMinusCos * NormAxis.Z * NormAxis.X) - (NormAxis.Y * Sine);
> Result.m32 := (OneMinusCos * NormAxis.Y * NormAxis.Z) + (NormAxis.X * Sine);
> Result.m33 := (OneMinusCos * NormAxis.Z * NormAxis.Z) + Cosine;
> end;
> procedure SinCosSingle(const Theta: Single; var Sin, Cos: Single);
> var
> {$IF SizeOf(Extended) = 10}
> S, C: Extended;
> {$ELSE}
> S, C: Double;
> {$ENDIF}
> begin
> System.SineCosine(Theta, S, C);
> Sin := S;
> Cos := C;
> end;
+───────────────────────+
│■ 中山雅紀 ( Nakayama Masanori ) │
│・mail:
con...@luxidea.net │
│▽ 慶應義塾大学大学院 理工学研究科 藤代研究室 │
│・site:
http://www.fj.ics.keio.ac.jp/ │
│・mail:
naka...@fj.ics.keio.ac.jp │
+───────────────────────+
--------------------------------------------------------------------------------
http://ad.freeml.com/cgi-bin/sa.cgi?id=kvgEe
------------------------------------------------------[freeml byGMO]--