EasyFAQ/90

Last-modified: 2009-08-28 (金) 00:19:21

機体回転時にモデルが激しく揺れます

投稿者あき
重要度
状態
カテゴリ
HSPバージョン3.0
E3Dバージョン
回答

この動画のようなフライトシミュレータを作っています。
http://www.youtube.com/watch?v=Pbjy2ZySxxo
しばらく飛んでいると、旋回時に機体がガタガタと揺れ始めます。
動き方、カメラワークははGENKIさんの「空を飛ぶ」のサンプルを参考にさせていただいています。
機体モデルのローカル座標を回転させ、カメラ位置から機体モデルのベクトルからカメラの上方向を指定しているのですが
機体の向きとカメラの向きがずれている感じです。
あれこれ試しましたが、原因が不明です。
マップ上のX,Y座標値が大きくなると、揺れが激しくなるようです。
アドバイスありましたら、知恵を貸してください。

  • 本格的なフライトシミュですねー。
    >機体モデルのローカル座標を回転させ、カメラ位置から機体モデルのベクトルからカメラの上方向を指定しているのですが
    この辺がよく理解できませんが、症状からするとあれかも…。
    先ずこのスレッド見てください。ここにあるように移動関係のサブルーチンをE3DBeginScene命令の手前に移動してみてください。
    修正しなきゃとは思っているのですがなかなか手が出せず…すみません。 -- GENKI? 2009-08-26 (水) 22:33:42
  • 回答ありがとうございます。
    E3DBeginSceneの手前に移動処理を移すというのは、自分も試していたのですが、
    今回の件には効果がありませんでした。
    判りにくい質問から返答していただいたのに、申し訳ないです。
    カメラ座標と注視点座標の差が大きいとグラフィックのブレが大きいようでした。
    マップ座標上で、滑らかに動く所と激しくブれるところがあるのが謎ですね。
    ありがとうございます!E3DBeginScene -- あき? 2009-08-27 (木) 00:20:03
  • 機体の進行方向が変化しているときにガタガタぶれるようですね。機体とカメラが1フレームずれているのかな…違うか。
    とりあえず思いつく可能性を列挙してみました。チェックしてみてください。
    • E3DSetCameraTargetの引数が整数になっている。(直前の数値をtitleなどで表示してチェック。いつの間にか整数になってることもあります。)
    • カメラの上方向のベクトルが、カメラから注視点までの距離に対して極端に短い。
    • カメラ向きの計算に機体角度変更前の数値を使ってしまっている。 -- GENKI? 2009-08-27 (木) 19:48:27

--カメラの上方向のベクトルが、カメラから注視点までの距離に対して極端に短い。
これが本命のようです。
GENKIさんのスクリプト「空を飛ぶ」を参考にして以下のように書いています。

カメラの注視点と上方向のベクトルを指定する部分。

E3DRotateQLocalX axisqid_cam, -10
E3DSetDirQ2 hsid1, axisqid_cam
E3DPosForward hsid1, -100 ←ココ
E3DGetPos hsid1, cmtposx, cmtposy, cmtposz
E3DSetPos hsid1, saveposx1, saveposy1, saveposz1
E3DSetDirQ2 hsid1, axisqid

E3DSetCameraPos cmpposx, cmpposy, cmpposz
E3DSetCameraTarget cmtposx, cmtposy, cmtposz, cmtposx-saveposx1, cmtposy-saveposy1, cmtposz-saveposz1

赤文字部分の数値を大きく取ると、揺れが軽減されます。
これで解決できる部分はかなり多いです。
ほとんど原因は突き止められました。これはGENKIさんのおかげですね。
ありがとうございます。

問題になるのは
機体座標の値が X=0.0 Y=0.0 Z=0.0のように、小さい場合は非常に滑らかに動きます。
機体座標の値が X=900000.0 Y=1000.0 Z=900000.0のようにマップの逆側を飛ぶとき
揺れが大きくなるところです。これは知恵を振り絞っても解決策が思いつきませんでした。

対処として、
① X=0.0 Y=0.0 Z=0.0が中心になるように、地面をずらす。
② 座標の値が大きくなるマップの末端部分は、高い山や海を配置し、実質行動範囲外とする。
このようにやって見ようと思います。

  • 熱心な回答ありがとうございました。とても心強いです。 -- あき? 2009-08-28 (金) 00:19:21