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

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

Page: 1 | 2 |

Re: フライトシミュレータの動作処理がわかりません。 ( No.8 )
名前:softya(ソフト屋) 日時:2012/09/01 00:54

ヒントを書いておくとMV1SetMatrixはモデルに行列を反映する関数です。 それとmat = MMult( mat, matRot );を2回しているので、同じ回転を2回(実際にはもっと複雑な動き)しています。 ベクトルを行列演算するにはVTransformを使います。 同じ構造体上にあってもang.Position と ang.ModelHandleは直接の関連性は全くありません。
Re: フライトシミュレータの動作処理がわかりません。 ( No.9 )
名前:オルゲ 日時:2012/09/01 12:17

ありがとうございます! 2個あるのはすみませんコピペのミスでした。 やはり関連性がなく何も数値が変わらなかったのですね。 VTransformを使いたいと思います。DxLibは本当にありがたいライブラリですね。 softyaさんのアドバイスなしでは前に進めなかったと思います。本当にありがとうございます。
Re: フライトシミュレータの動作処理がわかりません。 ( No.10 )
名前:オルゲ 日時:2012/09/01 19:09

またまた連投です。 ang.Position = VTransform(ang.Position,mat); だとang.positionの数値がおかしくなってしまいます。 ang.Position = VTransform(ang.Position,matRot); だとQuaternion.xyzと同じ数値が入るだけになります。 VTransformには何と何を入れてあげればよいのでしょうか。
Re: フライトシミュレータの動作処理がわかりません。 ( No.11 )
名前:softya(ソフト屋) 日時:2012/09/01 21:26

ang.Positionは現状のモデルの座標では? 座標と移動ベクトルの区別は付いているのでしょうか? これは位置と速度を混同しているのと同じですよ。 必要なものは、 ・機体の現在位置 ・機体の向き ・機体の速度(ベクトル) です。 新しい機体の位置は、現在位置にクォータニオン回転させた機体の速度(ベクトル)を足し込むことで求めます。これを毎フレーム行なって機体の移動をする訳です。実際にはベクトルはもっと複雑になります。 この結果で機体の現在位置を更新、この現在位置に機体の向きの処理をしてMV1SetMatrixで機体モデルに設定してください。
Re: フライトシミュレータの動作処理がわかりません。 ( No.12 )
名前:オルゲ 日時:2012/09/01 22:06

毎回毎回ありがとうございます・・。 ang.Positionは名前がややこしいですが方向ベクトルとして設定したつもりでいます。 現在の位置→jet.Position //と設定しています 機体の向き→ ?  //求め方がわからない!VECTOR構造体になるのでしょうか? 機体の速度→ //向きに速度をかければいいんでしょうか わからないことだらけです。機体の向きってどうやって求めればいいんでしょうか・・。
Re: フライトシミュレータの動作処理がわかりません。 ( No.13 )
名前:softya(ソフト屋) 日時:2012/09/02 09:50

機体の座標や向きは自分できめるんですよ。飛行し始めてからずっと自分で管理しないといけません。飛行開始の向きや座標は自分で決めれますよね。機体の向きはご自分で書いてますがroll,pitch,yawです。 速度も自分の管理ですし、速度を元にZ+方向のベクトルを作り、これを機体の向きのクォータニオンで回して移動ベクトルにします。 なんか凄く3Dの基礎の所なんですが3D空間内で物体を動かすイメージって出来ていますか? 空間に飛行機で飛ばす前に3次元空間の狙った場所に物体を表示、移動、回転できるようになった方が良いでしょう。 例えば、(100,100,100)から(-100,0,50)の直線空間を移動速度3で物体を往復せよ。このとき物体はx軸周りに5度ずつ、y軸周りに3度づつ回転することって問題をすぐ書ける自信はありますか? 【補足】自分で学習方法を構築できる人になってください。基本的にリファレンスしか見ないものとします。 学習方法とは3Dの物体の動きを自分で確かめながら徐々に理解していくことです。 1.物体を3D空間に表示、 2.上下左右前後にキーで移動。 3.物体のローカル回転で自動回転を加える。 4.カメラを移動可能にする。 5.物体を円運動(ワールド回転)せてみる。 6.物体のベクトルで移動できるようにする。 などといった段階を自分で分解して学習するんです。 いきなり本物のゲームを組むのは理解が足らないと難しくて混乱するだけです。 ここも参考になるでしょう。 ttp://i-libro.net/wpmu/blog/archives/category/dx%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA/page/2
Re: フライトシミュレータの動作処理がわかりません。 ( No.14 )
名前:オルゲ 日時:2012/09/02 14:20

