VB2010で座標軸の回転 - ジョイスティックを使った点の移動プログラム

このQ&Aのポイント
  • VB2010でジョイスティックを使用して点を移動させるプログラムを作成しています。
  • リーダーとなる点を操作して、他の点もリーダーに追従させる隊形を作りたいです。
  • ジョイスティックを上に動かしたときに、リーダーの向いている方向に前進させる方法がわかりません。座標軸をどのように動かせば良いでしょうか?
回答を見る
  • ベストアンサー

VB 座標軸の回転?

VB2010にて、joystickを使って点を移動するプログラムを作っています。 小さな○を三つ三角形状に配置し、ひとつの○をリーダーとして、これをジョイスティックで操作してその他を○を隊形を持って追従させます。 ジョイスティックを上に倒すと画面上でグループは右に動き、ジョイスティックを右に倒すとグループの中心を軸に位置回転します。 問題はこのあとなんですが、位置回転後の動きでジョイスティックを上に動かしたとき、リーダーの向いている方向に前進させたいのですがどうすればいいでしょうか? 現状では、位置回転した場所から右に動きます。 例えばリーダーの位置が右斜め下にいるのならば、ジョイスティック上で右斜め下に前進するようにしたいのです。 座標軸を動かせばいいのかと思いますが記述の方法がよくわかりません。 解りづらい説明だと思いますので随時補足します。 回答の方をよろしくお願いします。

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

  • ベストアンサー
noname#215107
noname#215107
回答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
質問者

お礼

ありがとうございます。 解決できました。

その他の回答 (1)

  • ki073
  • ベストアンサー率77% (491/634)
回答No.2

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
質問者

お礼

すいません! このページを開きながら別のパソコンでプログラムを書いていたので、リロードをしてなく書き込みに気づきませんでした。 こちらの方法も素晴らしそうですね! 試してみて分からなければ、またOKWaveにて質問をさせていただきますのでその時はよろしくお願いします!

