トップページ > 過去ログ > 記事閲覧
フライトシミュレータの動作処理がわかりません。
名前:オルゲ 日時: 2012/08/30 01:07

 タイトル通りDxLibを使いながらもフライトシミュレータを開発しています。  つぶやき技術メモさんのブログなどを参考に必要な処理と思われるクォータニオンは実装できました。しかしフライトシミュレータは回転するだけではゲームになりません。ジェット機をリアルに飛ばすには何をしてやればいいのでしょうか。クォータニオンから角度を求めればいいのでしょうか、方向ベクトルを求めればいいのでしょうか(求め方もよくわかりませんが)など。  どんな処理が必要になって、何が必要になるか(方向ベクトル、角度とかでしょうか)を教えていただきたいです。できたら具体的なコードも添えてください。よろしくおねがいします。

Page: 1 | 2 |

Re: フライトシミュレータの動作処理がわかりません。 ( No.1 )
名前:softya(ソフト屋) 日時:2012/08/30 11:27

そうですね。 フライトシムの肝の部分のコードは自分で作らないと意味が無いと思うので勉強してもらうとして考え方だけ。 基本的に数学的な部分と運動物理学的な部分の知識が必要です。 それと厳密にやるには相当の知識が必要です。 まず空中の物体は重力に下に引っ張られます。これが下方向のベクトルです。 次に揚力で機体軸の垂直方向に引っ張られます。これが揚力ベクトルです。 あと推力の生み出す機体軸正面の進行方向のベクトルがありますね。 これが基本的なベクトルです。 これにエルロン・ラダー・エレベータのコントロールで生み出されるベクトルがあります。 ここの部分の計算をどうするかは結構問題です。 あとは風などがあると機体はそっちにも押されます。これが風のベクトルです。 以上のベクトルを合成して下さい。それが機体の動きになります。 ただし、機体に形で決まる空気抵抗がありベクトルはその分減少します。 ※ 合成ベクトルの方向で機体に当たる風の方向が変わるので毎回の空気的抵抗は細かくやると変わります。 それと揚力は翼に対する風の流れで決まるのですが厳密にやるとややこしいので、機体軸正面のベクトル成分から計算して揚力を求めて下さい。 「揚力 - Wikipedia」 ttp://ja.wikipedia.org/wiki/%E6%8F%9A%E5%8A%9B ただ揚力をより厳密に計算するには空気の流れをシミュレートとする必要が出てきます。 「飛行の原理」 ttp://w3.ops.dti.ne.jp/~gotha/Aircraft/study1.html#wings1 「航空実用事典」 ttp://w3.jal.com/ja/jiten/dict/p051.html これをある程度シミュレートしないと失速などの減少が再現できません。 がんばってください。 httpとw w wは掲示板の制約で変更してあります。 http→ttp w w w→w3
Re: フライトシミュレータの動作処理がわかりません。 ( No.2 )
名前:オルゲ 日時:2012/08/30 19:32

 softyaさん丁寧にアドバイスして頂きありがとうございます。  もう少し具体的に質問させてもらってよろしいでしょうか。航空力学というよりプログラムの知識になるのですが。 ジェット機は自機後方からジェットを飛ばします。つまりジェットの逆方向がジェット機の向へ前進するのだと思います。 クォータニオンで回転させると、向きも変わります。そうするとそれに対応する前進処理が必要になると思うのですがそれのやり方がわからないのです。 こういうのを向きベクトルと言うのでしょうか。そうなると向きベクトルはどう求めるのか。クォータニオンから求めるのかなどプログラム的な知識を教えていただきたいです。 簡単に言うとクォータニオンから(クォータニオンに対応した?)向きベクトルの出し方でしょうか。こういった知識についてどなたかご教授お願いします。
Re: フライトシミュレータの動作処理がわかりません。 ( No.3 )
名前:softya(ソフト屋) 日時:2012/08/30 21:06

Z方向の奥へ向かう移動ベクトルを自機と同じクォータニオンで回転させれば今現在向いている方向の移動ベクトルが計算できます。 ベクトルは2Dでも使いますが3Dだと使わないと作ることが困難ですから頑張って理解して下さい。 まぁフライトシムをまともに作ろうとすると大学生でも苦しむはずですので難しいのはベクトルの先にあるものですよ。
Re: フライトシミュレータの動作処理がわかりません。 ( No.4 )
名前:softya(ソフト屋) 日時:2012/08/30 21:02

動画のベクトル講座を見つけたので良かったら見て下さい。 ttp://manavee.com/classroom?video_id=590008
Re: フライトシミュレータの動作処理がわかりません。 ( No.5 )
名前:オルゲ 日時:2012/08/31 11:21

softyaさんまたしても丁寧にご回答ありがとうございます! 移動ベクトルを同じように回転させてやればよかったのですね。やってみます! それと講座のサイト初めて知りました。ちょっと長いので全部見きれていませんが参考にします。ありがとうございました。うまくいったら報告したいと思います!
Re: フライトシミュレータの動作処理がわかりません。 ( No.6 )
名前:オルゲ 日時:2012/08/31 22:20

続けて投稿させて頂きます。 ↓を移動ベクトルとして typedef struct{ VECTOR Position ; int ModelHandle ; }ANGLE; void AngleSHOKI(void) { ang.Position = VGet(1.0f,0.0f,0.0f); } ↓クォータニオンのいろいろ。picth,rollなどに数値を入れて回転 //ロール zAxis = VGet(mat.m[2][0], mat.m[2][1], mat.m[2][2]); Quaternion = Quaternion * CreateRotationQuaternion(roll, zAxis); //ピッチ xAxis = VGet(mat.m[0][0], mat.m[0][1], mat.m[0][2]); Quaternion = Quaternion * CreateRotationQuaternion(pitch, xAxis); //ヨー yAxis = VGet(mat.m[1][0], mat.m[1][1], mat.m[1][2]); Quaternion = Quaternion * CreateRotationQuaternion(yaw, yAxis); matRot = QuaternionToMatrix(Quaternion); mat = MMult( mat, matRot ); matRot = QuaternionToMatrix(Quaternion); mat = MMult( mat, matRot ); MV1SetMatrix(ang.ModelHandle,mat); このように回転させているのですが、いくら回転してもang.Position.xyzの数値が変わらず移動ベクトルになってくれません(TwT) ワールド座標とローカル座標?的な問題なのでしょうか。どなたかアドバイスご教授お願いいたしますm(_ _)m
Re: フライトシミュレータの動作処理がわかりません。 ( No.7 )
名前:softya(ソフト屋) 日時:2012/08/31 23:41

これは行列演算をベクトルに適用できていません。 というか、たぶん行列が理解できていないんしょう。 それと構造体自体の理解も怪しいです。 2回やるのも意味不明なのですが、 matRot = QuaternionToMatrix(Quaternion); mat = MMult( mat, matRot ); matRot = QuaternionToMatrix(Quaternion); mat = MMult( mat, matRot ); ang.Position とMV1SetMatrix(ang.ModelHandle,mat);が全く無関係です。

Page: 1 | 2 |