(物理)3D振り子を実装したい

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Dim!
記事: 6
登録日時: 13年前

(物理)3D振り子を実装したい

#1

投稿記事 by Dim! » 12年前

3D空間上で振り子を実装したいと考えています。
最初に初期値として支点(定位置)と重りの位置を与え、重りから手を離したと仮定した状態から振り子運動が始まります。
糸の長さは初期値が与えられた時に自動で計算され、縮むことも伸びることもありません。
糸と言うよりは棒のようなものとして考えて、曲がったり湾曲したりしません。
上から見て、円形や楕円形の軌道は描きません。
また、支点の位置よりも重りの位置が上になることはありません。(重りの位置の方が上になった時の処理は後から入れる予定です)

このような前提のもとで、こちらのサイト様を参考に3D空間上での2D振り子(Z軸方向には揺れない振り子)までは実装することが出来ました。
http://hakuhin.jp/as/move.html#MOVE_06
Z成分を0にした3Dベクトルを使って実装しました。

そこでZ軸への揺れも考慮した3D振り子の実装に手をつけたのですが、思ったような挙動をしません。
XY面に回転してから処理して回転しただけ戻す方法を最初に試したのですが、処理がスマートではありません(挙動も荒ぶりました)。
強引に2D振り子の処理を3D仕様にしようとしたのですが、X軸とZ軸が絡んだ回転の処理につまづいてしまいました。

単振り子や二重振り子といった資料はたくさんあるのですが、3D空間での振り子の資料は少なく非常に苦難しております。
3D振り子を実装するのに、もっとスマートな考え方はないものでしょうか。
その考え方と方法を是非ご教授願いたく、質問しました。
当方、C#とXNA3.1を使って開発しています。

(一部誤植訂正しました。もうしわけありません)
以上、よろしくお願いします。

アバター
GRAM
記事: 164
登録日時: 13年前
住所: 大阪

Re: (物理)3D振り子を実装したい

#2

投稿記事 by GRAM » 12年前

説明するのが難しいですが、物理的に考えればいいと思います
たるんだりする方が自分にとっては都合がいいので(というか昔作ったのがそうなっているので)、そう考えますね。

まず、速度ベクトルが紐が作る球の接線方向に近い場合、
これは次の微小時間も球の接線方向に運動するように運動を修正します。
修正方法としては、速度ベクトルを球の接線方向と、球の中心方向に分解し、
中心方向の成分を0に、接線方向の速度を現在の速度と同じになるように調整します。

次に速度ベクトルが、球の接線方向から大きく外れている場合、
この場合は、中心方向の速度ベクトルに反発係数をかけ、さらに反転させてやればいい感じになると思います。

接線方向から外れているかどうかは、そこそこ正確に判断できますが、簡単にするには
球との衝突時間を計算し、衝突点で速度を分解して中心方向の成分を見てやればいいと思います。

・・・とまぁこんな感じになるでしょうが、本質的なロジックは2Dでも3Dでも何も変わらないかなぁと思います。
一応昔作ったプログラムを一部修正し、コアとなるコードを載せてみます・・・が、
実はこのコードも2Dでも3Dでも両方で動作します。
► スポイラーを表示

閉鎖

“C言語何でも質問掲示板” へ戻る