揚力のベクトルを求める。(フライトシミュ)

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Ma

揚力のベクトルを求める。(フライトシミュ)

#1

投稿記事 by Ma » 15年前

今、ちょっと簡易フライトシミュレーターを作るために、(主翼の)揚力が行う力のベクトルを求めようとしています。
(重要視しているのは方向です。)
行列は未学習です。(いずれやりますが)

分かっている情報は、xz座標上の角度(方角:0rad~2πrad)、xz座標に対して作る角度(仰角:-π/2rad~π/2rad)、ひねり角度(ロール角:-π~π)です。

xz座標を地面、yの+方向が宇宙の向きだとすると、この機体の揚力によって発生する揚力のベクトルはどのように求めればいいでしょうか?
(航空力学を使用しなくてOKです。あまり細かい事がからんでくるような航空力学や物理的ではなく、数学的にお願いします。)

行列のほうがはるかに簡単な場合は、行列の勉強を先にやってみようかと思いますが、
他に導く方法はありませんか?ありましたらご指導よろしくおねがいします。


念のため環境:

DXライブラリ 3.01
VC++ 画像

たいちう

Re:垂直なベクトルを求める。

#2

投稿記事 by たいちう » 15年前

基礎的なベクトルの知識のみを使って大雑把な方針を立ててみました。

1.機体の進行方向のベクトルを求める
2.進行方向に垂直な平面を求める
3.垂直な平面上でロール角0の場合の機体の鉛直方向のベクトルを求める
4.垂直な平面上で任意のロール角での機体の鉛直方向のベクトルを求める

簡易版ということなので、まずは4.を揚力と見做して良いでしょう。
再度質問する場合は、どこまでできたかを教えてください。
どの位手を抜いて回答出来るのかがわかります。

softya

Re:垂直なベクトルを求める。

#3

投稿記事 by softya » 15年前

擬似的な計算方法としては、翼平面に対して垂直なベクトルを考えるだけで良いと思います。速度でベクトルは変わりますので、速度1の翼平面の垂直ベクトルを求めて速度係数を掛け算するだけでそれっぽくなるかなって気がしますが、フライト系は作ったことが無いのをお断りしておきます。

まず回転変換する前は、揚力はy軸+の方向に長さ1のベクトルです。ベクトル(0,1,0)ですね。
これを回転変換します。ってところで気づいたのがオイラー角だとジンバルロックの問題があるので、フライトシムはクォータニオンが必要ですね。
http://ja.wikipedia.org/wiki/%E3%82%B8% ... 0%E3%83%AB
ジンバルロック
http://ja.wikipedia.org/wiki/%E3%82%B8% ... 0%E3%83%AB
クォータニオン
http://marupeke296.com/DXG_No10_Quaternion.html
http://www015.upp.so-net.ne.jp/notgeld/quaternion.html

Ma

Re:垂直なベクトルを求める。

#4

投稿記事 by Ma » 15年前

>1.機体の進行方向のベクトルを求める
>2.進行方向に垂直な平面を求める
>3.垂直な平面上でロール角0の場合の機体の鉛直方向のベクトルを求める
>4.垂直な平面上で任意のロール角での機体の鉛直方向のベクトルを求める

1は簡単にできます。
2がよくわかりませんね。
平面における三点から、垂直なベクトルを求められるのは分かるんですが、逆が。。。

ただ、softyaさんが提案してくださったクォータニオンのほうが有力そうなので、ひとまずいまはそちらの方法をやってみます。




>クォータニオン
いま、読んでいます。


R,P,Q はクォータニオン

====転載====
R P Q = (0; 答え)
============


と、ありましたが、
Vが、機体の進行方向のベクトルだとして。
P = (0; V) となり
答えに揚力の方向ベクトルがでるんでしょうけれど、


====転載====
回転の軸が(α, β, γ)で
Q = (cos(θ/2); α sin(θ/2), β sin(θ/2), γ sin(θ/2))
R = (cos(θ/2); -α sin(θ/2), -β sin(θ/2), -γ sin(θ/2))
============

ということは、翼が伸びている向きのベクトルを、(α, β, γ)として、θ=π/2rad
とすれば、いいということなのでしょうか?

