某所(オンライン)でやってたイベントの出し物はなんとか出せました。
完璧では無いがそれなりのクォリティにはなったので満足かな。いや思ったより良くできた。
それよりイベントのページおいといたレンタルサーバが503出しまくって困った。イベントなめてました。想像以上のリクエスト数と転送量で制限かけられたみたい。
そりゃxreaなのでやっすい所に期待は出来ないわけなんですが、数日しか負荷かからんのに高いサーバ借りるわけにもいかん。告知はしないといけないからその日だけ建てればいいわけでもない。となるとGoogle App Engineみたいな従量制サーバを使えばいいんですかね。
おうちサーバという選択肢もあるけど、回線の帯域が問題なのと、万が一の事態があったときにひどいのでイベントなんかには向いてないと思う。
そういやwxRubyの2.0.1が出てました。GLCanvasのコンストラクタ辺りが変わってるようなのでもし使ってた人は御注意を。
なんでかわってんのかと思ったら、なんかオーバーロードの解決が難しくてつかえねーよとか、別のGLCanvasをコンストラクタに渡して共有コンテキストを作るのはwxWidgets 2.9.0以降でdeprecatedだよとかそういうことらしい。
ついでにGLContextも削除されちゃったので共有コンテキストを作ったりする方法が無くなっちゃった。
GLContext削除はやりすぎだろおいと思ったが、wxWidgets 2.8.xではGLContextのコンストラクタにポータビリティが無いとか。
確認してみたらたしかにそうで、プラットフォームによってコンストラクタが違う…!2.9.0以降では統一されてるっぽいのでそれがメインになるまでは我慢するしかないね。
つか今さら気づいたんだけど、OpenGLのコンテキストって一回作った後はデバイス(とピクセルフォーマット)が同じなら描画対象独立なんだね。一つのコンテキスト使いまわして複数のウィンドウに描画も出来たってわけか…。
しかしwxRubyではGLContextが取り除かれちゃったのでしばらくは出来ません!残念だわ。
ところでwxRuby自体はwxWidgets 2.9.0でも簡単にビルドできたらしい。wxWidgets 2.9.0からはGLCanvas作るのにMSAA指定も出来るようになってるからうれしいなぁ。
まあ2.9.xは開発版だから、wxRubyがこれベースのリリースになることはたぶん無くて、安定版の3.0.0を待つことになるんだけどね。
それまでちょこちょこクラスとか追加したいな。うん、やるのは簡単なんだけど、英語でパッチ送ったりするのがね…。
Blender Game Engineでなんか作ってイベントで配布しました。
ほとんどプログラムも書いてないしというかゲームでもない、ただの…ただの、なんだろ。こういう物です。
こういうくだらないものを作るには便利ですね。ゲームをまじめに作ろうとすると面倒過ぎるというか。
面倒だったのが、細かい破片とかに一個ずつ動作を指定してやったこと。モニターが割れたときのガラスなんかはまじめに割ったので破片一個一個が別オブジェクトで、それぞれにクリック時とかの設定すること30個以上。それをいちいち手で設定したわけですよ。めんどい。
本当は割る前の板の状態で一回設定して、それから割れば一回だけの設定で済んだんですよね。でも割って設定してから気づいても遅いんじゃあ!
難しいのは分かるが複数選択しての編集が出来ないのが辛い。つらすぎます。
あとはパーティクルが使えないのが本当に残念。煙が出ないのかとか言われたけど、自前でパーティクル作るのはめんどいんですよ。時間もなかったし。
さすがに毛とかは無理でもいいんだが、普通のビルボードパーティクルは出せるようになってくれるとうれしいな。
テーブルクロスをかけようといわれたんだけど、ソフトボディではさすがに無理がありました。別途機能としてあるクロスシミュレーションはゲームエンジンでは使えない。まあこれは文句言わんよ。スカートひらひらもがんばらないと難しいってことか。
物がへこんだりするのはオブジェクトを差し替えてるんだけど、差し替えじゃなくてモーフィングできんのかといわれた。うおー、そうか。シェイプキーはゲームエンジンで使えたんだっけ?
と思いはしたものの、さすがに時間無かったので諦めた。もうけっこう作っちゃった後だし、差し替え前後で頂点数が変わるようになっちゃってたからねぇ。
差し替えといえば、ゲームロジックでAdd Objectすると差し替え元のオブジェクトの原点に新しいオブジェクトの原点が一致するように出てくるっていう仕様なんだけど*1これなんとかならねーか?
スクリプト書けばそこからさらに動かすのは可能なんだけどちょっとめんどい。アクチュエータにオフセットの設定箇所があればいいだけなんだけど。
これを回避するために、たとえばPC本体がケースと蓋にわかれるときに、どちらも元のPC本体と原点を一致させてる。おかげで蓋の原点がメッシュの中心からずれてる。
ずれるのはいいんだが、コリジョン形状をボックスにすると、ずれてても必ず原点を含むボックスになっちまうので蓋の形状より余計にでかくなるんだよな。
これはボックスじゃなくてConvex Hullとかにすれば、原点は含まないで計算してくれるんでそれほど問題では無いんだけど…。
いや、これはAddObjectの問題というよりボックスの計算がおかしいってだけか。
あとはやっぱり物理エンジンの挙動はなかなかなれないな。本当にまじめに設定すると全く面白くない絵が出来るので、しかしあんまりやりすぎるとすぐ制御しきれなくなるというかあっというまにふっとぶので、適度にインチキするのがめんどい。
今回はある程度殴ってオブジェクトが変形するタイミングで上方向(+Z方向)に適当に速度をあたえた。あと適当に回転速度もいれた。なんで上方向なんだよというのはよくわからんけど、気持ちよくとんでくれるのでそのへんは最早どうでもいい。
で、だいたいできたんだけど、GLSLモードでしか確認してなかったんでTexture Faceモードにしたら酷い見た目になった。うへへ。
とりあえずはGLSL使えるマシン専用(さよならIntel)として配布したんだけど、せっかくなのでTexture Face版も作ろうとした。
さて、普通にTexture Faceモードで動かすと、マテリアルは無視して編集モードで面に設定したTextureがそのまま表示される。ライティングもなしに。
いや、ライティングは適用してほしいんですが。テクスチャそのままはあまりにもしょぼい。物にはよるんだけど、テクスチャに陰影書き込んでないからなぁ。
やりかたとかどこにも載ってないので、無理なのかといじり回してたら発見。編集モードで面を選択すると、Texture Face用のパネルがしれっと登場してた。
これでライト有効とか設定すれば、Texture Faceモードでもライトが有効に、有効に…ならない…んですが…。
どうもこれはActive Faceとかいって選択したうちの一面だけの設定らしい。おいまさか全Face設定しろとか言うのかよ!と思ったらパネル右上のコピーボタンで選択中の全ての面に設定をコピーできたのであった。わかりづれー。
後は特に苦労することもなく。なぜかライトが過剰に明るく適用されてしまうのでライトを減らしたり弱くしたりはしたけど。これなんでだろうなぁ。
ライトを変えちゃったから同じファイルでGLSL版とTextureFace版両方出来るようにはならなかったけど、とにかくこれで仮想マシン内でもPCを殴れるようになって満足です。
で、配布したらGeForce 8400GSでも軽い方動きました!という報告が。うん、そりゃ動くけど、GeForceならよほど古くない限りGLSL版でも動きますよ…。たしかにしょぼいグラボで動かない的なことを言いましたが、Intelのことですから。そこまで重くは無いですから。
*1 というか元オブジェクトの姿勢がそっくりコピーされる仕様なんだけど