読者です 読者をやめる 読者になる 読者になる

第一次 Add Force / Add Impulse 戦争

f:id:ikagamedev:20170126183530p:plain

みなさんこんにちは。よしだです。
いつかは来るかと思っていましたが来てしまいました。戦争です。
今回は Add Force関数と Add Impulse関数の相違点、それぞれの特徴、使いどころなどについてまとめていきます。


Add Force

f:id:ikagamedev:20170126183633p:plain

おなじみのAdd Force関数です。先ずは、各種パラメーターについて説明していきます。

Target
Add Force関数を実行したいPimitive Componentを入力してあげるためのパラメーターです。(あとのTargetピンの説明は省きます。)


Force
適用させたいForceの値を入力してあげます。ノードの説明だと、オブジェクトを"押す"感じのときに使えばいいらしいです。
Add Forceは断続的(毎フレームなど...)な力を与えることに使われます。


Bone Name
押すTargetがSkeletal Meshだった場合、Boneの名前を指定してあげることでそのBoneにAdd Forceをすることが可能になります。


Accel Change
チェックを入れると、物理的な力(Force)ではなくPrimitive Componentに加速度(Acceleration)を与えることができます。


ex)CharacterのForward VectorからTraceをして、当たったComponentにTick処理でAdd Forceする場合
f:id:ikagamedev:20170126192951p:plain

(FirstPersonCharacter内での処理です。)
ActorのForwardVectorとForce変数を掛け合わせた値をForceに入力しています。この時のForceの値ですが、動かしたいオブジェクトが今回は400Kgあるので...

f:id:ikagamedev:20170126193459p:plain

f:id:ikagamedev:20170126193850p:plain
大体Forceが 400000[N]手前あたりでオブジェクトが動くかと思います。

f:id:ikagamedev:20170126194653g:plain

質量2000kgのオブジェクトは動かせません。。。(Force2000000[N]あたりで動き出します。)

f:id:ikagamedev:20170126195128g:plain


ex2)先ほどとほぼ同様の動きを別処理で

f:id:ikagamedev:20170126195643p:plain

当たったオブジェクトの面法線ベクトルに -1 を掛けてやることで同じような処理が可能です。





Add Force at Location

f:id:ikagamedev:20170126202455p:plain
Add Force関数にLocationパラメーターが追加されただけのものだと思っていいです。ですが、Locationパラメーターが増えたおかげでオブジェクトに対する部分的なForceを与えることが可能になります。

ex)LocationにHitResultのLocationを入力

f:id:ikagamedev:20170126202734p:plain

f:id:ikagamedev:20170126203405g:plain

明らかにAdd Force関数より動きが激しくなっていることがわかるかと思います。

ex2)LocationにHitResultのImpactPointを入力

f:id:ikagamedev:20170128193911p:plain

f:id:ikagamedev:20170128193931g:plain

なんとなくAdd Force < Add Force at Location(Location) < Add Force at Location(Impact Point)の順でForceの量が大きくなる気がします。
なぜLocationよりImpactPointのほうが与える力が大きく見えるかですが、LocationがオブジェクトのRoot(オブジェクト座標系の中心)に対してForceを適用させているのに対して、ImpactPointはTraceがHitしたPointに直接Forceを与えているからだと思います。あまり使い分けが必要なことはなさそうですが、自分がどっちの挙動が今目指しているものなのかを考えて使えばいいと思います。


Add Radial Force

f:id:ikagamedev:20170128200101p:plain

こちらのノードはイメージするなら爆発物などが爆発した際にその近くにいた敵や、物理オブジェクトにRadial(放射状)な力を与えるノードです。

Radius
Forceを適用する範囲

Strength
Forceの大きさ。



f:id:ikagamedev:20170128200048p:plain

マウスのクリックでTraceを飛ばし、当たったオブジェクトに3000000[N]のパワーを与えています。Tick処理で毎フレームパワーを与えているわけではないのでForceの値は大きめです。

f:id:ikagamedev:20170128195952g:plain