(原理はまったく理解していませんがw)

ちょっと実装するコード量がそこそこありそうなので、ここは実験するよりも先に確認のため聞かせていただきました。


ところで、虚数がないのになんで虚部なんていうんでしょうね・・・。 画像

Ma

Re:垂直なベクトルを求める。

#5

投稿記事 by Ma » 15年前

例のサイト
http://www015.upp.so-net.ne.jp/notgeld/quaternion.html

にあるソースコードの一部を流用して、実際にクォータニオンを使ってみました。
働きはある程度理解したつもりです。
(ソースコード内の変数である th,px,py,pz,ax,ay,az を動的に変えて、DXライブラリでそれらのベクトル3つ(元の位置ベクトル、軸ベクトル、結果ベクトル)を表示して、動作を確認しました。)


それで、前に言った方法を早速実装しようとしたんですが、問題がでてきました。

>翼が伸びている向きのベクトルを、(α, β, γ)

機体の方向のベクトルは簡単に求められるのですが、翼の方向にのびるベクトルの求め方がわかりません…。
だって、このベクトルを求めるのにもクォータニオンが必要そうなんですものorz
じゃぁ実際に求めてみようとしたら、回転軸である(α, β, γ)は揚力方向のベクトルですorz

このように、いきづまりました。
どうしたらいいでしょうか?ヒントでもいいのでお願いします。 画像

softya

Re:垂直なベクトルを求める。

#6

投稿記事 by softya » 15年前

あっ、大分進んでますね。
>翼が伸びている向きのベクトルを、(α, β, γ)
あれ?機体に垂直なベクトル(揚力)が欲しかったんでは?
垂直なベクトルは(0,1,0)に速度の係数を掛けたものです。これを3軸で回転変換するだけですよ。
あとは重力加速ベクトルと進行方向ベクトルと合成させれば、飛行機の飛んでいく方向がでます。

Ma

Re:垂直なベクトルを求める。

#7

投稿記事 by Ma » 15年前

>垂直なベクトルは(0,1,0)に速度の係数を掛けたものです。これを3軸で回転変換するだけですよ。
あー、自分はどうやら、難しく考えていたみたいです><
何度か読み直して、考えてみたらできました!

以下、完成したコードです。
関数は
http://www015.upp.so-net.ne.jp/notgeld/quaternion.html
からそのまま使いました。

pppが、完成する揚力ベクトルを持つクォータニオンです。
(rrrとqqqが使い捨てのクォータニオンです。)
vAngle が仰角
hAngle がxz座標上の回転角度
rotAngle がロール角
です。


ppp = PutXYZToQuaternion(0, 1, 0);
//回転軸を、機体のxz座標の角度+90度に指定して、そこから仰角分だけ回転する時に利用するクォータニオンを生成。
qqq = MakeRotationalQuaternion(vAngle, sin(hAngle+PHI_F/2), 0, cos(hAngle+PHI_F/2));
rrr = MakeRotationalQuaternion(-vAngle, sin(hAngle+PHI_F/2), 0, cos(hAngle+PHI_F/2));

//仰角分、回転。
ppp = Kakezan(rrr, ppp);
ppp = Kakezan(ppp, qqq);

//回転軸を機体の進行方向に指定し、ロール各だけ回転時に利用するクォータニオンを生成。
qqq = MakeRotationalQuaternion(rotAngle, sin(hAngle), sin(vAngle), cos(hAngle));
rrr = MakeRotationalQuaternion(-rotAngle, sin(hAngle), sin(vAngle), cos(hAngle));

//ロール分、回転。
ppp = Kakezan(rrr, ppp);
ppp = Kakezan(ppp, qqq);

//揚力のベクトルを表示。
DrawLine3D(VGet(0,0,0),VScale(VGet(ppp.x,ppp.y,ppp.z),10000),GetColor(255,255,255));

//機体のベクトルを表示。
DrawLine3D(VGet(0,0,0),VScale(VGet(sin(hAngle),sin(vAngle),cos(hAngle)),10000),GetColor(255,0,255));

ご協力ありがとうございました!無事解決です。
これから、機体への影響への実装に向かっていきます。

閉鎖

“C言語何でも質問掲示板” へ戻る