飛行機の水平器の計算について

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

飛行機の水平器の計算について

#1

投稿記事 by 珈琲 » 10年前

飛行機の水平器のUIを作っているのですが、中々うまくいきません。

飛行機の向きからベクトル(0,-1,0)方向に向くための角度があれば、あとはUIにその回転率を反映させたUIを表示するだけだと思うのですが
飛行機の向きというのが、それぞれのベクトルがその他のベクトルに対して垂直なベクトルで構成されているため用意に回転率を容易に計算出来ません。

このベクトルは飛行機から見て前方、上方、右方の方に向いていてローカルな直座標みたいな感じです。※画像は下方になってますが
画像

質問のイメージ↓垂直なベクトル2つからベクトルの回転値を得られるかというものです。
画像


他に水平器の作り方があれば、教えて下さい。

アバター
usao
記事: 1887
登録日時: 11年前

Re: 飛行機の水平器の計算について

#2

投稿記事 by usao » 10年前

その黄色の回転値=0 のときの,緑と赤のベクトルの向き を算出して,
それとの間の回転量を求めればよいのではないでしょうか.

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: 飛行機の水平器の計算について

#3

投稿記事 by softya(ソフト屋) » 10年前

相対的な回転値って必要なんですか? 相対値を累積すると誤差になりますよ。
絶対的な傾きが分かれば良い気がしますが。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

珈琲

Re: 飛行機の水平器の計算について

#4

投稿記事 by 珈琲 » 10年前

現在の回転値は”不明”で、Z軸の回転は、YベクトルとXベクトルで表現されてます。
これはY軸回転、X軸回転も同じでして、プログラマがZの回転値を0にするには初期化するしかなく、同時にYベクトルとXベクトルが初期化されます。

なので、恐らく回転値を0にする方法=このトピックの質問の答えになると思います・・・


>絶対的な傾きが分かれば良い気がしますが。
確かにそうなんですが、以前の質問
http://dixq.net/forum/viewtopic.php?f=3 ... 30#p107456
で、回答が出ないまま終わってしまったので、以前の相対的な回転値コードにロールバックと言いますか、それで進めてました(^_^;)

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: 飛行機の水平器の計算について

#5

投稿記事 by softya(ソフト屋) » 10年前

単純に考えれば、機体の推進方向のベクトルが分かっているので、そこからのカメラの眼の前にあるジャイロを水平器として描画するだけです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

珈琲

Re: 飛行機の水平器の計算について

#6

投稿記事 by 珈琲 » 10年前

と言うと、方向ベクトルと回転だけで飛行機の制御をしている(可能?)のでしょうか?

珈琲

Re: 飛行機の水平器の計算について

#7

投稿記事 by 珈琲 » 10年前

いや、そうすると歪みというか自由度がうまれるので・・・
2軸決まればいいんでしょうか

珈琲

Re: 飛行機の水平器の計算について

#8

投稿記事 by 珈琲 » 10年前

そういえば、DXライブラリのカメラ関数が対象へのベクトルとカメラの上方向ベクトルの指定というのがあったような。2軸制御は一般的でしょうか?連投失礼

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: 飛行機の水平器の計算について

#9

投稿記事 by softya(ソフト屋) » 10年前

機体の推進軸(機体の姿勢)が計算できているのなら、その回転マトリクスを使って仮想ジャイロの水平線の回転位置を求めれば良いんじゃないかって気がするんですよね。
平面にしたいなら仮想平面にレイを飛ばせば良いだけですし。
作ったことがないから面倒なことを言っているかもしれませんが。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

珈琲

Re: 飛行機の水平器の計算について

#10

投稿記事 by 珈琲 » 10年前

仮想ジャイロというのがよくわかりませんが、回転マトリクスからX,Y成分だけ抽出してコピーすれば、そのマトリクスに対して平面になるという・・・?
行列はただ利用してるだけなのであまり理解できてません。


また仮に、絶対値で方向を持つとしたらどんな要素が必要でしょうか?

個人的には方向ベクトルと軸回転値の2つから方向ベクトルに対して垂直なベクトルが作れたら、そのまま外積で横方向のベクトルも導き出せると思うのですが、どうでしょうか?

