回転行列
とりあえず、ホントの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が入違っていた。
として計算できるはずです。
ちょっと思い違いしていたみたい。
もう少し考えて再投稿します。
根本的に、回転角変化率を良く考えないとダメだ。
と、思って書き込みを消去しようとしたが、
ほぼほぼ理論通り動作する事が分かった。
うえの行をコピペして極性だけしか修正しなかった。行列式はあっていたのに展開式を間違ったわけだ。
そのままプログラムを組んで確認したら、値が発散してしまい悩んだ。
まぁ、発見したからよかったけどね。