ですが上の処理だと、Traceが直接当たらないとオブジェクトにForceを与えることができないので、下のような処理を組むことで爆発物が爆発し、その近くにいた敵に対しForceを与える、といった処理が可能になります。

f:id:ikagamedev:20170128202325p:plain
まず、Traceが当たったpositionにSphere CollisionをAddし、そのCollisionにOverlapしているComponentすべてに対してAdd Radial Force関数を実行してあげてます。

f:id:ikagamedev:20170128202506g:plain



Add Impulse
f:id:ikagamedev:20170201192048p:plain

オブジェクトに単一かつ瞬時な力を与えるノードです。Add Forceが毎フレーム力を与えるのに用いられるのに対し、Add Impulseは一フレームに力を集中させる感じです。
(テストの前日に勉強を急いでやるか、一週間前から勉強をやるかみたいな感じです。(ちなみに私は前者。なのでAdd Impulseです。))
各種パラメーターについて説明します。


Impulse
AddするImpulse(衝撃)の大きさです。Add ForceのForceパラメーターが大きさだけなのに対し、Add Impulseは向きも与えます。


Vel Change
もし、TrueならばImpulseパラメーターに入力された値がImpulseではなく、オブジェクトの直接的な速度(Velocity)になります。
また、オブジェクト固有のmass(質量)は無視されます。


ex)マウス右クリックでRayを飛ばしAdd Impulse(vel change parameter false)
f:id:ikagamedev:20170201193035p:plain
こちらの処理はVel Changeパラメーターがfalseなので質量ベースもとい、物理ベースなImpulseをオブジェクトに与えます。石のブロックは重いので動きません。

f:id:ikagamedev:20170201192839g:plain


ex)vel change parameter true
f:id:ikagamedev:20170201193407p:plain

質量が無視され、直接的な速度になるのでForceの値を1/30にしています。
f:id:ikagamedev:20170201193511g:plain

使いどころですが、ゴルフ、サッカー、野球などの球技系などのゲームを作るときは相性がよさそうです。



Add Impuse at Location
説明割愛.....(Add Force at LocationのImpulse版...)

Add Radial Impulse
割愛...


Add Angular Impulse
f:id:ikagamedev:20170201195630p:plain

簡単に説明すると、ある軸に対する角運動です。詳しくはこちらを参照。
角運動量 - Wikipedia

ちょっとだけ複雑なので詳しく説明します。

Characterの前方向ベクトル(Forward Vector)に対するAngular Impulse
f:id:ikagamedev:20170201201100p:plain

プレイするとこんな感じ。
f:id:ikagamedev:20170201201158g:plain

なぜこんな動きをするんだ?って方のために図で説明すると、
f:id:ikagamedev:20170201201928p:plain
こんな感じになりますw(Y-Upにしています。)

Forwardを軸としての回転なので、実質Roll回転をしているのとほぼほぼ同じです。言い換えると物理ベースで、オブジェクトに回転運動をさせている形です。



Characterの横方向ベクトル(Right Vector)に対するAngular Impulse
f:id:ikagamedev:20170201202529p:plain

プレイするとこんな感じ。
f:id:ikagamedev:20170201202642g:plain
先ほどの図の通りの動きをしますね!いい感じです。
実質的には、Pitch回転をしているように見えます。



Characterの縦方向ベクトル(Up Vector)に対するAngular Impulse
f:id:ikagamedev:20170201202838p:plain

プレイするとこんな感じ。
f:id:ikagamedev:20170201203052g:plain
図の通りですね!
実質的にはYaw回転ですね。


使いどころですがコマ回しとかですかねぇw





まとめ

Add Force断続的な力をオブジェクトに与える。毎フレーム力を与えたりする際に用いる。
Add Impulse単一かつ瞬時な力をオブジェクトに与える。一フレームで力を与えたいときに用いる。
Radial 系は爆発物を視覚化する際に相性がいい。
at Location 系は Impact Point を用いることで、よりリアルな挙動を視覚化することが可能。
Angular は、ある軸に対する Impulse を与える。雪ころがしなど。


以上です。最後まで見ていただきありがとうございました。良い、Unreal Engine Lifeを!