Unityで移動する処理を作っています。
オブジェクトが指定位置に移動する処理なのですが、表題の通り、ただ移動するだけではなく、このようなあらかじめ定められた距離に対して、速度が減衰して、到達する処理を求めたいと思っております。
初速が大きく、徐々に減衰して、指定時間後に指定距離移動する処理がうまく求められないでいます。
具体的には、添付gifの初速度=10のときに、折り返さないで位置に到達するようにしたいです。
等加速度直線運動の公式から、s=v0t+1/2at^2を利用して、加速度aを求めましたが、それだけではだめなようです。
ご教授いただければ幸いです。
該当のソースコード
C#
1public class Test : MonoBehaviour 2{ 3 public float t; 4 public float initSpd; 5 public Transform t1, t2; 6 7 IEnumerator Start() 8 { 9 var p = t1.position; 10 while (true) { 11 t1.position = p; 12 var v0t = initSpd * t; 13 var distance = Vector2.Distance(t1.position, t2.position); 14 var direction = (t2.position - t1.position).normalized; 15 var a = (2 * (distance - v0t)) / (t * t); 16 var v = initSpd; 17 // 指定秒数間、繰り返し 18 yield return Utils.Coroutine.WhileForSeconds(t, () => 19 { 20 t1.Translate(direction * v * Time.deltaTime); 21 v += a * Time.deltaTime; 22 }); 23 } 24 } 25}
時間=3, 初速度=0

時間=3, 初速度=3

時間=3, 初速度=10

追記:ボールはこのようにカーブすることもあります。
赤い線が距離になります。適切なマイナス加速度"a"が求められれば、あとは毎フレーム方向を変えるだけと考えておりました。達成したいことは、指定した時間に、減衰していく速度で、ランダムな方向に移動し、初期の2点間の距離分移動したいです。

初速0のときなんかは明らかに加速していってますがそれはいいんですか?
「減衰していく速度」を満たしているとは思えません。
そもそも「減衰していく速度」とはなんですか?
言葉通りに受け取れば充分な時間経過で速度の絶対値が0に近づくってことかと思いますが、等加速度運動では不可能です。
初速と初期位置と目標位置と到達時刻が与えられて、到達時刻で目標位置上にいればいいというのはわかりますが、それ以外がよくわかりません。到達時の速度はどうなっててほしいのかとか。
質問としては頭で思い浮かべてる動きを数式として表せないということに行き着くと思うのですが、
どういう動きをさせたいのかがよくわからないので
横軸に時間、縦軸に速度と位置(目標位置も添えて)を描いた2つのグラフを複数パターン用意してください
初速0のものはソースコードのパラメータバリエーションとして上げたサンプルとなります。
解決したい課題は本文中にある
>具体的には、添付gifの初速度=10のときに、折り返さないで位置に到達するようにしたいです。
というものでした。等加速度運動でなくても問題ありません。
距離到達時の速度は、初速から減衰して、0になることを想定しています。
自分のつたない知識では等加速度直線運動の公式からなにがししてできるのかなと考えたのですが、
難しいようですね。勉強になります。
指定時間、指定初速、指定距離という条件のもと、速度が減衰する様の動き方で、距離を到達(到達時の速度は0)する方法があればと思って模索していた次第です。
「指定時間、指定初速、指定距離という条件のもと」とおっしゃる内の、「指定距離」というのはどういう意味でしょうか?
ご提示いただいた図の赤線のことだとすると、目的地が上~右の場合ではスタート地点と目的地を直線で結んだ長さであるように見えますが、目的地が左下の場合では最短距離ではなく黒矢印の長さを示している様子で、統一された規則がないように見えます。
私の解釈だと、スタート地点と目的地を直線で結んだ長さというのはスタート地点の位置と目的地の位置が与えられれば自動的に決定されてしまうため別途指定する余地はないはずなので、「指定距離」というのは図の黒矢印の長さのことではないかと思ったのですが...ご質問者さんの意図はどのようなものでしょうか?
指定された距離という意味でした。上図ですとt1-t2間の距離です。
赤い線に直線の意図はありません。仰る通り、黒矢印の長さであります。
黒線は移動の軌跡サンプルで、黒線の長さは全て同じということを赤線で提示したつもりが、確かに分かりずらいものとなってしまいました。ただ黒線のちょんちょんをつければよかったです。
なるほど、ありがとうございます。
「時間=3, 初速度=10」のケースについてですが、ご提示の図のようにSphereがCubeを通り過ぎてから後戻りしてCubeの位置に到着する...という動きにはしたくないとのことですね。
たとえばCubeとSphereが3離れた位置関係にあったとして、その条件でSphereの初速度ベクトルはCubeの方角を向いていて、さらに指定距離が5だったとすると、特に対策をとらなければ確かにおっしゃるとおりCubeを通り過ぎて4の位置まで行ってから1戻ってくる動きになりそうな気がします。
この問題をどのように回避するのが望ましいでしょうか?Cube到達までの道のりの長さが5であるという条件を満たしたまま「Cubeを貫通してから戻る」という動きをさせないようにするとなると、たとえば初速度ベクトルの向きを書き換えて横にそれさせる...なんて案が思い当たりますが、そうすることは許されるでしょうか?
それとも、初速度ベクトルの向きは当初の指定通りCubeの方角でないと困るでしょうか。その場合はおそらく発射後に軌道をそらせ、クエスチョンマークのような経路をとらせて道のりを稼ぐことになりそうです。軌道がちょっと複雑になりますので、たぶんコードが複雑になってしまうかと思いますが...
>たとえばCubeとSphereが3離れた位置関係にあったとして、その条件でSphereの初速度ベクトルはCubeの方角を向いていて、さらに指定距離が5だったとすると…
CubeとSphereが3離れた位置関係にある場合は、指定距離は3になります。指定距離はオプション値ではありません。CubeとSphereが任意の位置にくるので、その2点間の距離は、指定された距離、という意味合いでした。
追記の内容は単純な線形補完で2点間の距離をただ移動する処理は考えていなかった旨を説明するために作成しました。移動したい位置があるのではなく(そうとも言えますが)、指定距離の分、移動したいということも伝えたかったです。
>この問題をどのように回避するのが望ましいでしょうか?
質問内容は
>>初速が大きく、徐々に減衰して、指定時間後に指定距離移動する処理がうまく求められないでいます。
です。
具体的にはt1が初速度10で3秒でぴったりt2に到達する計算方法があれば教えてほしいです。(時間、初速度は任意ですし、t1-t2間の距離も任意です。)でも今書いてて思ったんですけど、初速度が10m/sで距離が10m未満なら普通に飛び越えちゃいますよね。
最初の初速度を適用する前に、初速度をもとに計算したマイナス加速度を適用するようなことをしてしまえば、そのような値を求めることは可能なのでしょうか。
>初速度が10m/sで距離が10m未満なら普通に飛び越えちゃいますよね。
すみません、1秒後はそうですけど、開始から1秒までにマイナス方向の作用があればそうはならないですね。
>具体的にはt1が初速度10で3秒でぴったりt2に到達する計算方法があれば教えてほしいです。
正確にはこうでした。
具体的にはt1が初速度10で3秒でぴったり折り返さないでt2に到達する計算方法があれば教えてほしいです。
>「時間=3, 初速度=10」のケースについてですが、ご提示の図のようにSphereがCubeを通り過ぎてから後戻りしてCubeの位置に到着する...という動きにはしたくないとのことですね。
はい!
回答3件
あなたの回答
tips
プレビュー

