‘World Tester’のエントリ

本屋めぐり。いつか買おうと思っていた趣味で物理学が3冊揃っていたので購入。

この本はEMANの物理学という物理解説サイトをまとめたものだが,物理シミュレータWorld Testerを作ったときにすごく参考にしたサイト。物理を解説する体で実は考察していく構成で面白い。一時期ずっと読んでいたが,本を購入することで少しでも支援できるのかなあ。

何か急に「タイピング」というキーワードでアクセスしに来る人が増えた。と思って検索してみたら,Yahoo!で「タイピング」3番目だった。「物理シミュレータ」もいつの間にか2番目になっていた。ページランクが高くなったわけでもないのに何でだろう。「World Tester」はVectorの科学カテゴリトップだったり,紹介サイトからのリンク元からも結構アクセスがあって地味にページビューがある。

紹介するのが遅れたけど,タイピングサミットでも「Weather Typing」大会は今でも開かれていてとてもありがたい。

という感じで,新しく公開したソフトに注力している間も以前の作品は使われていて,メンテしたり機能追加したりしたいのだが,時間が足りない。何か面白いことを思いつけばやるかも,くらいになっている。

VectorのWorld Testerレビュー。いい感じですね。Weather Typingのときもそうだったが,Vectorの「科学」カテゴリで1位になっていた。


Android ウェザタイは公開2週間が経過し,もう少しで100ダウンロードといったところ。PCとの対戦を目指してとりあえずSilverlight版でも作ってみますかね。

VectorのWorld Testerレビュー掲載は29日なのだが,何故かその前に窓の杜で紹介されている。Weather Typingのときも微妙に同じ時期に掲載されていたので,Vectorと連携しているのかなあ。

で,多分公開が午前10時頃なんだけど,その瞬間からトップページのアクセス数が飛躍的に伸びていて,今日だけで見ると人喰い掲示板関連のアクセスに匹敵する。World Testerのダウンロード数もいつもの200倍くらい。これでVectorのレビューも掲載されると少しは盛り上がってくるのかなあ。

窓の杜の記事。

時間を停止した際もマウスで加えた力は累積する仕組みになっているため、大きな力を加えたい場合は時間を停止した上で何度も同じ方向へ力を加えてみよう。

え? と思ってやってみたら確かにそうなっている。バグっぽいけどそういうことにしておきます。

少しでもAndroid版の宣伝になれば,とVectorのWeather Typingの紹介文を編集。したついでにずっとほっておいたWeather TypingとWorld Testerを最新版に差し替えたりスクリーンショットを公開したりしてみた。で今日更新されたのだが,VectorからWorld Testerの新着ソフトレビューの公開依頼が来た。新着でもないしこっちを宣伝したいわけではなかったのだが,ぼた餅的な感じで楽しみにしていましょう。6/29とのこと。

今週末はお引っ越し。今の場所から歩いて5分くらいのところ。てことで今まで持ってなかった電化製品とか家具を買っている。あとはベッドだけなのだが,玄関のところがちょっと狭いので入るのかなあ,と心配に。で,シミュレーションしてみた。

2008092401

白いのがマットレス。木目なのがドアとか廊下の仕切りですね。ちなみにベッドは通常組み立て式なのでマットレスさえ入れば搬入OK。実験結果は「余裕で入る」ってことに。いや,まあ「ドアの幅+廊下の幅」が「マットレスの長さ」以内なら入るのは分かってるんだけど,World Testerを使えばこんなシミュレーションも簡単にできるよ,みたいな。

ネットで,走っているトラックの荷台に,ほぼ同じ速度で車が乗り込んだらどうなるか,という議論が載っていたので考えてみる。つまり高速道路で走行中,車をトラックに格納するようなシチュエーションである。一見,荷台に載った瞬間急加速して前の壁にぶつかりそうに思ってしまう。でもよく考えると,乗り込んだ瞬間,乗り込んだ車のスピードメータがほぼ0になって,あとは(乗り込んだ車の速度 – トラックの速度)分だけ減速すればOK,って感じになりそう。でいいのかな。乗り込んだ瞬間にタイヤの回転がピタっと止まるわけで,前輪駆動とか後輪駆動とか考えると難しい話になるけど。