ベクトル1が行った回転をベクトル2にもそのまま適用できるのならば、そもそもこんな問題置きないかもしれませんが・・

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: 飛行機の水平器の計算について

#11

投稿記事 by softya(ソフト屋) » 10年前

> ベクトル1が行った回転をベクトル2にもそのまま適用できるのならば、そもそもこんな問題置きないかもしれませんが・・

出来ない理由が分かりません。同じマトリックスを掛けるだけですよね。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

珈琲

Re: 飛行機の水平器の計算について

#12

投稿記事 by 珈琲 » 10年前

おお!
ということは、方向兼変換用ベクトルVと回転率θがあれば
MGetRotX(V.x),MGetRotY(V.y),MGetRotZ(V.z),MGetRotZ(θ)の4つをMMult()した行列と
VGet(1,0,0),VGet(0,1,0),VGet(0,0,1)をVTransform()すれば、
方向ベクトルVに向いてθ回転したそれぞれのRotAxisX,RotAxisY,RotAxisZが出てくるということでしょうか!?

もっと整理して、初期値がZ軸+方向にモデルが向いていて、Y+方向が上だと過程すると
MGetRotVec2( VGet(0,0,1), VGet(0,1,0) ) ;//Z軸からY軸に向くマトリクス
で手に入るマトリクスをMGetRotZ(θ)にMMult()すれば
方向ベクトルVを軸にθ回転した垂直な真上ベクトルを得られるマトリクスが出来て、
そのマトリクスと方向ベクトルをVTransform()して出来たベクトルが、飛行機で言うならコックピット真上だと思うんですけど
これを軸にしてヨーが出来たりそこから更に外積で作ったベクトルを軸にピッチをしたり出来そう、・・・・ですかね?

また、ヨーやピッチをした場合、MGetRotAxis(vector,float)で出来たマトリクスと方向ベクトルVをVTransform()すれば、
反映された方向ベクトルVとそれを軸に回転しているθで運用できると思うのですがどうでしょうか?



過程に過程を重ねて見づらいわかりづらい文章ですが、GOサイン出せるかどうかお願いします。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: 飛行機の水平器の計算について

#13

投稿記事 by softya(ソフト屋) » 10年前

書いてあることがややこして、合っているような、合っていないような感じですね。
簡単に説明すれば進行方向ベクトル回転前の単位ベクトルが(0,0,1)ならば、垂直な単位ベクトル(0,1,0)のベクトルは進行方向ベクトルと同じ回転マトリクスで回転すれば、進行方向に垂直なベクトルのままです。同様に水平なベクトル(1,0,0)は水平なままです。

【補足】
もし、ここから先も作るとすると先にある航空シミュレーション分野はアドバイスは出来ても自信が全くないですね。なんとなくアヤフヤに理解しているだけです。
運動力学(慣性、慣性モーメント)、流体力学、航空力学の世界になります。
なので、物理をまじめに勉強してくださいね。としか言えません。
当然数学の行列より難しい物が出てきます。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

珈琲

Re: 飛行機の水平器の計算について

#14

投稿記事 by 珈琲 » 10年前

なるほどーー!

座標、角度、回転から分解できる7つのスカラー、と、既視感あるなーと思ったら
GRAM さんが書きました: もちろんクオータニオンのほうが変数の総量が少ないというのはありますが。(こっちなら合計7個)
http://dixq.net/forum/viewtopic.php?f=3&t=13354#p107130

とピッタリ一致しますね!
これが正解だかもしれません!

あと肝心なのが進行方向ベクトルに統一するという作業なのですが
珈琲 さんが書きました: ヨーやピッチをした場合、MGetRotAxis(vector,float)で出来たマトリクスと方向ベクトルVをVTransform()して反映させる
というので合っているのでしょうか?
回転値が2倍+今回回転した分とかってなりそうなならないような

珈琲

Re: 飛行機の水平器の計算について

#15

投稿記事 by 珈琲 » 10年前

softya(ソフト屋) さんが書きました: 【補足】
もし、ここから先も作るとすると先にある航空シミュレーション分野はアドバイスは出来ても自信が全くないですね。なんとなくアヤフヤに理解しているだけです。
運動力学(慣性、慣性モーメント)、流体力学、航空力学の世界になります。
なので、物理をまじめに勉強してくださいね。としか言えません。
当然数学の行列より難しい物が出てきます。
本格的な物理が必要なゲームを作るつもりは将来的にも無いです。
といっても、どんなゲームでも行列やベクトル周辺だけは関わらざる負えないと思うので、
最低でもそこら辺は勉強したいと思います。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: 飛行機の水平器の計算について

