• ベストアンサー
  • すぐに回答を!

VB 座標軸の回転?

  • 質問No.7871613
  • 閲覧数783
  • ありがとう数2
  • 気になる数0
  • 回答数2
  • コメント数0

お礼率 72% (200/274)

VB2010にて、joystickを使って点を移動するプログラムを作っています。
小さな○を三つ三角形状に配置し、ひとつの○をリーダーとして、これをジョイスティックで操作してその他を○を隊形を持って追従させます。

ジョイスティックを上に倒すと画面上でグループは右に動き、ジョイスティックを右に倒すとグループの中心を軸に位置回転します。

問題はこのあとなんですが、位置回転後の動きでジョイスティックを上に動かしたとき、リーダーの向いている方向に前進させたいのですがどうすればいいでしょうか?
現状では、位置回転した場所から右に動きます。

例えばリーダーの位置が右斜め下にいるのならば、ジョイスティック上で右斜め下に前進するようにしたいのです。

座標軸を動かせばいいのかと思いますが記述の方法がよくわかりません。

解りづらい説明だと思いますので随時補足します。
回答の方をよろしくお願いします。

質問者が選んだベストアンサー

  • 回答No.1
  • ベストアンサー
懐かしいかもしれませんが高校で習ったかもしれない、一次変換の一種である回転変換を使えば可能です。

私は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θ
お礼コメント
sabrina485

お礼率 72% (200/274)

ありがとうございます。
解決できました。
投稿日時:2013/01/02 19:50

その他の回答 (全1件)

  • 回答No.2

ベストアンサー率 77% (490/633)

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の積を計算すると全部の点が移動できます、(多くの点があっても簡単な操作で移動できる)

ちょっと複雑なように感じるかもしれませんが、実際にやってみれば簡単です。
もし分からないところがありましたら書き込んでください。

アフィン変換は同じようなやり方で三次元にも拡張できますし、拡大縮小や他の変形にも使えますので、一度挑戦されてはいかがでしょうか。
行列の計算ですので、かけ算の順番を入れ替えられませんのでその辺りは注意してください。(数値のかけ算のようには順番を入れ替えられない)
お礼コメント
sabrina485

お礼率 72% (200/274)

すいません!
このページを開きながら別のパソコンでプログラムを書いていたので、リロードをしてなく書き込みに気づきませんでした。

こちらの方法も素晴らしそうですね!
試してみて分からなければ、またOKWaveにて質問をさせていただきますのでその時はよろしくお願いします!
投稿日時:2013/01/02 19:56
結果を報告する
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。
AIエージェント「あい」

こんにちは。AIエージェントの「あい」です。
あなたの悩みに、OKWAVE 3,600万件のQ&Aを分析して最適な回答をご提案します。

関連するQ&A

ピックアップ

ページ先頭へ