いろいろ想像してみると,動く歩道に乗った時が思い浮かんだので実験してみた。動く歩道に乗り込む場合,動く歩道と同じスピードで乗り込むと,乗り込んだ瞬間速度が0になって,(動く歩道に対して)元の速度まで戻そうとするとそれなりに力がいる。

てなわけで,World Testerでビー玉を転がして,動いている板に乗せる実験をしてみた。結局,板に乗る前は普通に回転しているが,板に乗った瞬間回転がほぼ止まって,板を追い越すと再び回転が始まる。物理シミュレーションならこんな実験を手軽に試せる,ていう例。というかこんな実験ならリアル世界で試せよ,っていう例でもある。

# 実際は,World Testerだと板と地面の摩擦があるのでうまくいかない。上記はプログラム的に板と地面の摩擦を0にして動く歩道をシミュレーションした。

World Tester 1.3を公開。といっても新機能はほとんどなし。裏でちょこちょこやっていた外部仕様と関係ない修正が中心。Weather Typing もいろいろ修正はやっているのだが,公開できる状態にはなっていない。

スキーの物理シミュレーションのため(なのか?)蔵王へ。ちゃんと摩擦で曲がるようにするのはなかなか大変そう。

World Testerは行列計算をDirectXを使っているのだが,そのせいで計算精度がfloat型になっている。そこでdouble型で計算したらどのくらい精度が上がるかを知りたくなったので行列とベクトルとクオータニオンを実装してみた。結果は結局あんまり変わらなかった。

せっかく作ったのだが速度が遅いのでやっぱりDirectX使用に戻すか,SSE2を使って速度を上げてみるか考えているところ。

Weather Typing 2.1World Tester1.2を公開。Weather Typingについては,かなり長い時間をかけて大幅に変えたのだが,機能的にはほとんど変えていない。98系を対象外にしたのが一番大きい変更点かも。とりあえず今回のバージョンでの変更が今後のバージョンのベースになっていくとかそんな感じ。World Testerはいろいろいじってみた。ホントはデフォルトのフィールドを増やしたかったのだが,そこまでは間に合わなかった。

Weather Typing 2.1とWorld Tester 1.2をゴールデンウィーク辺りにアップロード予定。Weather Typingの方は新機能はなし。最後に公開して以来内部的にいろいろ変えているのだが,新機能がないので公開はしないでいた。で,今回は一応Vista対応という大義名分があるのでこの辺りで公開しようか,てな流れ。World Testerは割といろいろ追加している。画面サイズ変更と効果音の追加が主なところか。


マニュアルもどうせならVista対応ということで画面キャプチャしていたのだが,普通にキャプチャすると背景が透けてしまったりで都合が悪い。まずはキャプチャソフトから作るか,と思ったら「Window Clipping」といういい感じのフリーソフトがあった。透明なウィンドウ枠をPNGの透過色で表現してくれるという高機能さがいい。

某所でスイングバイの話が出ていて,World Testerなら簡単と思って5分でシミュレーションしてみた。スイングバイ。今作成中のバージョンだと画面を拡大,縮小思いのままなのでいい感じだけど,公開中のバージョンだと画面が小さすぎて見にくい。まあ見えなくもないのでとりあえず公開してみる。開発版のworldtesteritemsフォルダにフォルダ付きで展開し,WorldTesterを実行して重力を0にしてスイングバイを追加すればOK。・・・結構手順めんどいか。

今のPCのCPUはCore2 Duoなんだが,WorldTesterを実行するとCPU使用率50%で頭打ちになる。これは1つのスレッドで全て処理しているため,CPUを1つしか使わないから。そこで実験的に画面上のオブジェクトを半分ずつ別スレッドで処理するようにしてみた。具体的には,起動時にスレッドを複数生成し,当たり判定と物理演算処理を先程のスレッドにキューイングするように実装した。が,結果的には性能が1.2倍程度,CPU使用率最大70%くらいにしかならなかった。スレッド間で1つでも排他制御を入れるとシングルスレッドの方が早くなっちゃうし,複数のCPUを極限まで使い切るのは結構奥深いらしい。

