- Unity 3Dプロジェクトを作成
- プロジェクトのAssetsディレクトリ内にForceSeatMIディレクトリを作成します。
- 以下のファイルをForceSeatMIディレクトリにコピーしてください(参考として、当社のUnity 3Dサンプルをご確認いただけます)。
- ForceSeatMI.cs
- ForceSeatMI_Common.cs
- ForceSeatMI_Positioning.cs
- ForceSeatMI_Status.cs
- ForceSeatMI_TactileTranscuders.cs
- ForceSeatMI_Telemetry.cs
- ForceSeatMi_UnityAeroplane.cs
- ForceSeatMi_UnityVehicle.cs
| ForceSeatMI APIは、ForceSeatPMソフトウェアの一部としてインストールされるDLLを使用します。お使いのコンピューターにForceSeatPMがインストールされていることを確認してください。 |
アプリケーション:位置制御
例:
- TableLogPos_Unityは、抽象(論理、パーセント)単位での位置決めを示します。
- TablePhyPos_Unityは、実世界の単位(逆運動学)での位置決めを示します。
両方の例で、ForceSeatPMの組み込みプロファイル
SDK – Positioningを使用してください。
位置決めアプリケーションでは、生のForceSeatMI APIを使用する必要があります。一般的な操作手順は次のとおりです。
- ForceSeatMIをインポート
- クラス内にAPIオブジェクト変数を作成します:
private ForceSeatMI m_fsmi;
- Startメソッドで初期化します:
m_fsmi = new ForceSeatMI();
- すべてが読み込まれている場合は、次を呼び出します:
if (m_fsmi.IsLoaded())
{
m_fsmi.BeginMotionControl();
}
- SIMは、以下のいずれかの関数を使用して一定間隔で位置決めデータを送信する必要があります:
m_fsmi.SendTopTablePosLog(...);
m_fsmi.SendTopTablePosPhy(...);
m_fsmi.SendTopTableMatrixPhy(...);
- シミュレーション終了時に次を呼び出します:
if (m_fsmi.IsLoaded())
{
m_fsmi.EndMotionControl();
m_fsmi.Dispose();
}
コード
以下のコードは
TableLogPos_Unityの例からのものです。
// FSMI api
private ForceSeatMI m_fsmi;
// プラットフォームに送信される論理座標での位置
private FSMI_TopTablePositionLogical m_platformPosition = new FSMI_TopTablePositionLogical();
void Start ()
{
// ForceSeatPMのインストールディレクトリからForceSeatMIライブラリを読み込みます
// ForceSeatMI - BEGIN
m_fsmi = new ForceSeatMI();
if (m_fsmi.IsLoaded())
{
// プラットフォームのコンポーネントを検索
m_shaft = GameObject.Find("Shaft");
m_board = GameObject.Find("Board");
SaveOriginPosition();
SaveOriginRotation();
// データ構造をクリアし、正しいサイズを設定して準備します
m_platformPosition.mask = 0;
m_platformPosition.structSize = (byte)Marshal.SizeOf(m_platformPosition);
m_platformPosition.state = FSMI_State.NO_PAUSE;
// デモアプリケーションで変更可能なフィールドを設定します
m_platformPosition.mask = FSMI_POS_BIT.STATE | FSMI_POS_BIT.POSITION;
m_fsmi.BeginMotionControl();
SendDataToPlatform();
// ForceSeatMI - END
}
else
{
Debug.LogError("ForceSeatMIライブラリが見つかりません。ForceSeatPMをインストールしてください。");
}
}
void OnDestroy()
{
// ForceSeatMI - BEGIN
if (m_fsmi.IsLoaded())
{
m_fsmi.EndMotionControl();
m_fsmi.Dispose();
}
// ForceSeatMI - END
}
private void SendDataToPlatform()
{
// パラメータを論理単位に変換
// ForceSeatMI - BEGIN
m_platformPosition.state = FSMI_State.NO_PAUSE;
m_platformPosition.roll = (short)Mathf.Clamp(m_roll / DRAWING_ROLL_MAX * PLATFORM_POSITION_LOGIC_MAX, PLATFORM_POSITION_LOGIC_MIN, PLATFORM_POSITION_LOGIC_MAX);
m_platformPosition.pitch = (short)Mathf.Clamp(m_pitch / DRAWING_PITCH_MAX * PLATFORM_POSITION_LOGIC_MAX, PLATFORM_POSITION_LOGIC_MIN, PLATFORM_POSITION_LOGIC_MAX);
m_platformPosition.heave = (short)Mathf.Clamp(m_heave / DRAWING_HEAVE_MAX * PLATFORM_POSITION_LOGIC_MAX, PLATFORM_POSITION_LOGIC_MIN, PLATFORM_POSITION_LOGIC_MAX);
// データをプラットフォームへ送信
m_fsmi.SendTopTablePosLog(ref m_platformPosition);
// ForceSeatMI - END
}
アプリケーション:車両シミュレーション
例: Telemetry_Veh_Unity(ForceSeatPMの組み込みプロファイル
SDK – Vehicle Telemetryを使用)
車両シミュレーションアプリケーションでは、ForceSeatMI_UnityVehicleヘルパーインターフェースを使用できます。一般的な操作手順は次のとおりです。
- クラス内にAPIオブジェクト変数を作成します:
private ForceSeatMI_UnityVehicle m_Api;
- Startメソッドで初期化します:
m_Api = new ForceSeatMI_UnityVehicle();
- 次を呼び出します:
- SIMは、次の関数を使用して一定間隔でテレメトリデータを送信する必要があります:
- シミュレーション終了時に次を呼び出します:
コード
以下のコードは
Telemetry_Veh_Unityの例からのものです。
private void Start()
{
m_Rigidbody = GetComponent();
// ForceSeatMI - BEGIN
m_Api = new ForceSeatMI_UnityVehicle();
m_Api.Begin();
// ForceSeatMI - END
}
private void OnDestroy()
{
// ForceSeatMI - BEGIN
m_Api.End();
// ForceSeatMI - END
}
private void Move(float steering, float accel, float footbrake, float handbrake)
{
...
// ForceSeatMI - BEGIN
m_Api.Tick(m_Rigidbody, Time.deltaTime, false, 0, 0, m_CurrentGearNumber);
// ForceSeatMI - END
}
アプリケーション:フライトシミュレーション
例: Telemetry_Fly_Unity(ForceSeatPMの組み込みプロファイル
SDK – Plane Telemetryを使用)
フライトシミュレーションアプリケーションでは、ForceSeatMi_UnityAeroplaneヘルパーインターフェースを使用できます。一般的な操作手順は次のとおりです。
- クラス内にAPIオブジェクト変数を作成します:
private ForceSeatMi_UnityAeroplane m_Api;
- Startメソッドで初期化します:
m_Api = new ForceSeatMi_UnityAeroplane();
- 次を呼び出します:
- SIMは、次の関数を使用して一定間隔でテレメトリデータを送信する必要があります:
- シミュレーション終了時に次を呼び出します:
コード
以下のコードは
Telemetry_Fly_Unityの例からのものです。
private void Start()
{
m_Rigidbody = GetComponent();
m_OriginalDrag = m_Rigidbody.drag;
m_OriginalAngularDrag = m_Rigidbody.angularDrag;
// ForceSeatMI - BEGIN
m_Api = new ForceSeatMI_UnityAeroplane();
m_Api.Begin();
// ForceSeatMI - END
}
private void OnDestroy()
{
// ForceSeatMI - BEGIN
m_Api.End();
// ForceSeatMI - END
}
private void FixedUpdate()
{
...
// ForceSeatMI - BEGIN
m_Api.Tick(m_Rigidbody, Time.deltaTime, false);
// ForceSeatMI - END
}