アドバイスありがとうございます。 イメージはできていますよ。方向ベクトルに速度やら空気抵抗やら合わせてジェット機をリアルっぽく動かすんですよね。 しかし何度も申しているように方向ベクトルの求め方がわからないのです。 イメージとしては方向ベクトルには(x,y,z)が入り、これらは正規化されているのですよね。 最初にジェット機が向く方向をZ方向だとしておそらく方向ベクトルは(0.0,0.0,1.0)、クォータニオンで例えばpitchのみを回転させて機体が真上を向いたら(0.0,1.0,0.0) となるのですよね。今の例は非常に単純ですので(x,y,z)に入る数字が暗算できるのですが、実際は複雑に回転するので(x,y,z)の中は 何か で求めてあげなければならないと思うのですがその求め方がわからないのです。 この問いにわかりやすい解説をしてもらえると光栄です。
Re: フライトシミュレータの動作処理がわかりません。 ( No.15 )
名前:softya(ソフト屋) 日時:2012/09/02 15:42

No.8 で説明してますが回転したベクトルはVTransformで求めます。 ベクトル(0.0,0.0,1.0*速度)をクォータニオンで求めたマトリクスで回転させるだけです。 No.10のVTransform(ang.Position,matRot); でang.PositionとmatRotの値がちゃんと整っているのならちゃんと計算して回転するはずです。 入っている値や確認方法が間違っていないか理解度が心配でNo.11以降は再度説明をしています。
Re: フライトシミュレータの動作処理がわかりません。 ( No.16 )
名前:オルゲ 日時:2012/09/02 17:22

おおおおおおおおおおおおおおおお できましたあああああああああああああああああああああああああああああああああ ちゃんと回転した方向に動いてるうううううううううう!!! 感動しました!!! softyaさん何日にも渡り適切なアドバイス本当にありがとうございました!!! 完成したらどこかに公開するとおもいますのでぜひ遊んで見てください!
Re: フライトシミュレータの動作処理がわかりません。 ( No.17 )
名前:softya(ソフト屋) 日時:2012/09/02 17:51

フライトシムは、これからが大変なんですけどね。 まだまだこれからですが頑張ってください。
Re: フライトシミュレータの動作処理がわかりません。 ( No.18 )
名前:オルゲ 日時:2012/09/05 19:54

