第一次 Add Force / Add Impulse 戦争
みなさんこんにちは。よしだです。
いつかは来るかと思っていましたが来てしまいました。戦争です。
今回は Add Force関数と Add Impulse関数の相違点、それぞれの特徴、使いどころなどについてまとめていきます。
Add Force
おなじみの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する場合
(FirstPersonCharacter内での処理です。)
ActorのForwardVectorとForce変数を掛け合わせた値をForceに入力しています。この時のForceの値ですが、動かしたいオブジェクトが今回は400Kgあるので...
大体Forceが 400000[N]手前あたりでオブジェクトが動くかと思います。
質量2000kgのオブジェクトは動かせません。。。(Force2000000[N]あたりで動き出します。)
ex2)先ほどとほぼ同様の動きを別処理で
当たったオブジェクトの面法線ベクトルに -1 を掛けてやることで同じような処理が可能です。
Add Force at Location
Add Force関数にLocationパラメーターが追加されただけのものだと思っていいです。ですが、Locationパラメーターが増えたおかげでオブジェクトに対する部分的なForceを与えることが可能になります。
ex)LocationにHitResultのLocationを入力
明らかにAdd Force関数より動きが激しくなっていることがわかるかと思います。
ex2)LocationにHitResultのImpactPointを入力
なんとなく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
こちらのノードはイメージするなら爆発物などが爆発した際にその近くにいた敵や、物理オブジェクトにRadial(放射状)な力を与えるノードです。
Radius
Forceを適用する範囲
Strength
Forceの大きさ。
マウスのクリックでTraceを飛ばし、当たったオブジェクトに3000000[N]のパワーを与えています。Tick処理で毎フレームパワーを与えているわけではないのでForceの値は大きめです。
ですが上の処理だと、Traceが直接当たらないとオブジェクトにForceを与えることができないので、下のような処理を組むことで爆発物が爆発し、その近くにいた敵に対しForceを与える、といった処理が可能になります。
まず、Traceが当たったpositionにSphere CollisionをAddし、そのCollisionにOverlapしているComponentすべてに対してAdd Radial Force関数を実行してあげてます。
Add Impulse
オブジェクトに単一かつ瞬時な力を与えるノードです。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)
こちらの処理はVel Changeパラメーターがfalseなので質量ベースもとい、物理ベースなImpulseをオブジェクトに与えます。石のブロックは重いので動きません。
ex)vel change parameter true
質量が無視され、直接的な速度になるのでForceの値を1/30にしています。
使いどころですが、ゴルフ、サッカー、野球などの球技系などのゲームを作るときは相性がよさそうです。
Add Impuse at Location
説明割愛.....(Add Force at LocationのImpulse版...)
Add Radial Impulse
割愛...
Add Angular Impulse
簡単に説明すると、ある軸に対する角運動です。詳しくはこちらを参照。
角運動量 - Wikipedia
ちょっとだけ複雑なので詳しく説明します。
Characterの前方向ベクトル(Forward Vector)に対するAngular Impulse
プレイするとこんな感じ。
なぜこんな動きをするんだ?って方のために図で説明すると、
こんな感じになりますw(Y-Upにしています。)
Forwardを軸としての回転なので、実質Roll回転をしているのとほぼほぼ同じです。言い換えると物理ベースで、オブジェクトに回転運動をさせている形です。
Characterの横方向ベクトル(Right Vector)に対するAngular Impulse
プレイするとこんな感じ。
先ほどの図の通りの動きをしますね!いい感じです。
実質的には、Pitch回転をしているように見えます。
Characterの縦方向ベクトル(Up Vector)に対するAngular Impulse
プレイするとこんな感じ。
図の通りですね!
実質的にはYaw回転ですね。
使いどころですがコマ回しとかですかねぇw
まとめ
・Add Force は断続的な力をオブジェクトに与える。毎フレーム力を与えたりする際に用いる。
・Add Impulse は単一かつ瞬時な力をオブジェクトに与える。一フレームで力を与えたいときに用いる。
・Radial 系は爆発物を視覚化する際に相性がいい。
・at Location 系は Impact Point を用いることで、よりリアルな挙動を視覚化することが可能。
・Angular は、ある軸に対する Impulse を与える。雪ころがしなど。
以上です。最後まで見ていただきありがとうございました。良い、Unreal Engine Lifeを!