列車の線路を表すいくつかの方法は何ですか?


21

私はこれを少し前に小さなプロジェクトで調べましたが、それほど遠くはありませんでした。ユーザーが列車の線路を描いて、「列車」が2D平面でその線路を追跡できるようにする小さなプログラムを作成したいと思います。トラックがかなり自由な形で、すてきな滑らかなラインになるようにしたいと思います。私は三次スプラインをいじってみて、まともな結果を得ましたが、列車をスプラインに追従させるのに苦労しました。また、複数のトラックを作成したり、列車をあるトラックから別のトラックに切り替えたりするのに苦労しました。

誰かが私が何かを理解するのに役立つアドバイス、記事、またはソースコードを持っていますか?ありがとう!


3
あなたが直面している問題が何であるかを説明しておくと役立ちます。
レイチェルブルーム

1
あなたのゲームのデモを見たいです。
-ashes999

回答:


10

トラックや道路を描くときは、常にスプラインから始めたいと思います。ただし、最後にスプラインに苦労していたとき(レイチェルブルムが言及しているように、パラメーター化と距離の両方の理由でスプラインの滑らかな動きはうるさい)、誰かが私に多くの実際の道路がスプラインの代わりに円弧を使用することを提案しました。一定の曲率により、距離を簡単に計算し、一定の速度で移動できます。さらに、見栄えも良いです。

円弧と直線を交互に繰り返す道路で遊び始めました。Willのアプローチに似ていますが、円弧の半径は可変です。私はこのアプローチに非常に満足していましたが、それで何もしませんでした。 このデモを試してください(Flash):左側のコントロールはスプライン用で、右側のコントロールは円弧用です(スライダーを使用して長さを制御し、ドラッグハンドルを使用して角度を制御します)。道路の端をドラッグして、円弧がどれだけきれいに見えるかを確認して、非常に狭い曲線を作成します。

あるいは、グリッド(Iainが提案)で遊びたい場合は、正方形から正方形ではなく、端から端へ描画してみてください。これがデモ(Javaアプレット)です。



7

適切なエルミートスプラインを使用すると、コーナーがタイトになり、トレーニングトラックのように見えなくなります。

エルミートスプラインの使用

ジョイントで円を結ぶ直線としてパスを処理することで、はるかに楽しい結果が得られました。

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

トリックは、隣接するジョイント円の内側と外側の接線を計算し、各ジョイントの巻線を計算して、右側を通過させることです。

また、トラック敷設ロジックでは、パスの自己交差を回避するか、ジャンクションに変換します:)

このアプローチを使用したビデオは次のとおりです。http//www.youtube.com/watch?v = PAVksn4btKU


6

Cornuスパイラルを使用して、ユーザーにトラックを作成させることができます。スプラインはソフトウェアで曲線を表現するための事実上の方法であるため、オンラインではほとんどない文献がオンラインで見つかります。それにもかかわらず、それらは実際の鉄道線路が通る方法です。Raph Levienはそれらを普及させる多くの仕事をしました


2

各正方形が1つ以上の他の正方形にリンクできるグリッドベースのアプローチを試すことができます。その後、複数の正方形を覆ういくつかのピースを作成して、より滑らかな曲線を作成できます。電車のセットのような基本的にモジュール式。


1
グリッドベースのアプローチに似たものを試しました。基本的に、トラックピースを作成して、単純なグリッドよりも少し自由度の高い方法で一緒にクリックできるようにしました。非常によく似た概念だと思います。それはうまくいきましたが、吸い込まれるたびに適切な作品を選択してトラックを描きました。
hokiecsgrad

2

レールトラックを実装するためにさまざまな手法を試しましたが、円と直線のセクションが最良の結果をもたらし、電車を走らせるのに最も簡単な数学であることがわかりました。

残念ながら、コントロールポイントのわずかな動きによってトラックが完全に異なる方向に送られるため、トラックの敷設もかなり複雑で、あまり直感的ではありませんでした。

制御点を追加するのと同様に、トラックの配置方法を決定するための数学は非常に複雑になります。

http://www.dailymotion.com/video/xgl2kp_openrailz-tech-demo-3_videogamesに短いデモがあります


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.