VR モード内を足で操作して移動する
2017年11月21日

VR モード内を足で操作して移動する

作成 Matthieu Vivant

3dRudder は、座ったまま足でコントローラを操作して VR モード内を移動できる VR モーション コントローラーです。オブジェクトの選択、カスタマイズ、移動をハンズフリーで行うことができます。VR 以外のゲームと VR ゲームの両方で 3dRudder で行える 3 種類のロコモーション (歩く / 走る、ホバー、飛行) について、様々な VR プロジェクトで UE4 の自分たちのプラグインをテストしながら、アンリアル エンジンの VR モードを使い始めました。この素晴らしい VR モードを使い始めてすぐに、自分たちのプラグインをアンリアル エンジンのエディタに取り込み、シーンを移動する斬新な方法を提供して新たな価値を加えることができると考えるようになりました。770_3DRudder_Pic1.jpg 現在、VR モードでシーンを移動する方法は手を使って押したり引いたりするというものですが、もっと自然に動ける方法を使ってみたらどうでしょう?3dRudder を VR モードに統合することで、以下を実現することを目指しました。

 

  • シーンを直観的に動きまわり、ホバーして観測点を簡単に決められるようにすること。
  • VR をセットアップした現場に行くのではなく、デスクに座ったまま作業を続けて、エディタと VR モードとの間で簡単に切り替えられるようにすること。
  • ルーム スケールによる制約を受けないこと。
  • ハンド コントローラーが必要なのはオブジェクトの選択、カスタマイズ、移動のみであること。

 

VR モードの統合と合わせて、UE4 の標準エディタ内を、キーボード / マウス、ジョイスティック (XInput) 以外にも足で操作して移動できる機能もあります。
3dRudder を VR モードに統合する

3dRudder を VR モードに統合するには、VR モードを処理するためのコードを自分たちの既存の UE4 プラグインに追加する必要がありました。 
770_3DRudder_Pic2.jpg
エディタのプラグインを作成するために、Creating Editor Module の wiki に従いました。

最初のステップは以下のように 3dRudder Editor Moduleを作成することでした。

1. このエディタのモジュールを 3dRudder.uplugin:
に追加します。 
{
 "Name": "_3DRudderEditor",
 "Type":"Editor",
 "LoadingPhase":"PostEngineInit",
 "WhitelistPlatforms": [ "Win64", "Win32" ]
}

2.以下のように Unreal Editor (UnrealEd) を _3dRudderEditor.build.cs:
の依存関係として追加します。 
PublicDependencyModuleNames.AddRange( new string[] {
    "Core", 
    "CoreUObject",      // Provides Actors and Structs
    "UnrealEd",
});


3.以下から継承する F3DRudderEditorModule クラスを作成します。

a.モジュールを登録、開始、停止させる IModuleInterface
b.各フレームでティックし、3dRudder の入力軸の値を取得し、ビューポート カメラを更新する FTickableEditorObject
 
void F3DRudderEditorModule::Tick(float DeltaTime)
{
    //UE_LOG(_3DRudderEditor, Warning, TEXT("tick %f"), DeltaTime);
    // 3dRudder SDK
    ns3dRudder::CSdk* pSdk = ns3dRudder::GetSDK();
    // Mode : curve
    ns3dRudder::ModeAxis mode = ns3dRudder::ValueWithCurveNonSymmetricalPitch;
    // Curves for each axis (Pitch, Roll, Yaw, UpDown)
    ns3dRudder::CurveArray *curves = new ns3dRudder::CurveArray;
    // Only one device (0)
    uint32 i = 0;
    if (pSdk->IsDeviceConnected(i))
    {
        // Axis :X, Y, Z, rZ
        ns3dRudder::Axis axis;
        // Status of 3dRudder
        ns3dRudder::Status status;
        if (pSdk->GetAxis(i, mode, &axis, curves) == ns3dRudder::Success)
        {
            status = pSdk->GetStatus(i);            
            if ((status == ns3dRudder::InUse || status == ns3dRudder::ExtendedMode) && GetDefault()->bActive)
                UpdateViewportCamera(FVector(axis.m_aY, axis.m_aX, axis.m_aZ), axis.m_rZ);
        }
    }
}

UpdateViewportCameraFEditorViewportClient オブジェクトを取得し、MoveViewport 関数を呼び出します。この関数は、UE4 のソース コードの中で、ゲームパッド / ジョイステックを使ってエディタ内でカメラを動かすために使われている場所にあります。
 