#16

投稿記事 by softya(ソフト屋) » 10年前

とりあえず試してみて下さい。不安ですが、動かしてみないことには検証出来ません。
MGetRotAxisのMMult順番を間違うとおかしくなるので要注意です。

本当は、機体の挙動はある程度模擬でも良いので、ちゃんと物理運動しないと気持ち悪い動きに成る気がするんですけどね。
気にしない人は気にしないかも知れませんが、機体の移動方向は推力方向ベクトルと現在の機体の慣性ベクトルと重力ベクトルと揚力ベクトルを合成しないといけないとか色々あるんです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
usao
記事: 1887
登録日時: 11年前

Re: 飛行機の水平器の計算について

#17

投稿記事 by usao » 10年前

>その黄色の回転値=0 のときの,緑と赤のベクトルの向き を算出して,
>それとの間の回転量を求めればよいのではないでしょうか.

なんか激しく無視されていますが
やりたいことはこれ↑とは全く違う話なのかどうかだけ教えてください.すっきりしないので.

一応,詳述しときますと,
貼られた図の3色の方向ベクトルをそれぞれ その色で,{現赤,現青,現緑}と書くとすると
私が言っている 黄色回転値=0 のときの赤ベクトル(これを以降 基赤 と書く)というのは,

  現青・基赤 = 0  : 現青と直交していて
  基赤.y = 0  : ワールド座標系において水平で
  |基赤| = 1  : 単位ベクトルである

という3つの条件の満たすものです.これは現青だけから求めることが可能と思います.
で,求めたい黄色回転量というのは,基赤と現赤の成す角度なんじゃないですか? っていうことです.

珈琲

Re: 飛行機の水平器の計算について

#18

投稿記事 by 珈琲 » 10年前

usao さんが書きました: なんか激しく無視されていますが
やりたいことはこれ↑とは全く違う話なのかどうかだけ教えてください.すっきりしないので.
失礼しました。
やりたいことはそれです。

>基赤と現赤の成す角度なんじゃないですか?
と、ということはVDot( VGet(0,1,0) , RedVector )で回転値が得られるということでしょうか?

アバター
usao
記事: 1887
登録日時: 11年前

Re: 飛行機の水平器の計算について

#19

投稿記事 by usao » 10年前

お使いのライブラリ(?)でどう表せばいいのかは知りませんが,理屈がわかれば書けるんじゃないですか?
紙の上で前述3条件の連立方程式を解けば 基赤 が求まるでしょうからそれをそのままコーディングするとか.
後は回転量ですが,おそらく描画のためだけであれば
角度(θ)そのものが得たいのではなくて,その三角関数値(cosθとsinθ)が得られればよい のだと想像するので,
内積と外積からそれらを獲得するなりすればよいのではないでしょうか.

※1:基赤の解は当然2つ存在しますから,どちらの方向が妥当かの判断は必要と思います.(現赤と近い側とかでいいか)
※2:ところで,現青が「真上または真下」のときって,水平器(?)ってどうなればいいんでしょうか? という点(仕様の問題?)もありますよね.

珈琲

Re: 飛行機の水平器の計算について

#20

投稿記事 by 珈琲 » 10年前

ありがとうございます、
ところで、今更ですが
>  現青・基赤 = 0  : 現青と直交していて
>  基赤.y = 0  : ワールド座標系において水平で
>  |基赤| = 1  : 単位ベクトルである
とされましたが
現青・基赤 = 0  : 現青と直交していて
というのは現青・現赤の間違いですよね?
基青・基赤 = 現青・現赤という法則はありますが

アバター
usao
記事: 1887
登録日時: 11年前

Re: 飛行機の水平器の計算について

#21

投稿記事 by usao » 10年前

>現青・基赤 = 0  : 現青と直交していて
>というのは現青・現赤の間違いですよね?

いいえ.

>黄色回転値=0 のときの赤ベクトル
たる 基赤 を求めるという話で連立方程式を立てているのに,基赤が入ってない式であるはずがない.