ウェザタイとWorld TesterのVista 64bit版ネイティブ対応をやっていた。World TesterについてはDirectX9対応すればネイティブ動作可能だった。ウェザタイについてはDirectMusicが64bit非対応なのでできなかった・・・って古いバージョンは未サポートとかではなく完全に使えないですか。そうですか・・・。音なしでも起動できるようにしないと。

ちなみに64bitネイティブ化する利点は・・・特にない。てか多分公開すらしない。

I・O DataからUSB2-PCADPGのVistaドライバが公開されていた。さらにVista x64版も公開されていたのでついでに入れてみる。これでx64でもある程度生活できるかも。やる意味があまりないけど。


新ノートが来てからWeather TypingとWorld TesterのVista対応,Visual Studio 2005対応,Unicode対応,64bit対応をやっている(つまり機能追加の全くないバージョンアップ)のだが,Vista対応はちゃんとやろうとすると難しい。問題は主に2つ。

1つ目はUAC。管理者権限でもProgram Filesなどが書き込み禁止になるというもの。MS推奨的にはユーザごとに異なるデータはAppDataに入れよ,とのことなんだろうが,フリーソフトとしてはアンインストールが面倒になるので辛い。市販ソフトは普通アンインストーラがあるのでMS推奨通りにやればいいんだろうけど,フリーソフトはたいていデスクトップとかドキュメントフォルダにダウンロードしてその場で展開,いらなかったらそのまま削除,といった手順になると思う。でも設定をAppDataに入れてしまうと,まずデータを消してからプログラムを削除になって面倒になる。結局今は中途半端な策として,プログラムがProgram Filesなどに入っていたら設定は書き込まない方針で実装中。つまりVistaに仮想化されて変な場所にファイルができたり,ファイルに書き込めなくて落ちるといったことだけはないようにする,と。インストーラのないフリーソフトのためのもっといい方法はないのかなあ。

2つ目はUIPI。アプリケーションごとに(というかカーネルオブジェクトごとに)権限が決められていて,自分より高い権限には手出しできないというもの。これに影響を受けるのは…ロビーの自動退席機能。ロビーを起動しておいて,例えば1分間マウス,キーボード操作がなかったら状態が「退席」になるという機能だが,UIPIによって,ロビーを起動中に管理者権限のアプリケーションで作業をしていると,マウス,キーボード操作をしていても「退席」になってしまう。対策するとしたらどうやるんだ。電子署名とManifestでいいようなことも書いてあったりするけど,フリーソフトで電子署名は無理っぽいし,マウスとキーボードドライバでも書くしかないのか。って64bitだとドライバにも電子署名必須だし。てことで現状こういう制限にするしかないと。

World Tester。ウィンドウサイズの変更サポートとズーム機能の改善をしてみた。今使っているノートは画面が1920×1200となかなか広い。この画面でさすがに640×480はないよなあ,ということでウィンドウサイズを動的に変更できるようにして,さらに設定保存できるようにした。で,画面を広くしたらオブジェクトがでかすぎたりするようになったので,ズーム機能を改善することに。今まではカメラのパラメータをいじって無理矢理拡大,縮小してたのだが,やりすぎると画面が歪んでしまう。そこで,オブジェクトの方を拡大,縮小するようにして自然な感じにした。

ついでに,現バージョンでは影が真っ黒になっていたので半透明にした。


趣味プログラミングはエンハンスするときにがんがんリファクタリングできるのがいい。機能を加えるたびにコードがすっきりしていっている気がする。これが仕事だったら怖くてリファクタリングできないからどんどんコードが汚くなっていくという。

4号にWorld Testerを試してもらったが,爆発が気になるとのこと。以前のバージョンではパラメータが固定だったので爆発することはほとんどなかったはずだが,今回のバージョンは巨大な力を加えたりできるので,めり込みが起きたり,めり込みすぎると反発力が強く働きすぎて爆発が起こる。これを直そうとするとスピード(めり込まないように時間の最小単位を十分小さくする)と物体の大きさ(小さい物体だとめり込みやすいので大きい物体しか作れないようにする)が犠牲になるわけだが,今は安定性よりいろいろパラメータをいじれる楽しさを優先している。根本的に数値計算の精度を上げられればいいんだけど…。