void F3DRudderEditorModule::UpdateViewportCamera(const FVector& translation, float yaw)
{
    //UE_LOG(_3DRudderEditor, Warning, TEXT("tick %f"), yaw);
    if (translation.IsZero() && yaw == 0)
        return;
    if (GEditor != nullptr && GEditor->GetActiveViewport() != nullptr && GEditor->GetActiveViewport()->GetClient() != nullptr)
    {
        FEditorViewportClient* client = StaticCast(GEditor->GetActiveViewport()->GetClient());      
        if (client != nullptr && !client->Viewport->IsPlayInEditorViewport())
        {           
            const FVector speed = GetDefault()->Translation;
            const float speedRotation = GetDefault()->RotationYaw;
            // X Y local
            FVector local(translation.X * speed.X, translation.Y * speed.Y, 0);
            FVector world = client->GetViewRotation().RotateVector(local);
            // Z world
            world += FVector(0.0f, 0.0f, translation.Z * speed.Z);
            // Pitch Yaw Roll
            FRotator rotation(0, yaw * speedRotation, 0);
            // Move Camera of Viewport with 3dRudder
            client->MoveViewportCamera(world, rotation);
        }
    }
}


4.エディタの環境設定に固有のパラメータを表示し、保存するための U3DRudderSettings クラスも作成しました。

a. カメラ モーションをアクティブ / オフにする boolean
b. X,Y,Z 軸のモーションのべロシティ / 速度を変更するための vector3
c. Z (yaw) の回転のべロシティ / 速度を変更するための float
 
UCLASS(config = Editor, defaultconfig)
class U3DRudderSettings : public UObject
{
    GENERATED_BODY()
public:
    U3DRudderSettings(const FObjectInitializer& ObjectInitializer);
    /** Enable/Disable */
    UPROPERTY(EditAnywhere, config, Category = Move)
        bool bActive;
    /** Speed Translation */
    UPROPERTY(EditAnywhere, config, Category = Speed)
        FVector Translation;
    /** Speed Rotation (Yaw) */
    UPROPERTY(EditAnywhere, config, Category = Speed, meta = (DisplayName = "Rotation (Yaw)" ))
        float RotationYaw;
};

こうした設定を利用するには、Edit -> Editor Preferences -> 3dRudder -> Viewport 
の順に選択します。770_3DRudder_Pic3.jpg
これらの値を更新すると、Config/DefaultEditor.ini に保存されます。このように各プロジェクトでモーションを様々な速度にすることができます。
 
[/Script/_3DRudderEditor.3DRudderSettings]
Translation=(X=1.000000,Y=2.000000,Z=3.000000)
RotationYaw=5.000000
bActive=True

プラグインを空の C++ プロジェクト内で、Visual Studio 2015 上でビルドしました。
770_3DRudder_Pic4.jpg
コード全体は GitHub の以下の場所にあります。
https://github.com/3DRudder/3DRudderSDK_Unreal_Engine

最終ステップは、パッケージをマーケットプレイス チームに提出し、アンリアル エンジンの最新バージョン (4.15, 4.16, 4.17, 4.18) でスムーズに動作するかを確認することでした。3dRudder プラグインは、UE4 マーケットプレイスのここ にあります。

直面した問題
全体として統合は非常にスムーズに進みました。唯一の問題はビューポート カメラの移動でした。適切なドキュメントやサンプル コードが見つからなかったからです。代わりに、ゲームパッドを使ってカメラがどのように動くかについての VR Mode のソース コードを見ました。 

プラグインのインストール
最後に、プラグインのインストール方法と UE4 で 3dRudder を使うとどのようになるかについての動画を作成しました。

この動画では、まずエディタと VR モードで 3dRudder プラグインをインストールする方法を示し、次に動画の時間 0:45 で 3dRudder を使って標準のエディタ内でシーン内を動き、2:57 で VR モードでシーンを動き回っています。

特別提供価格

3dRudder は UE4 の VR エディタの操作感全般を大幅に高めると我々は考えています。ですから、アンリアル エンジンのデベロッパーの皆様向けに、3dRudder professional のウェブサイトから 3dRudder を、 99 ドルすなわち 99 ユーロ (従来の 179 ドルすなわち 179 ドルからの割引) の特別価格で購入いただけるクーポン (有効期限は12 月 5 日まで) を提供させていただきます。www.3dRudderBusiness.com のサイトで UE4SPECIAL3DRUDDER のコードをご利用ください。