私は、プレイヤーがトラクタビームのようなものを使用してオブジェクトを拾い、それらを持ち運ぶことができるゲームに取り組んでいます。
ビームの中心に向かってオブジェクトを引き付けることは難しくありません。しかし、オブジェクトが中心に十分近づいたら、プレイヤーが動いている間、オブジェクトをそこに置いておく必要があります。これが問題です。それを行うには2つの方法が考えられますが、どちらにも問題があります。
プレーヤーの位置が変更されるたびにオブジェクトの位置を更新し、ビームの中心に配置します。
オブジェクトの速度を更新して、ビームの中心を直接指すようにすると、遠ざかるほど速度が上がります。
移動と回転はどちらの方法でも問題なく機能しますが、運ばれたオブジェクトが他のオブジェクトと衝突すると、物理学は正しくありません。
最初のアプローチでは、物理学は完全に無視されます。運ばれたオブジェクトは、何でも邪魔にならないように押し出します。位置の変更は、速度に基づいて、世界の物理学の一部としてのみ行われることになっているためです。
2番目のアプローチでは、物理学は基本的には本来あるべき振る舞いをしますが、過剰反応します。問題は、回転して移動しているときでも、運ばれたオブジェクトをビームの中心に保つために、高い速度値を使用する必要があることです。したがって、運ばれたオブジェクトが別のオブジェクトに触れると、衝突によって速度が大きくなりすぎます。
これを適切に実装するにはどうすればよいですか?現在の私の推測では、2番目のアプローチを使用して、運ばれたオブジェクトの特別な処理をワールドフィジックスに追加し、衝突時またはプレーヤーが持ち運びを停止したときに速度を正解値に下げることです。しかし、それはかなり洗練されていない回避策のようです。
編集:いくつかの疑似コードを追加して、それが現在どのように機能するかを示します(上記の2番目のアプローチになります)
void attract_object(object, ticks) {
Vector distance = beam_center - object.center;
// If the object is not close to the beam center, attract it slowly
if (magnitude(distance) > 10) {
object.velocity += distance.normalized() * ticks * 0.1;
return;
}
// Here comes the part we're talking about. That magic 0.5 is just high enough
// that the object isn't lost while moving around. But it's still so high that
// other objects are repelled with way too much force.
object.velocity = distance * ticks * 0.5;
}
私が見るところから、これは運ばれたオブジェクトが別のオブジェクトを押しのけるときに起こります:
- 運ばれたオブジェクトが別のオブジェクトと衝突する
- オブジェクトの速度は適切に分散されているので、運ばれたオブジェクトはプロセス中にビームの中心から押し出されます
- 上記のコードは、運ばれたオブジェクトをビームの中心に戻します。速度が非常に高いため、すぐにそこに戻ります。
- 運ばれたオブジェクトがビームの中心に向かって戻ると、その高速の半分が他のオブジェクトに転送され、激しく反発します。運ばれた物体の初速は良さそうなので、手順2〜4が何度も繰り返されて、こんなに高い速度がつくのではないでしょうか。
それが原因のようです。私はそれを修正するための良い方法を考えることはできません:(