ロープを作成するには?


8

このゲームを再現したいのですが、ロープの作成方法や、ボールへの影響がわかりません。

ここに画像の説明を入力してください

基本的に、一方の端にマウスポインターに「取り付けられた」ロープがあり、もう一方の端には大きなボールに取り付けられたロープがあります。ユーザーがマウスを動かすと、まるで殻竿などを振るように、ロープとボールが動きます。

上記のゲームのようにロープを作成するにはどうすればよいですか?

既存のライブラリを使用してロープを作成する方法ではなく、そのようなロープの作成の背後にある基本的な概念と物理学を知る必要があります。ロープを最初から実装できるようにしたいので、どのように実行できるかを知る必要があります。

ありがとう!

回答:


3

あなたの例のロープはおそらく、マウスカーソルまでのボールの距離を制限する単純な物理ジョイントです。これらのジョイントは、通常「ロープジョイント」または「スプリングジョイント」と呼ばれます。

文字列の波紋は実際の物理シミュレーションに基づいていないようです。ほとんどの場合、これはベジエ曲線であり、ボールがマウスの位置に近づくと、コントロールポイントが中心軸から遠ざかります。

受け入れられた答えは、物理エンジン内に現実的なロープを作成する方法を説明していますが、(上記で概説したように)はるかに単純なソリューションを使用する方が望ましい場合があります。よりシンプルなソリューション(ジョイントが1つだけ)は、シミュレーションの安定性を大幅に向上させます。大きな力が適用されている複数の接続されたジョイントはジッターする傾向があり、ジョイントのチェーンが壊れて不規則に動く可能性があります。

もちろん、次のようにロープを作成することで、両方の方法を組み合わせることができます。

  1. ジョイントで接続されたノードのチェーン
  2. チェーンの最初のノードから最後のノードまでのロープ/スプリングジョイント。これにより、特定の最大距離よりもチェーンを引き離せなくなります(これらのチェーンが不安定になる主な理由の1つ)。

これにより、よりリアルに動くチェーン(物理エンジン内の他のオブジェクトに反応することさえあります)が得られますが、「偽の」チェーン動作を持つ単なるスプリングジョイントよりも多くの処理能力が必要になります。


指摘してくれてありがとう!ただし、例ではベジエをまっすぐにして「押しつぶした」ような単純なものではなく、例が非常にリアルに見えるため、ベジエの制御点はどのように操作されますか。
theonlygusti

とてもリアルに見えるとは思いません。それはロープに波紋を加えるだけで、曲がったり何もしません...私にはそれはまっすぐに伸ばされて押しつぶされているように見えます。
bummzack 2015

しかし、カーブが互いに異なる角度になる可能性があることに気づきました。これはどのように達成されていますか?
theonlygusti 2015

ランダムなオフセットをいくつか追加して、毎回異なるようにしますか?
bummzack 2015

はい、はい。それはゲームでそれが行われた方法のように見えますが、実際に(そしてこれは誰にとっても奇妙に思えます)使用しているプログラミング言語により、ベジエ曲線を描くよりも、Kyranstarの答えのような物理エンジンの作成が簡単になります。
theonlygusti 2015

10

基本的に、物理エンジンを作成する必要があります。ロープは、概念的には、スプリングで接続された「ノード」の集まりです。

基本的に、すべてのティックでは、各ノードは、ノード間の距離(または快適なストレッチの長さからの距離)に比例して、ノードの上下に力を及ぼします。ボールを取り付けたい場合は、それをスプリングジョイントでロープの最下部のノードに接続します。

これは物理エンジンを作成するための優れたチュートリアルですが、実際には制約やジョイントには入りません。

これは、基本的なばねをカバーするチュートリアルです。このようなロープに必要なのはこれだけです。

これは私の(非常に基本的な)物理エンジンで作成されたロープです。それは明らかにいくつかの癖(奇妙な振動)を持っていますが、それは一般的にあなたが探しているものです。ロープを描くときは、ノードを描かないでください。

編集:

見栄えの良いロープを作るために、「ストリングジョイント」は実際には見た目がよく、例に近いものです。ストリングジョイントは基本的にはスプリングですが、オブジェクトが遠すぎる場合にのみ修正されます(近すぎる場合は修正されません)。

これは、代わりにひも付きのロープです。 ここに画像の説明を入力してください


「ロープを引くときは、ノードを引かないでください。」-私を笑わせました:)私の極端なうるささを考慮してくれてありがとう。その場合、ボールは別のノードになりますか?より大きな質量の?(各ノードには質量がありますか?)
theonlygusti

はい、彼らがやります!一般に、質量を直感的に計算する最良の方法は、各ボールに密度を与え、その面積を乗算することです。これをいつでも調整して、実際のゲームでより良い結果を得ることができます。
Kyranstar 2015

通常、これをオブジェクト指向言語で実装し、ノードのクラス、プロパティ密度、質量などを設定しますが、OOPがほとんど不可能である言語を使用せざるを得ません。これらの制約の下でノードなどをどのように設定しますか?
theonlygusti 2015

正直なところ、私は非OOP言語の経験はほとんどありません。Cで記述された物理エンジンであるChipmunk2Dを見ることができます。明らかに、このデータをまとまりのあるユニットに格納する方法が必要になります。
Kyranstar 2015

大丈夫ありがとう; 最後の質問、灰色のノードは他の意味でのノードですか?静止したままにするために何が特別なのですか?
theonlygusti 2015
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.