- ベストアンサー
VB2010で座標軸の回転 - ジョイスティックを使った点の移動プログラム
- VB2010でジョイスティックを使用して点を移動させるプログラムを作成しています。
- リーダーとなる点を操作して、他の点もリーダーに追従させる隊形を作りたいです。
- ジョイスティックを上に動かしたときに、リーダーの向いている方向に前進させる方法がわかりません。座標軸をどのように動かせば良いでしょうか?
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
懐かしいかもしれませんが高校で習ったかもしれない、一次変換の一種である回転変換を使えば可能です。 私は3Dグラフィックスの機能が無い昔のパソコンでで、3Dのアニメーションを作る時によくこの方法を使ったものです。 ●A リーダーを中心に隊列ごと回転する場合。 リーダーの座標を実座標を差し引いて原点(0,0)とし、メンバーの座標をリーダーからの相対座標(x1,y1)(x2,y2)・・・・とします 例えばメンバー(x1,y1)をリーダー中心に半時計周りへ10度回転させた場合の、移動先の座標を(xx1,yy1)とすると・・・ θ=10度(VBではラジアン単位へ変換してください) xx1=x1 * cosθ - y1 * sinθ yy1=x1 * sinθ + y1 * cosθ これで回転して移動した先xx1、yy1が求まります。 最初に差し引いた実座標を足して戻して完成です。 ●B リーダーが向いている方向へ前進したい場合 上記Aで、リーダーがどの角度へ向いているのかが決定しています。 (x,y)=現在の座標 (xx,yy)=前進移動した後の座標 θ=リーダーが向いている角度 D=前進したい距離 xx=x+D*cosθ yy=y+D*sinθ
その他の回答 (1)
- ki073
- ベストアンサー率77% (491/634)
No.1でも良いのですが、もう少し簡単で美しい?方法があります。 三角形が飛行機のように進行方向があるのだと思うのですが、そのような場合ははちょっと発想を変えます。 例えば、まず三角形の回転中心を原点にし、X軸方向に進行方向がある三角形を作ります。これが基本形になります。 そして、その図形を回転させてからその向いている方向に移動させるのではなく、 逆に、基本形をその進行方向であるX軸方向に移動させてから、原点周りに回転させた図形を表示させます。 移動量が0の時は原点で回転しますが、移動量を徐々に増やしていくと、(当然その後に原点の周りに回転させる)、三角形が進行方向に向かって移動するようになります。 三点なので同じ処理をそれぞれにやれば良いのですが、アフィン変換を用いると非常に簡単にできます。 アフィン変換あるいはアフィン行列で検索すれば出てきます。 例えば、 http://ldt.kobe-shinwa.ac.jp/masa/classes/2005fmm/chapter3.html の一番下の方にあります。 一番下の式の二番目の変換に相当するところが回転で、一番目の変換と三番目変換が平行移動になります。 回転と平行移動が行列として別々に書けて、それらの行列の積で順番に移動ができます。 それともう一つアフィン変換の良いところは、 一番目の変換、二番目の変換、三番目変換の行列だけで計算し([x, y, 1]の部分を計算しない)すると3x3の行列ができますが、これをA123とします。その後でA123と[x, y, 1](列ベクトル)との積をとっても同じ結果となります。 質問の内容だと三角形の各座標とA123の積を計算すると全部の点が移動できます、(多くの点があっても簡単な操作で移動できる) ちょっと複雑なように感じるかもしれませんが、実際にやってみれば簡単です。 もし分からないところがありましたら書き込んでください。 アフィン変換は同じようなやり方で三次元にも拡張できますし、拡大縮小や他の変形にも使えますので、一度挑戦されてはいかがでしょうか。 行列の計算ですので、かけ算の順番を入れ替えられませんのでその辺りは注意してください。(数値のかけ算のようには順番を入れ替えられない)
お礼
すいません! このページを開きながら別のパソコンでプログラムを書いていたので、リロードをしてなく書き込みに気づきませんでした。 こちらの方法も素晴らしそうですね! 試してみて分からなければ、またOKWaveにて質問をさせていただきますのでその時はよろしくお願いします!
お礼
ありがとうございます。 解決できました。