ソフトウェア開発したい日記

「面白い!」と思った頭の体操や、数学の問題を載せていきます
その他ロードバイクででかけた先の写真や、ソフト開発のメモ等

コマ大戦のためのコマシミュレーション 1

2013年06月08日 22時24分44秒 | ソフト開発日記

これから再びちょこちょこと書き始めます。

 

開催が2週間後に迫った、信州大学で行われるコマ大戦

信大から出場する選手たちのコマのシミュレーションを任されることになったけれど、1から物理エンジンを書いてはいられない。

与えられた使命は、幾つかのコマ形状を作ったり、CADで作ったモデルを読み込んで、それを回転させた際の挙動や強さをシミュレートすること。

 

とりあえず、JavaやCでさくっと作るために、フリーの物理エンジンを漁ることに。使ってみた物理エンジンは以下の通り。

 

【Open Dynamics Engine】

C++で簡単に起動できました。

そして「demo_gyroscopic」と、始めからコマっぽいデモがありました。

これでいける!と、始めのうちは安心しきっていたら、落とし穴が。

用意されている物体形状がやたら少なく、Cone(円錐)も無かった。

円錐が無いと、こまっぽい形が作れない。CADで作ったモデルの読み込みも悪戦苦闘した結果、挫折。

気を取り直して次に行くことに。

 

【jMonkeyEngine】

次はJava。今後はゲームエンジンを試してみました。

物理計算の部分は、bulletのJava版、jbulletを使っているようです。(jbullet単体で使おうとするも、使い方わからなかった。)

こちらはデモでコマっぽいものはありませんでしたが、普段Javaで書いているおかげが、割とわかりやすく、

様々な形状を標準でサポートしていたので、円錐やカプセル、円筒を組み合わせて角速度を与えて回転させることに成功。

今度こそいける!と思ったら、ファイル入力の部分で問題が。

jMonkeyEngineでサポートしている3Dモデルのフォーマットは「Ogre Mesh XML」というもので(Blenderなんかで作れるらしい)、

学生が講義で使っているCADソフトでは出力不可能でした。

一応obj形式をサポートしているらしいけれども、直接読み込むことはできず、コンバータが必要とのこと。コンバータクラスが見つからず挫折。

かなり粘ったけど気分転換に違うものを漁ることに。

 

【bullet】

またC++。jbulletの本家。これも簡単に動きました。

そして「GyroscopicDemo」というコマっぽいデモが標準で搭載。

これは円錐もあるし、今度こそいけるか?と思うも、結局CADモデルを読み込む部分で苦闘。

 

他にも、【unity(PhysX)】を使いましたが、ファイル処理で挫折。

 

結局、ダメなのはファイル入出力部分であったので、次はCADモデルのデータ構造を勉強することにしました(初めからこうすればよかった)。

その結果、CADソフトで出力可能なSTL形式、これは単に三角メッシュの情報が羅列しているだけみたい。

このファイル形式を読み込んで、プログラム上で3Dモデルに変換するコードを自分で書く方針に決定。

楽をするために色々なエンジンを試して、便利なプラグインやライブラリを探しながら、ここに至るまで約2週間。急がば回れでした。


NetBeansでフォームの描画中に例外が発生した

2011年12月26日 18時11分40秒 | ソフト開発日記
原因はまるで不明ですが、
NetBeansを終了→翌朝起動→デザイナ画面
と移ったら

「フォームの描画中に次の例外が発生しました。「インスペクタ」ウィンドウを使用して、問題のあるコンポーネントを修正または削除して下さい。」

というメッセージが。
例外はデザイナ上に書かれており、そのせいで他のコンポーネントが見えない状態に。
ちなみにNullPointerExceptionで、ButtonStateがどうのこうの書かれてました。

そして色々探っていたら、ラジオボタンのプロパティに問題が。
ボタングループに登録してあるラジオボタンの1つのプロパティを見ると、
selectedとactionCommandプロパティが、赤字で「Error getting property value」となってました。

その後色々試してみるも、本質的な原因や根本的な解決策は見出せませんでしたが、
とりあえずプロパティにエラーのあるコンポーネントを一度削除して、再び配置したら例外が消えました。
ただ、このままでは再発しそうです。

3次元FEMソフトできた!

2011年12月16日 16時35分35秒 | ソフト開発日記
2次元FEMソフトが完成してから苦節1週間。
ついに3次元への拡張ができました。

(↓2次元FEMの画像)


ある程度高い精度を出せるように、
2次元ではアイソパラメトリック四辺形一次要素、
3次元ではアイソパラメトリック六面体一次要素を採用。
積分は8点の2次積分を(2次元では4点)。

[B]マトリクスが煩雑すぎてデバッグで吐きそうになったりしましたが、
懲りずに書いてなんとか動いたときは感動しました。

現状は単純な図形に対してのみの有限要素解析ですが、それっぽい結果の生成が嬉しかったので記念記録。

また、六面体要素1つの要素剛性マトリクスが24×24の行列で、
全体剛性マトリクスは要素の頂点数×3とかなり膨大な行列になってしまうので、
すぐヒープ領域が足りなくなってしまう現状。
起動時にメモリ確保の命令入れても要素数2000くらいでが限界でした。

これからまた、連立一次方程式のメモリに優しい解法アルゴリズムを書く作業がはじまります。
それができたらメッシュ分割アルゴリズムを勉強して、UI整えてそれっぽいもの作りたいです。

大学の研究進めずに何やってるんだろう。

NetBeansでApache Commons Mathを使いたい

2011年12月05日 00時54分07秒 | ソフト開発日記
これまでひたすらシコシコと全部1からソースコードを書いてきたけど、
最近作業が全然追いつかなくなってしまったため、今更ながら数値計算ライブラリに手をつけることに。
数値計算ライブラリ「Apache Commons Math」をNetBeansで使うまでのメモ書き。

①公式サイトから最新版のBinaries(2011年12月5日時点でver2.2)をダウンロードし、適当な場所に解凍。
http://commons.apache.org/math/

②NetBeansを起動して、[ツール]→[ライブラリ]と進みライブラリマネージャーを起動。

③[新規ライブラリ]ボタンを押して、「ApacheCommonsMath」を追加。

④[JAR/フォルダを追加]ボタンを押して、先程解凍したフォルダから
「commons-math-2.2.jar」と[commons-math-2.2-sources.jar]の2つのファイルを追加。

⑤プロジェクトウィンドウで、目的のプロジェクトの[ライブラリ]を右クリックし、[ライブラリを追加]をクリック。
「ApacheCommonsMath」ライブラリを追加する。

これでライブラリのクラスとJavadocが表示されるようになりました。

ボタンのStateChangedイベント

2011年08月02日 17時53分07秒 | ソフト開発日記
(ボタングループで)
あるトグルボタンの状態が変化したときに発生させるイベントに
ボタンのStateChangedを利用しようとしたら、
MacとWindowsで挙動が変わったので、そのメモ。

Macでは
あるボタン上でマウスプレスしたときに2回
さらにマウスリリースしたときに2回
別のボタンが選択され、トグルの状態が変化したときに1回
StateChangedイベントが呼び出されたのに対し、

Windowsでは上記に加えて
マウスカーソルがボタン上にきたときに1回、
マウスカーソルがボタンから離れたときに1回、
と多く呼び出されてました。

どちらでも動くように、
安全なソースコードにする必要がありそう。