珈琲

Re: 飛行機の水平器の計算について

#22

投稿記事 by 珈琲 » 10年前

なるほど、勘違いしてました。

'・' というのは内積ですよね
とりあえずじゃないですけど、進行方向ベクトルに基赤ベクトルであるY+方向の単位ベクトルに内積取って試してみたのですが
進行方向ベクトルが水平より上にあるか下にあるかで方向が変わってしまいます。

>※1:基赤の解は当然2つ存在しますから,どちらの方向が妥当かの判断は必要と思います.(現赤と近い側とかでいいか)
の話しだと思うのですが、イマイチ対処できず。。。
計算式は
空方向への角度(ラジアン) = (内積(進行方向ベクトル,Y基)*π/2)
です

珈琲

Re: 飛行機の水平器の計算について

#23

投稿記事 by 珈琲 » 10年前

珈琲 さんが書きました:
もっと整理して、初期値がZ軸+方向にモデルが向いていて、Y+方向が上だと過程すると
MGetRotVec2( VGet(0,0,1), VGet(0,1,0) ) ;//Z軸からY軸に向くマトリクス
で手に入るマトリクスをMGetRotZ(θ)にMMult()すれば
方向ベクトルVを軸にθ回転した垂直な真上ベクトルを得られるマトリクスが出来て、
そのマトリクスと方向ベクトルをVTransform()して出来たベクトルが、飛行機で言うならコックピット真上だと思うんですけど
これを軸にしてヨーが出来たりそこから更に外積で作ったベクトルを軸にピッチをしたり出来そう、・・・・ですかね?