まあそうはいっても爆発するのはなんかやな感じなので,めり込みすぎたら潔くすり抜けるようにしてみた。どっちもどっちな感じもするけど,とりあえずもう少しテストしたら開発版にアップする予定。

World Tester。万有引力を実装したものを開発版に置いてみた。これにともなって,今まで重力をmgで求めていたのを万有引力定数と地球の質量,半径から求めるように修正。

調子に乗って太陽と地球をシミュレートしようとしたが,スケールが合わなくて断念。今のWorldTesterでは球の最小半径が3cmくらい(そういえばマニュアルに書き忘れた。重要な制限事項なのに…)なので,地球を3cmにしても太陽が3mくらいでばかでかくなるし,軌道半径も350mくらいになってしまう。そもそも1回転するのに1年かかるし。てことでボール2つが回っているだけのサンプルを追加。追加する前に重力を0にしておくこと。

2006111101

World TesterをVectorに登録してみた。World Tester


最近(?)ランキングがCoreを吐いて落ちている。CGIだから何もなかったかのように続いているんだが,何だろう。「最近おかしいよ」っていう情報があれば知らせてもらえるとありがたいです。

平成教育委員会で無重力振り子の実験をやっていた。WorldTester付属の振り子は回転しないようになってるので平成教育委員会のようにはならない。てことで回転するようにしたバージョンも作って開発版に置いてみた。ジェット機をチャーターしなくてもPCで実験できるのがいいところ。

WorldTester。今まで衝突判定の前処理に境界球による判定をしていたのだが,軸に沿った箱(AABB)判定に変えてみた。結果,一番効果のあったドミノ倒しで1.3倍くらいの速度向上になった。この後は空間分割をやって,オブジェクトが多い場合でも遅くならないようにしてみるか。

WorldTesterの物体定義を外部ファイルでできるようにしてみた。結果,うーん,改造は簡単にできるけど,新規に作るのは難しいかも。とりあえずこれと,物理定数のカスタマイズができたら一旦公開の予定。

ずっと仕事ばかりなので最近ネタがない。それもどうかという感じがするので,WorldTesterのカスタマイズ機能でもサポートするかな。

パジ氏がFlashで缶コーヒーの無重力アニメーションをやっていたので対抗してWorld Testerで缶コーヒーの無重力アニメーションをやってみた。ユーザが簡単にカスタマイズできるようになれば結構面白いソフトだと思うのだが,今のままだとやっぱり使いづらいですね。

Microsoft Physics Illustrator for Tablet PC」を試す。これはタブレットPC上で描いたものが物体とか紐になって,そのまま物理シミュレーションされるソフトなのだが,ピタゴラ装置シミュレータとの評判らしい。ちなみにTabletPC SDKさえあればWindowsXP+マウスでも動く。2次元なのでちょっと地味だけど,私が「World Tester」でやりたいことにかなり近い感じ。

パジ氏に聞いてみたところ,World Testerの15パズルは62FPS出るとのこと。うちじゃ40~50くらいしか出ないから高速化に力を入れていたというのに。これ以上高速化しても,最近のPCだと全然意味ないんですかね。

物理シミュレータ World Tester1.01を公開。変更点は,高速化と円-円衝突ですり抜けるバグの修正。リビジョンはあまり好きではないので本来なら開発版にするのだが,円-円のすり抜けは明らかにバグなので正式版にした。

WeatherTypingは現状いろいろな仕様のしがらみがあっていじくるのが難しいのだが,こちらは新規なのでしがらみがなくて気が楽。てことで頻繁にバージョンアップしていく予定。

WorldTester。箱と箱の衝突判定に対して分離軸判定を用いるようにする。結果,かなり速くなって,うちの環境だとドミノ倒しで35FPS→62FPS,15パズルで9FPS→47FPSにまで上がった。というか元のコードが遅すぎという話もあるが。

WorldTester。衝突判定の高速化を目指し,とりあえずOBBの分離軸法を実装中。

WorldTester。4号から「音源がないと起動しない」という報告を受ける。確かに以前,音を鳴らそうと思って音関係の初期化を入れたのを忘れていた。といっても通常の環境なら問題はないと思うので,Ver1.0では制限事項。