わざわざ新しくスレを建てるのも、と思い再度ここでフライトシミュレータ系の質問をさせてもらいます。 今度は2つの問題に直面しました。 ひとつはカメラです。 レースゲーでいったら車内視点のようにジェット機内に視点を起きカメラをジェット機と同じように回転させようとしています。 DXLibには4つの便利な関数が用意されていますが SetCameraPositionAndTarget_UpVecY SetCameraPositionAndTargetAndUpVec SetCameraPositionAndAngle SetCameraViewMatrix 上記のような動きをしたい場合SetCameraPositionAndTargetAndUpVecを使用すればよいのでしょうか。 もし間違っていたらご指摘お願いします。 もうひとつ問題がございまして、 調子に乗ってマップも読み込み表示させたのですが、なんということでしょう 読み込んだマップもジェット機とまったく同じように動いてしまうのです。マップオブジェクトにある情報は 拡大スケールくらいのはずなのですが、なぜかジェット機と同じ方向に移動してしまいます。 openglで言ったらglPush・popmatrix的なものでくくればいいのでしょうか(DirectXにそんなものがあるかどうかは不明。詳しい方、ジェット機だけを動かす方法をご教授していただきたいですm(_ _)mできれば原因も・。 よろしくお願いします。
Re: フライトシミュレータの動作処理がわかりません。 ( No.19 )
名前:softya(ソフト屋) 日時:2012/09/05 21:43

ヒント1:カメラ SetCameraViewMatrixを使います。 モデルと同じマトリックスが使えるはずです。 ヒント2:マップ マップに変なマトリックスを適用しない限り動くことはありません。 試しに何も設定しないでください。
Re: フライトシミュレータの動作処理がわかりません。 ( No.20 )
名前:オルゲ 日時:2012/09/05 22:11

ソフト屋さんささやかなヒントありがとうございますすうううう。あなたは何者ですか?? ヒント1 色々試してそちらも使ってみて変な感じだったんですが、これからはSetCameraViewMatrixに絞っていきたいと思います。 ヒント2 つまりスケール拡大も取っ払って MVLoadModelとDrawModelだけでやればいいのですか。試してみます。うまくいくといいのですが。。 ありがとうございます!
Re: フライトシミュレータの動作処理がわかりません。 ( No.21 )
名前:オルゲ 日時:2012/09/06 14:04

どうもオルゲです 報告させて頂きますと、 カメラ:matRotをSetCameraViewMatrixに突っ込んでみましたが 変な方向を向いていたり回転が合っていなかったりはしているが、一応どこかを見れている。 真っ暗にはならない。matを放り込むと真っ暗になる。という状況でこれはまぁ色々やってくうちにできそうです。 マップ: 問題は次です やはりMV1LoadModelとDrawModelだけで表示させても ジェット機と一緒に移動してしまうのです。謎です。 while( ProcessLoop() == 0 ) { ScreenFlip(); } 回転やらを↑この中で直接おこなっていなたので ↓ void JET_ANGLE(void){ } というのを作ってその中で回転やらやらせて見ましたが やはりJET_ANGLEとまったく関係ないところで読み込んだマップも動いてしまうんですよねえええええええどういうこっちゃあああああああああ て感じです。 なにか思い当たる節がありましたらどなたかご教授お願いしたします。
Re: フライトシミュレータの動作処理がわかりません。 ( No.22 )
名前:softya(ソフト屋) 日時:2012/09/06 14:29

簡易なデータ付きのソースコードを見ないとなんとも言えないのですが、その前にこういう動作を確認するためのアプローチに問題があります。 ソースコードを公開する前に次の点を見なおしてください。 1.絶対基準となるXYZ軸をDrawCone3Dなどで表示する。 これに対する動きを見ることでカメラが動いているのか物体が動いているのか確認できます。 2.カメラを固定するモードをつける。カメラを固定することで全体の動きを把握できます。 キーで動くとなお良いです。 3.カメラの予定位置に別の物体を代理表示させる。2.と絡みますがカメラが機体位置で動いているか確認できます。 このやりとり続くのなら「C言語何でも質問掲示板」の方が楽だったりするかも知れません。 ※ 「C言語何でも質問掲示板」を使う場合はフォーラムルールを熟読してください。
Re: フライトシミュレータの動作処理がわかりません。 ( No.23 )
名前:オルゲ 日時:2012/09/20 16:05

こんにちは。間が空きましたが投げ出したわけではないオルゲです。 前回の質問の後プログラムを1からスッキリやり直したところ、ジェット機とマップが同じ動きをすると言う現象は 解決いたしました。soft屋さんがおっしゃる通りカメラが動いていたようでした。質問する前に確認できず申し訳ないです。 このたびはまたヒントをいただきたく参上いたしました。 カメラの設定についてです。 以前いただいたヒント SetCameraViewMatrix についてです。 モデルと同じマトリックスが使えると教えていただきましたが          MATRIX mat; MATRIX matRot; MATRIX matTrans; //回転 matRot = QuaternionToMatrix(Quaternion); mat = MMult( mat, matRot ); //以前教えていただいた方向ベクトルの計算のやつ mat1 = VTransform(jet.AnglePosition,matRot);         //移動  matTrans = MGetTranslate( VGet(JETMOVE.x,JETMOVE.y,JETMOVE.z) ); mat = MMult( mat, matTrans ); //ワールド座標に変換 MV1SetMatrix( jet.ModelHandle, mat ); ↑の場合、モデルのマトリックスとは mat という認識でよろしいのでしょうか。 SetCameraViewMatrixにmatを入れると画面が真っ暗になりカメラがどこを向いているのかなどがわからない状況です。もしかしてmatは間違いでしょうか。モデルの中にカメラが入ってしまっているのでしょうか。 他にもSetCameraViewMatrix(MMult(matRot,matTrans)); など試してみましたが、どうもおかしな動きをしてしまいます。 どなたかヒントをご教授いただけると幸いです。
Re: フライトシミュレータの動作処理がわかりません。 ( No.24 )
名前:管理人 日時:2012/09/22 22:37

ご返信をくださっていたsoftyaさんは「C言語何でも質問掲示板」の管理をされていますので、 こちらの掲示板に書かれるよりC言語何でも質問掲示板でご質問をされたほうが早くご返信をいただけると思います <C言語何でも質問掲示板> http://dixq.net/forum/viewforum.php?f=3&sid=c21ea80cac5c4d35975247085b16a230
Re: フライトシミュレータの動作処理がわかりません。 ( No.25 )
名前:オルゲ 日時:2012/09/24 11:04

そうだったんですか。 そちらでもう一度質問させてもらう事にします。
Re: フライトシミュレータの動作処理がわかりません。 ( No.26 )
名前:ふうが 日時:2013/03/01 21:39

どうやって起動するの
Re: フライトシミュレータのダウンロードサイトがわからない ( No.27 )
名前:ふうが 日時:2013/03/01 21:42

ダウンロードさいとどこ

Page: 1 | 2 |