D言語が素晴らしかった

ずっとOCamlで開発してきたけど、Windowsでやるにはどう考えても不利だ。
まあWindows版の放置っぷりは他の言語も似たようなもんだし、まともにWindowsでネイティブで開発できるのはC/C++しかないのだろうか・・
観念してC++でちょっとColladaのリーダーを作ってみたんだが、これ以上やる気がでない。
あんな気持ち悪いのなら面倒くさくてもCで書くだろう。
もはやCでやるしかないのだろうか。。。
そんなとき、D言語を推すブログを見てそんなものもあったなあ、とD言語について勉強してみた。

プログラミング言語D

プログラミング言語D

D言語ではCのlibやDLLの関数を直接呼べる。
昔はWindowsではlibにCOFFとかOMFとかあって単純には行かなかったんだが
最近は64bitならVCのリンカを通すのでそのまま使える!
CygwinだのMinGWみたいな気持ち悪いツールが必要ないのは素晴らしい!
ヘッダファイルみたいなインターフェースを定義する必要あるけどね。
それでも他と比べて簡単すぎんよ。
大体、インターフェースライブラリがあるので自分でやる必要はあまりなさそう。
ライバルのGo言語はCのAPI使うのはめんどくさそうだったし
rustもなんかWindows版は怪しい気がする。
こりゃどう考えてもD言語しかあるまい。

  • VisualD

VisualStudio上で動くIDEなんだが未完成臭しかしない(まだVer0.3.38だし)
VC++でビルドしたlibを参照するとわけわからんエラーでビルドできん。
エラーはDのstd.utf.UTFExceptionが投げられてるので、ビルド中にDで作られた処理が走るらしい・・・?
さすがにこれはわけわからん。

  • XamarinStudio

現状こっちだろうな。
よくわかんないけどデバッグでもブレークポイントが止まらないのでVisualDも併用しようかな。

  • ライブラリ

Derelict3というSDLやらOpenGLやらODEやらゲームで使えそうなCライブラリのD用インターフェースライブラリがある。
ただ、build.dでビルドを実行できるらしいが、これで作られたlibは参照すると無効になったしまう。理由は知らない。
自分でビルドしたら上手く行った。まあ、XamarinかVisualDにファイルをぶち込んでビルドするだけだからね。

3D-Coatがすごい

3D-Coatというモデリングソフトが面白すぎる。
Zbrushみたいなスカルプトなんだが、普通の3Dみたいに面の集合ではなくボクセルを操作するが面白い。
ボクセルなので好きな位置に好きなように付け足していくことができ、かなり粘土に近い感覚でモデリングすることができる。
ボクセル - Wikipedia
ボクセルってのには前から興味あった。
自前で実装するならシェーディングとかどうするのか全然わかんないけど
3Dモデルをボクセル単位で操作するってのはなんか
SFによくあるようなナノマシンをプログラミングするみたいですげえ面白そうだ。
プログラミングで動的に形状をモデリングすることも可能だとしたらロマンがある。
水とか火とかの自然現象かスライムみたいな不定形のクリーチャーならいけそうな気もする。
T2みたいに体の一部を剣に変えたりするようなのならなんとかできんのかなぁ。

Colladaを読み込んでみる

Colladaという3Dモデリング用フォーマットが便利そう。
Blenderからでもexportできる。
COLLADA 1.5.0
とりあえず、単純に表示するだけならgeometryタグ内のデータでいいんだろうか。
xml-lightでちまちま読み込んでいく。(F#ならなら一気にデシリアライズできてしまうだろうなぁ、)
XMLという形式は読み込みやすいがデータ型を作るのは面倒だ。
同じタグでも微妙に属性やなんかが違ったりするから
OCamlのrecordでは面倒くさすぎるのでClassを解禁してしまった。
Classを初めて使って知ったのだが、OCamlのClassはダックタイピングだったんだなぁ。
動的言語みたいにメソッドの型が一致してれば突っ込むことができてしまう・・・

ODEのOCamlバインディング

OCamlにはODEのライブラリはないのか・・・あった。
OCaml ODE

しかし、これのグルーコードはVC++ではコンパイルエラーだらけでまともに使えそうにない。
C言語なのにここまで互換性がないのはショッキングだな。
調べてみるとgcc拡張ってのが色々あるんだなぁ、、、

物理演算エンジンに手を出してみる

物理演算エンジンを使って見ること。
比較的メジャーなものはBulletとODEだと思うが

  • Bullet

HelloWordの時点で嫌気が差してくる。
最初のサンプルからして長ったらしい名前のクラスをたくさん作らされる。
この取っ掛かりの悪さはオブジェクト指向のライブラリゆえだろうか。
何よりC++用であるというのが致命的か。C++だと他の言語(OCaml)から呼べん。

  • ODE

こっちはシンプルでいいねえ。
Cのインターフェースだし、オブジェクトの切り分け方もわかりやすいと思う。


というわけでODEを使っていく事にする。
参考になるのはここかODE プログラミング解説

  • ODEの描画

一応DrawStuffというライブラリはあるが
視点とかカメラ操作とか固定されてる感じ。ゲームには使いにくい。あくまで簡易実験用か。
ODEではオブジェクトの見た目はジオメトリというらしい。
ジオメトリはSphereやBoxという形状が用意されている。
自分でモデリングしたものに適用したければどうすればいいのか。
ODE/ジオメトリ - bambooflow Note - アットウィキ
多分モデルの頂点情報から三角形ジオメトリを生成していけばいいんだろう。


これでもう衝突判定のことに悩まなくても済むようになればいいなぁ
モデリングデータからジオメトリを生成するようにできればいちいち考えなくてもよくなってモチベーションも上がってくる。
(パフォーマンスの問題はあるが)

この正月から運動不足を解消するためにジムに通い始める。
毎日ほとんど座ってるだけだったからな。IT業界は最悪だ。

こんな靴を買ってみたのだが周りから浮いてしまっている。
まあ、気にしない。

最近買った本

ZBrush マスター (DVD付)

ZBrush マスター (DVD付)

Zbrushの使い方についてはこれ一冊でよさそうな感じ。
ZbrushにはZscriptとかいうスクリプトがある
この本には書かれてないが、Blenderほど高機能ではなさそうだ。
せいぜい作業の自動化くらいしかできない。
あとZbrushではボーンを仕込んで出力する、みたいなこともできない。
あくまでモデリングすることに特化してる。
ZbrushのデータをBlenderに読ませることは可能らしいので、ゲーム用途のデータ作りならBlenderも使わなければならないかな。

OpenGL 4.0 シェーディング言語 -実例で覚えるGLSLプログラミング-

OpenGL 4.0 シェーディング言語 -実例で覚えるGLSLプログラミング-

ついでにGLSLの本。
4.0以降の実例ってあまり見ないのでようやくといった感じか。