また、ヨーやピッチをした場合、MGetRotAxis(vector,float)で出来たマトリクスと方向ベクトルVをVTransform()すれば、
反映された方向ベクトルVとそれを軸に回転しているθで運用できると思うのですがどうでしょうか?
というのを思い切ってやってみましたが、画面真っ暗になって飛行機の計測系UIがうんともすんとも言わなくなりました(`;ω;´)
主な変更場所はカメラと戦闘機のクラスなんですが、
カメラのマトリクスはプレイヤーの飛行機に依存しているので、恐らく主原因は戦闘機の回転アルゴリズムだと予想してます。

コード:

//方向ベクトル(Direction)と角度(Angle)から
//真上方向と真横方向のベクトルを作る

	MATRIX ZtoY = MGetRotVec2(VGet(0,0,1), VGet(0,1,0));
	MATRIX Theta = MGetRotAxis(VGet(0,0,1) , Angle);

	VECTOR AxisY = VTransform(Direction , MMult(ZtoY,Theta));
	VECTOR AxisX = VCross(Direction,AxisY);
/////////
回転処理とそれぞれの軸で回転した分を方向ベクトル(Direction)に反映

	AxisY=ReactionQuaternion(AxisX,AxisY,TURN_ROT_PITCH*TurnRatePitch);
	Direction=ReactionQuaternion(AxisX,Direction,TURN_ROT_PITCH*TurnRatePitch);
	AxisX=ReactionQuaternion(Direction,AxisX,TURN_ROT_ROLL*TurnRateRoll);
	AxisY=ReactionQuaternion(Direction,AxisY,TURN_ROT_ROLL*TurnRateRoll);
	AxisX=ReactionQuaternion(AxisY,AxisX,TURN_ROT_YAW*TurnRateYaw);
	Direction=ReactionQuaternion(AxisY,Direction,TURN_ROT_YAW*TurnRateYaw);

11,12行目で使用しているReactionQuaternion関数
戻り値は、Axisを軸にしたEffectVectorのRotation分の回転後のベクトル

コード:

VECTOR ReactionQuaternion(VECTOR Axis,VECTOR EffectVector,float Rotation){

	//Q = (q; V) 指定軸の回転
    float rotaq=cos(Rotation/2);
	VECTOR vectq=VGet(Axis.x*sin(Rotation/2),Axis.y*sin(Rotation/2),Axis.z*sin(Rotation/2));

	//R = (r; W) Qのベクトルを反転したもの。
    float rotar=cos(Rotation/2);
    VECTOR vectr=VGet(-Axis.x*sin(Rotation/2),-Axis.y*sin(Rotation/2),-Axis.z*sin(Rotation/2));
	
	//RとPの掛け算をしてCクォータニオンを合成
	float rotac=-VDot(vectr,EffectVector);
    VECTOR vectc=VAdd(VGet(EffectVector.x*rotar,EffectVector.y*rotar,EffectVector.z*rotar),VCross(vectr,EffectVector));

	//CクォータニオンとQクォータニオンを合成してベクトルを返す
	return VAdd(VAdd(VGet(vectq.x*rotac,vectq.y*rotac,vectq.z*rotac),VGet(rotaq*vectc.x,rotaq*vectc.y,rotaq*vectc.z)),VCross(vectc,vectq));

}

ソーン

Re: 飛行機の水平器の計算について

#24

投稿記事 by ソーン » 10年前

横から失礼します。

以前私がフライトシューティングを作った時は、ワールド座標での赤ベクトルの向きを計算し、-asin(red.y) で求めました。
実際に右手を突き出して体を傾けるとわかりやすいと思います。
90°の時が不安なら-atan2(y, hypot(x, y)) で。

珈琲さんの求めるものとは違うかもしれませんが参考までに。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: 飛行機の水平器の計算について

#25

投稿記事 by softya(ソフト屋) » 10年前

ソーン さんが書きました:横から失礼します。

以前私がフライトシューティングを作った時は、ワールド座標での赤ベクトルの向きを計算し、-asin(red.y) で求めました。
実際に右手を突き出して体を傾けるとわかりやすいと思います。
90°の時が不安なら-atan2(y, hypot(x, y)) で。

珈琲さんの求めるものとは違うかもしれませんが参考までに。
実際に作った人の意見のほうが参考になると思います。
私も時間を掛けて実験すれば良い方法も思いつくんでしょうが、時間が取れなくて難しい状況です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

珈琲

Re: 飛行機の水平器の計算について

#26

投稿記事 by 珈琲 » 10年前

ソーン さんが書きました:横から失礼します。

以前私がフライトシューティングを作った時は、ワールド座標での赤ベクトルの向きを計算し、-asin(red.y) で求めました。
実際に右手を突き出して体を傾けるとわかりやすいと思います。
90°の時が不安なら-atan2(y, hypot(x, y)) で。

珈琲さんの求めるものとは違うかもしれませんが参考までに。
ありがとうございます。
一応、色々試してみたのですが
DrawFormatString(200,500,GetColor(255,50,50),"角度 = %f",-asin(DrawUIAircraftObject->AxisX.y)*2);
こんな感じでしょうか、うまく地面もしくは空を指してくれません。
赤ベクトルである、
DrawUIAircraftObject->AxisXは戦闘機からみて真右の単位ベクトルですので、そのままワールド座標のベクトルに持ってきても大丈夫だと思うのですが・・・

-atan2(y, hypot(x, y)) についてはよくわかりません・・・

ソーン

Re: 飛行機の水平器の計算について

#27

投稿記事 by ソーン » 10年前

まるで見当違いでぐちゃぐちゃに値が飛びまくっているのか、傾けるたびにそれっぽく動くけど方向が違うのかなどをお願いします。
 
珈琲 さんが書きました: DrawFormatString(200,500,GetColor(255,50,50),"角度 = %f",-asin(DrawUIAircraftObject->AxisX.y)*2);
*2は何でしょうか。 *180/DX_PI の間違いだと思うのですが。

ソーン

Re: 飛行機の水平器の計算について

#28

投稿記事 by ソーン » 10年前

追記:

atan2はatanを使いやすくしたものです。atan(y/x)だと 0 ~ 90 と -90 ~ -180 の区別が付かないので、atan2(y, x) でその辺も含めて計算してくれます。
hypot(x, y)はsqrt(x*x, y*y)です。距離の判定に便利です。(本当は比較先を二乗した方が高速なのかもしれないけど、大した差はないだろう)

珈琲

Re: 飛行機の水平器の計算について

#29

投稿記事 by 珈琲 » 10年前

機体で回転していると、特定の角度で描画した矢印が逆回転し始めるんですよね・・・なぜ・・・

珈琲

Re: 飛行機の水平器の計算について

#30

投稿記事 by 珈琲 » 10年前

回転と値を観察してみました。
ヨーをして一周しても回転値は変わらず。
ロールをしてみると
正位置:矢印は空を向く

正位置→反時計回りに90度回転:矢印が反時計回りに機体の約四倍の速度で回転する。機体が90度回転した時点で、矢印は空を向く。矢印の回転値は恐らく360度

反時計回りに90度→逆さま:矢印が逆回転し始める(時計回り)。機体が180度回転した時点で、矢印は地面を向く矢印の回転値は前回から180度

逆さま→反時計回りに更に90度:矢印が時計回りで回る。機体が270度回転した時点で、矢印は空を向く。矢印の回転値は前回から180度

正位置へ:矢印が逆回転し始める(反時計回り)。機体が360度回転した時点で矢印は空を向く。矢印の回転値は前回から360度

珈琲

Re: 飛行機の水平器の計算について

#31

投稿記事 by 珈琲 » 10年前

また、ピッチにより矢印の回転はまったくありませんでした。
約45度ロールした状態からの360度ピッチ操作でも操作誤差程度の揺れしかありませんでした。

珈琲

Re: 飛行機の水平器の計算について

#32

投稿記事 by 珈琲 » 10年前

http://kie.nu/1cpA

動画に撮ってみました
youtubeに上げられたらそっちのほうがよかったんですが、久しぶりに見たらgoogleアカウントとかめんどくさそうなのが多くて、すいません。

珈琲

Re: 飛行機の水平器の計算について

#33

投稿記事 by 珈琲 » 10年前

コード:

	int aiu = LoadGraph("img/無題.png");

	DrawRotaGraph(300,300,1.0,-asin(DrawUIAircraftObject->AxisX.y)*DX_PI_F,aiu,0);
	DrawFormatString(200,500,GetColor(255,50,50),"角度 = %f",-asin(DrawUIAircraftObject->AxisX.y)*DX_PI_F);

動画で使用したコードです。

ソーン

Re: 飛行機の水平器の計算について

#34

投稿記事 by ソーン » 10年前

ビデオ拝見しました。アマレコココーデック必要だなんてひどいよー

まず、私が作ったのはそこそこ昔のことなのであいまいな記憶のまま回答したのをお詫びします。

90°を超えた時に反転するのは私のミスです。緑ベクトルのy成分とかで場合分けが必要ですね。

ロールした状態でピッチを入れても変化しないのは「仕様」です。
私が作った時はそれでも問題なかったのですが、一般的な感覚とは違いますね。
ピッチをごちゃごちゃと計算に組み込めば出来ると思うけど自信はないです。

本来の傾きより大きな値で表示されているのはPIをかけているからではないでしょうか。
degreeとradianの違いはご存知でしょうか。コンピュータでは角度は普通ラジアンで扱います。
asinの戻り値もDrawRotaGraphの引数もラジアンです。なので画像を表示するときに *DX_PI_F は必要ありません。
ですが、デバック用に数字で表示するときは[0.8rad]と言われて、「うーん、大体直角の半分か~」などとすぐにわかる人は稀なので度数法に直します。
ラジアンからディグリースへはPIで割って180をかける。逆は180で割ってPIをかけるです。


責任取って真面目に計算してみようかと思います。期待しないで待っていてください。

ソーン

Re: 飛行機の水平器の計算について

#35

投稿記事 by ソーン » 10年前

出来ました。

roll=-atan2(AxisX.y, AxisY.y) です。こんどこそあってるはず。
計算式をアップしました。とはいっても3Dの行列変換を知っていないと難しいと思いますが。
これを機に勉強されてみては。

当然の注意点ですが、真上を向いているときは無理です。式でもゼロ除算となっているのがわかると思います。

http://www1.axfc.net/uploader/so/2982810

珈琲

Re: 飛行機の水平器の計算について

#36

投稿記事 by 珈琲 » 10年前

うわ、出来ました!!!!

おんぶにだっこでしたがめちゃくちゃ助かりました!

AxisX.xとAxisY.yのatan2ですか、atan2は2Dシューティングを作っていた時に何回か使ったことあるのですが、オイラー角でも使えるとは思ってませんでした。

>アマレコココーデック必要だなんてひどいよー
aviって内部でまた種類が分かれてるんでしたっけ・・・、申し訳ありません。

行列、学ばせて頂きます。

ありがとうございました!

閉鎖

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