関連するQ&A

  • ジョイスティック(Game VIB Joystick)の軸が直らない

    ジョイスティックのGame VIB Joystickを使っているのですが 方向キーの上を押すと右に行ってしまいます。 コントロールパネルのゲームコントローラーのプロパティのテストでも上を押すと X軸ではなくY軸の移動になってしまいます。 設定でもうまく直せず何かいい方法はありませんか? 他のはちゃんと機能します。

  • 回転した座標軸と一致させるための回転軸と角度の算出

    こんにちは。お知恵をお借りしたく質問致します。 プログラミング中で出た話題なのですが、計算の問題ですので数学カテゴリが適しているだろうと思い、投稿いたします。 ちょっと説明しにくく図を添付致しましたので併せてご覧いただければと思います。(線がふるえていて申し訳ないです。) 図のように、xyz座標を回転してXYZ座標の向きに一致させたいと考えています。 また、「指定した軸(α,β,γ)を回転軸としてθ度回転する」という関数があるので、それを活用しようと考えています。α,β,γはコサイン値(方向余弦)です。回転方向は、ベクトルの向きに時計回り…右ネジの法則みたいな感じです。 x軸から見たXの角度(θxX), y軸からのX(θyX), z軸からのX(θzX) 同様にx軸から見たY(θxY),θyY,θzY、θxZ,θyZ,θzZ といったように、それらの角度(コサイン値)は分かっています。 (=xyz座標からみたXベクトルの方向余弦、Yベクトルの方向余弦、Zベクトルの方向余弦が分かっている。) z軸とZ軸の外積を取ったベクトルを回転軸として、θzZが分かっているのでその角度で回転することでZ軸は一致しますけど、XY軸は合いません。(当然ですが…) そのXY軸を合わせるためにまた回転するというのも遠回りで、任意の軸1本を中心に何度か回転するだけ(上記関数を1度使用するだけ)で、必ず向きが一致する解があると思うのですが、その任意軸と角度を算出する方法が分かりません。 一般にどういう計算をするのでしょうか。アドバイスいただければ幸いです。 なお、上記関数を用いない方法でも構いません。 「X軸(Y軸、Z軸)を回転軸としてφ度回転する」という関数もあるので、オイラー角を求める方法でも構いません。 その他、説明不足な点がありましたら随時追記致しますので、ご指摘願います。 どうかよろしくお願いいたします。

  • 角速度のベクトルの方向は何故回転軸なんでしょうか

    角速度のベクトルの方向は、回転軸になるというのが納得できません。 例えば、極座標系で、ある粒子がZ軸を中心に右周りに半径を変えず回転していたとして、 位置ベクトルが(s,0,z)だとして、 速度ベクトルは(ds/dt, s*(dθ/dt),dz/dt)=(0,s*(dθ/dt),0)になると思うのですが、 この点からしてもZ軸については速度が0のはずです。 粒子が動いているのは勿論θ方向なので、直感的に(0,Ω,0)がしっくりきます。 なのに、速度ベクトルΩが何故(0,0,Ω)になってしまうんでしょうか。。 どなたか分かる方教えてください。よろしくお願いします。

  • 続、VB 座標軸の回転?

    昨日 http://okwave.jp/qa/q7871613.html で質問したものです。 プログラムを作っていて上手に動かないので再度質問です。 xx = x0 - cx yy = y0 - cy x= xx * cosA - yy * sinA + cx y= xx * sinA + yy * cosA + cy x0 = x y0 = y xx:Xの中心からの相対座標 yy:Yの中心からの相対座標 x0:Xの現在地 y0:Yの現在地 cx:三角形の中心X cy:三角形の中心Y x:座標変換後のX y:座標変換後のY 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が求まります。 最初に差し引いた実座標を足して戻して完成です。

  • 1本の軸の上下を左右反対に回す方法

    お分かりの方がおられたらどうぞ教えてください。 1本の金属の軸(棒)があります。 その軸には、上下(軸の上半分の真ん中に一つ、下半分の真ん中に一つ)に1つずつプロペラが固定されています。 通常その軸を右に回すと、上下のプロペラは当然、同方向、右に回転します。 軸(棒)は1本のまま、上と下のプロペラは軸(棒)に完全に固定されていたままで 上のプロペラと下のプロペラを左右反対方向に回す方法はないでしょうか? 軸(棒)の中にもう一本軸を入れたり、真ん中で半分にカットしたりしない方法でお願いします。

  • 自動運転中の各軸位置、速度の独立制御は可能?

    初めて質問します。よろしくお願いします。 主に、各社PLCおよびWindowsソフトの開発などを行っているものですが、 NC設備の開発は今回が2度目で、廻りに質問できる人物がいません。 各軸および、Mコードによる出力の非同期制御?をおこないたのですが、 NC言語での記述がさっぱりわかりません。 FANUC機向け(FANUCSeries16i/18i/21i-MODELB)に近い情報を頂ければ なんとかなりそうです。 <やりたいこと> ・X軸:線形軸)繰り返し往復で位置決め ・Y軸:線形軸)マクロ変数 数個により、随時位置決め      (位置決め動作中に次の位置決めが行うのが理想) ・Z軸:線形軸)マクロ変数により、随時速度変更を行いたい(方向反転も頻繁) ・B軸:回転軸)やりたい内容は前行のZ軸と同じ ・Mコード処理 下記の処理を各軸の位置決め完了まで行わずに 位置決め処理起動と位置、速度変更指令後 処理をグルグル廻して次のブロックへ どんどん移行したいのです(できるだけ滑らかに) <処理概略> 自動開始 ↓←←←←←(1) X軸処理 ↓ Y軸処理 ↓ Z軸処理 ↓ B軸処理 ↓ 周辺処理(Mコードにて) ↓ 終了条件?→no→(1)へ ↓ yes ↓ 完了 こういった処理はNCでは不可能でしょうか? またできたとしても、ハンドル割り込み等が必要なのでしょうか? ラダー/カスタムマクロも作成可能な状況です。 ヒントになる情報だけでも助かりますので宜しくお願いします。

  • AutoCAD 回転させても寸法の位置を左にする方法

    AutoCADで、USC→オブジェクトで、x軸を縦にしたとき、寸法の位置を変えないようにするにはどうしたらよいのでしょうか。例えば長方形を書いて四辺に寸法線を書いたとき、寸法線の上、左に書いてあった寸法値を、上記の方法で回転させても寸法線の上、左のままにしておくような…。以前教えていただいたときはできたような気がしたのですが自分でやってみると寸法値が寸法線の右に移動してしまいます。

  • 3次元座標の求め方

    3次元座標の求め方 原点 0,0,0 を中心にした球体面上の正面から見た頂点座標で、 回転による移動後の座標の求め方を知りたいです。 例えば、球面の半径が 100 で、頂点の座標 x1, y1, z1 が 100, 0, 0 にある場合、 Y軸に対してπ/2 rad (90度)回転した座標 x2, y2, z2 は 0, 0, -100 になると思うのですが、 この新たな3つの座標 x2, y2, z2 を導くにはどのように計算しているのでしょうか。 平面上の円運動のように cos sin の組み合わせ等で導き出せるのでしょうか。 x1, y1, z1 から、 Y軸に対してr回転 した場合の各 x2, y2, z3 の出し方 X軸に対してθ回転 した場合の各 x3, y3, z3の出し方 Z軸に対してΘ回転 した場合の各 x4, y4, z4 の出し方 のような形で、導くための計算を順にお教えいただけると嬉しいです。 最終的には、元座標 x, y, z をY軸にr、更にそこからX軸にθ、更にそこからZ軸にΘで X, Y, Z になる、といった形で求められるようになりたいと思っています。 座標は原点 0, 0, 0を中心に 上に行くほどYが「減少」 右に行くほどXが「増加」 奥に行くほどZが「増加」 Y減少 ↑ _ Z増加 │/` ├─→ X増加 という形になっています 自分のわかる限りで質問内容を細かく記述したつもりですが、 数学の知識に乏しいので、記号などの使い方や説明の不備があるかもしれません。 何か不足があった場合には補足させて頂きます。 以上宜しくお願い致します。

  • 罫線を回転

    エクセルで罫線を90度回転させるマクロを教えてもらいたいのですが。 例えば、選択セルの上・左・下に罫線が引かれている時に実行すると、左・下・右に罫線の位置が変わります。選択セルが複数の場合もあります。 よろしくお願いします。

  • Excelのグラフ「2軸上の折れ線と縦棒」で、折れ線が反映する軸を変更するには?

    ・2軸上の折れ線と縦棒のグラフを作っています。 ・4つの折れ線と、1つの縦棒を作りたいので、  対象となるセル5行6列を選択して、  「2軸上の・・」を選択したグラフ作成をしました。 ・すると、上から3行が縦棒で、下から2行が折れ線 になってしまいます。 ・上から4行を折れ線、下1行を縦棒にしたいので、マクロで Worksheets("ファイル名").ChartObjects(1) _ .Chart.SeriesCollection(1).ChartType = xlLine の構文を用い、 SeriiesCollection(1)から(4)をxLineに、 (5)をxlColumnClusteredにし実行したところ、 上4行を折れ線、下1行を縦棒にすることには 成功しました。 ですがそうなったものの、、上から4行目の折れ線だけが、 右側(Secondary)の縦棒の軸を反映しての折れ線 になってしまいます。 (※折れ線軸(左)は0から100の範囲、  縦棒の軸(右)は0から1000000の範囲なので、  4行目の折れ線(10.0, 12.3, 11.5, ・・・)が、  右軸を反映してまっ平の一直線で表現されてしまいます。  対象の行ごとの問題?グラフのグループ設定の問題?。) そこで、お願いがあります!。 この4行目の折れ線を左側の軸(primary)を反映した 折れ線になる様にするにはどうしたらよいか、 どなたか教えて頂けませんでしょうか。 お手数ですがなにとぞ宜しくお願い申し上げます。