3Dで回転・縮小・拡大させるための行列計算を四則演算だけで実現 か? | 秋葉は外神田ですがなにか?

秋葉は外神田ですがなにか?

ガッチャマン背景だったものを、映画不振とは関係なく、
ふつーのCoolTypeに変更しました。
少しは文字が読みやすくなったのではないでしょうか?
・・・と、思ったけど、やっぱりガッチャマンにもどしました。2013.10.15
※トップページ放置確認w2021.Aug

回転行列

 

とりあえず、ホントの3X3行列は計算量多くなるので、

X-Y平面プラスZ軸移動は平行移動で拡縮のみで考える。

DirectXみたいな4次元配列計算だと高速算術エンジン積んでいればいいのでしょうが、

2次元プラスαな私の頭では計算できないArduinoの非力なCPUではサクサク表示

できなさそう。

なので、頭をひねってみた。

 

 2次元回転

 行列A =

  X     Cosθ -Sinθ    x

          =       *

  Y       Sinθ   Cosθ   y

 

     

 2次元拡縮

 行列B =

  X   ax  0   x

    =      *

  Y   0  ay   y

 

 

回転しながら拡大縮小させる場合、

 A*B か、B*A で計算すして、

連続で表示させる。

 

A ;

 X = Cosθ*x  -Sinθ*y

 Y = Sinθ*x +Cosθ*y

 

B ;

 X = ax*x

 Y = ay*y

 

A*B ;

 X = ax*Cosθ*x  -Sinθ*y

 Y = Sinθ*x +ay*Cosθ*y

 

----------------

さて、 回転するピッチを一定にすると考える。

また、 回転後の座標を再度回転させることを考える。

 

すると、高速計算化メリットがある。

回転角の変化が時間に対して一定=各速度一定とするとだなぁ、

θの値が固定されるので、三角関数の値を固定値として設定できる。

デメリットもある。計算誤差が累積されて、想定した回転の効果を得られない可能性がある。

なので、やってみなければわからない。 ので やってみる。

回転角θを1度として計算すると、

  Cosθ = 0.99985 =C0

  Sinθ  = 0.01745 =S0

 X = ax*C0*x -      S0*y

 Y =      C0*x +ay*S0*y  ←これが間違っていた

 Y =      S0*x +ay*C0*y  ←SinとCosが入違っていた。

として計算できるはずです。

 

ちょっと思い違いしていたみたい。

もう少し考えて再投稿します。

根本的に、回転角変化率を良く考えないとダメだ。

 

と、思って書き込みを消去しようとしたが、

ほぼほぼ理論通り動作する事が分かった。

うえの行をコピペして極性だけしか修正しなかった。行列式はあっていたのに展開式を間違ったわけだ。

そのままプログラムを組んで確認したら、値が発散してしまい悩んだ。

まぁ、発見したからよかったけどね。