#警告
この内容を行うことにより、以下の事態が引き起こされる可能性があります。
・ドローンが常にガタガタ揺れるようになる。修復はできず、アセットの入れ直しの時点から行わないとダメ。
・Unity上でのビルドによって.exeファイルとして出力するできなくなる。(ビルド時にコンパイルエラーが出る、恐らく対処法なし)
これらのことから、この作業を行う前に必ずプロジェクトを複製し、バックアップとして保存しておいてください。
何か問題が起きても、当方は一切の責任を負うことはできませんので、ご了承ください。
##この作業を行う必要性
ご存じの方も多いでしょうが、UnityにはRigidBodyというものが存在します。
RigidBodyは物体に物理特性を与える機能であり、簡潔に言えば「Unityの物理エンジンそのもの」です。通常はこの機能を利用して、あらゆる物理的動作をシミュレートします。
しかし、AirSimは「他の物理エンジンから移植されたもの」であるため、独自で物理的な計算を行っています。
そのため、RigidBodyはドローン本体には一切使うことができません。
無理に使用すると、AirSimの計算と見た目の位置が一致せず、ドローンの挙動が不安定になります。
このためAirSim on Unityではデフォルトで「実行時にRigidBodyの一部機能は強制的にOFFになる」ように設定されています。
ただし、どうしてもRigidBodyで利用可能な機能を利用したい場合もあります。
私の場合は「上下移動の固定」を行いました。目的の達成の為には、この作業は避けて通れませんでしたので…
他にも、「各方向に等速直線運動したい・ワープさせたい」などといったことができるようなります。
##作業内容
DataManager.csを書き換えます。
このファイルは、AirSim\Unity\UnityDemo\Assets\AirSimAssets\Scripts\Utilities上に存在します。
具体的には35~49行目を書き換えます。以下のように記述されている箇所です。
public static void SetToUnity(AirSimVector src, ref Vector3 dst) {
dst.Set(src.y, -src.z, src.x);
}
public static void SetToAirSim(Vector3 src, ref AirSimVector dst) {
dst.Set(src.z, src.x, -src.y);
}
public static void SetToUnity(AirSimQuaternion src, ref Quaternion dst) {
dst.Set(-src.y, src.z, -src.x, src.w);
}
public static void SetToAirSim(Quaternion src, ref AirSimQuaternion dst) {
dst.Set(src.z, -src.x, -src.y, src.w);
}
どうやらDataManager.csは、ドローンに関するデータの受け渡しの役割を担っているようです。
この受け渡している情報を任意の値に変更することで、理想の動作を実現させます。
(少々手荒な手法ですが…)
この4つの値を変更したときの挙動について、調査結果を以下の表に示します。
関数 | 効果 |
---|---|
public static void SetToUnity(AirSimVector src, ref Vector3 dst) | ドローンの位置を固定する。3軸で個別に設定可能。例えば、-src.zに30を設定すれば、高さが30で固定される。 |
public static void SetToAirSim(Vector3 src, ref AirSimVector dst) | 絶対変更してはダメ。ドローンがガタガタ揺れるようになり、後で値を戻しても修正不可 |
public static void SetToUnity(AirSimQuaternion src, ref Quaternion dst) | ドローンの動きを制限する。基本的にSetToUnityの方で代用できるが、src.zを0にすれば回転を制限できるのがメリット。 |
public static void SetToAirSim(Quaternion src, ref AirSimQuaternion dst) | 効果不明。src.wを固定すると上下移動以外できなくなることを確認済み。使わない方が無難 |