BLOGブログ

2020.06.06UE4UE/ Blueprint

[UE4] “Cutting-Edge Test Drive” 都市パート 車の挙動の中身をプチ解説

執筆バージョン: Unreal Engine 4.24

本記事はヒストリア・エンタープライズチームにより制作された
インタラクティブデモ「Cutting-Edge Test Drive」についての連載記事です。
全5回にわたって記事を公開していきます。今回が最後の技術ブログです!

関連記事
第1弾 UE4とMegascansを使用したインタラクティブデモ “Cutting-Edge Test Drive” 公開!-操作説明-
第2弾 [UE4] ”Cutting-Edge Test Drive” バーチャル展示場 -初心者に向けたUE4シーン作成-
第3弾 [UE4] “Cutting-Edge Test Drive” 荒野 -画像からフォグを作成する方法-
第4弾 [UE4]”Cutting-Edge Test Drive” 都市 -DistanceFieldを使ってお手軽にディティールアップ-
第5弾 [UE4] “Cutting-Edge Test Drive” 都市パート 車の挙動の中身をプチ解説


エンタープライズチームCETD連載ブログ第5弾
「 都市パート 車の挙動の中身をプチ解説」

「Cutting-Edge Test Drive」の都市パートは走行シミュレーションのデモです。
このパートは車内からの視点のため、走行時の車体挙動がはっきりと見えます。
そのため、発進・停止・ギアチェンジ時の車体の傾きはある程度再現しないと、確実に違和感が目立ちます。
この記事では、エンジニアが車挙動全般をどのように制御したかを解説したいと思います。


↑この動画の0:46あたりからの車挙動です。

ベースクラスの選定

今回の目的は、開発コストをかけずに説得力のある車挙動を表現することでした。
実装の選択肢としては以下の3通りがありました。

A.自前で素のActorを継承して車挙動を実装する
B.UE4で最初から用意されているWheeled Vehicleクラスを継承して作成する
C.外部のシミュレーションソフトで挙動の計算を事前に行い、座標データを読み込む

自動車関連の業務では正確な挙動を再現するためにCarSimなどのシミュレーションソフトを使用して
C案の手法を取ることが多いのですが、今回は直進と停止のみしか行わない仕様だったこともあり、
目的(コスト面と正確性の重要度が低いこと)を考慮してB案を選択しました。

以上の選択から、都市パートで動いている車はすべて、
UE4側で用意されているWheeled Vehicleクラスを継承してその作りに則ってセットアップされています。
このWheeled VehicleクラスですがUE4の物理エンジンを利用していて非常にリアルな車体挙動を実現することができます。
実際にデモでも、ブレーキ時の沈み込みなどを見ていただくと説得力のある動きをしていることが確認できるかと思います。

しかし物理エンジンを利用することにより絵的な説得力が増すメリットがある反面、
思い通りに動かすことが難しくなるデメリットが存在します。
思い通りに動かすアプローチとしてはベストテイクをシーケンサーで録画したり、アニメーションとして記録するなどありますが、
開発期間が短いことから開発のイテレーションを重視したかったため、
今回はブループリントを使って(多少強引に)制御を試みました。

 

挙動の移動制御

都市における車は直進・停止のみを行うのがこのデモでの仕様です。

Wheeled Vehicleクラスは専用のMovementComponentにThrottleの値を入力することで
実際の車と同じように走ってくれるのですが、これだけだと少し問題があります。
街中を走るので他の車にぶつからないよう一定の速度で走らせたいのですが、
速度をコントロールする方法がアクセルとエンジンブレーキになるので直感的でなく、
しかも繊細な制御を行わなくてはならなくなってしまいます。

なので一定の速度で走る場面においては直接、物理のVelocityを設定してしまう方法をとりました。

直接物理の速度を設定するSet All Physics Linear Velocityノード

物理シミュレーションが有効なメッシュの速度を直に設定できるノードがあります。
図ではAutoCruiseSpeedに時速で設定された速度でX方向にひたすら直進するノードネットワークとなっています。
GetVelocityノードでは現在のVelocityが取れるので、Z方向(上下)の速度はここから再利用します。
しないと重力等によるZ方向の速度変化が行われなくなります。つまり浮いたりします。

逆にY方向には0.0を必ず設定しているので、横に滑ったりすることがなくなります。
(厳密には全くなくなるわけではありませんが……詳しくは後述)
これをTickで毎フレーム呼ぶことで直進する車となります。

後はTick内で目標の速度に達するまではThrottle入力、目標に達したらSet All Physics Linear Velocityと切り替えるようにすることで
物理による加速感もあるそれっぽい挙動を実現しています。

何もなければこれだけでも十分直進はするのですが、何かあったりするのが世の常、
特に回転はきちんと制限しないとちょっとした小石で横向きになってそのまま直進するシュールな図が生まれることがありえます。

 

挙動の回転制御

直接物理の回転を設定するSet All Physics Angular Velocity in Degrees

先に説明したSet All Physics Linear Velocityは移動速度に対するノードでしたが、
回転速度に関してはこちらのSet All Physics Angular Velocity in Degreesノードを使います。

使い方はSet All Physics Linear Velocityと特に変わらず、入力した値で直接物理速度が設定されます

今回の制御ではX(ピッチ)やY(ロール)に関しては通常の物理通りに動いてほしいため、
Get All Physics Angular Velocity in Degreesで取得した値を入れています。
Z(ヨー)方向のみ0.0を設定しているので、仮にハンドルの入力があっても曲がることがなくなります。

この処理をTickで常に呼ぶだけでほとんど曲がることはなくなるのですが、実はとても細かい数字で曲がっちゃっていたりします。
この辺りは物理の処理順の影響で、通常なにも設定しなければ
Tick処理は物理処理の「前」(=TickGroup:PrePhysics)に行われるため設定された後に物理処理が走るためです。

おそらくこの辺りの処理の正道はTick処理を物理処理の後(=TickGroup:PostPhysics)に設定することです。(未検証)
が、Wheeled VehicleクラスのMovementComponent処理がどのタイミングで走っているか検証する時間的余裕がなく、
タイミング違いによる余計な不具合を作るかもしれなかったのでSetActorRotationで強制的にZ軸の回転を0.0に書き換え続けています。

UE4では物理のパラメータをいじれるノードもちゃんと存在するので、
この辺を抑えて作れば物理が生きてても直進だけする車を作ることができます。

 

トリガーボックスの配置

都市レベルのエディタでの様子

後はいい感じに車を配置して、制御用のトリガを配置してあげることで今回の都市シーンは作られています。

以上、簡単ではありますがCutting-Edge Test Driveの都市パートの車に関する記事でした。