2005年03月20日
やりたかったこと
ちょっとプログラムの問題に傾倒しすぎて、当初の目的を忘れていた。
創りたい物は、3D RPGのイベントシーンのようなものがずっとつながってストーリーが展開されていくような作品。
ノベルやADVとは違うし、ムービーとも少し違う。
リアルタイム3Dアニメーションノベル? 既に名前があるのかどうか知らないが、そういったものを作りたい。
3Dであれば、モデルデータやアニメーションなどが再利用しやすいので、蓄積されていくごとに作りやすくなっていき、ドラマ的なものへなっていくのではないかと思っている。
データの蓄積もクリエイティブコモンズ ( Japan.internet.comの記事 ) によって、促進されればなぁと思う。
ただ、クリエイティブコモンズは使用時のライセンス料などの商用関連のライセンス項目がないのが残念。また、現状そんなに普及していないのもちょっと・・・と言うところだが、オープンソースが普及してきたように、クリエイティブコモンズも成長していけばと思う。
とにかく、そういった作品を作ること、また普及することが目的。
なので、3D拡張のシステムはそういったものが作りやすい性質のものにするつもり。
クラス構成などはJava3DやLAMPを参考にしようと考え中。(どちらかと言えば、Java3Dを基本とするようなもの)
システムは思いっきりDirectX依存になる予定。
リアルタイム3Dの性質上ある程度仕方ないし、少し依存するなら思いっきりしちゃえって感じだ。
後、バージョン1は期待しない方が吉だろうな。
投稿者 Takenori : 13:54 | コメント (2) | トラックバック
2005年03月19日
子ウィンドウへ描画
CreateDeviceに渡すhFocusWindowは最上位ウィンドウかNULLでなければ失敗する。
ここに子ウィンドウを渡してみたのだが、失敗したので出来ないなーと思ってやめていた。
でも、EffectEditサンプルでは子ウィンドウに表示できている様子。
EffectEditサンプルはMFC+DXUTだったので、コード追うのを途中でやめた。
と、ここまでが少し前の状態。
で、今日再びコードを追ってみた。
CreateDeviceに渡す、D3DPRESENT_PARAMETERS の hDeviceWindow へ子ウィンドウのハンドルを入れれば、そこへ描画してくれるようだ。
で、ビルド。
うまくいった。
描画速度も問題なさげ。
もう少し機能を追加すれば、いろいろと遊べそうだ。
楽しくなってきた。
投稿者 Takenori : 22:41 | コメント (0) | トラックバック
直接描画が出来ない
BaseLayerのDrawが最終的に描画を行っているみたいなので、何もせずにreturnするようにしてメイク。
実行させると何も描かれなくなった。
で、プラグインの方をレンダーターゲットを設定せずに、普通にPresentするように戻し、実行。
何も描画されません。
あれー?
よくわからない。
レイヤーへ描画する方もいろいろといじってみるが、速度はいっこうに改善されず。
速いマシンでも同じぐらいの重さ。
何か根本的な問題があるような・・・
スクリプトから3Dを触れると言うのは思いのほか楽しかった。
VCでビルド&実行というのも作業量的には同じなのだが、スクリプトの方がかなりお手軽。
まあ、プロジェクトを作ったりしなくてもいいし、面倒なことはクラスDLL内に行っているので、お手軽な感じがする。
初めから大部分をスクリプト側に提供するようにしておき、プロトタイプをスクリプトで組んでいくのが楽でよいかも。
で、速度が必要な部分や汎用的な部分をネイティブに実装する。
そんな感じがいいかな。
吉里吉里の3D拡張は、メリットが薄くなってしまったかもしれない。
Teaspireの方へノベル/ADVシステムをのせる方が良いかも。
初めはRPGのシステムをTeaspireへ、ノベルは吉里吉里へと考えていたけど。
投稿者 Takenori : 11:26 | コメント (2) | トラックバック
2005年03月17日
重ひ・・・
レイヤーのバッファへのポインタを設定して、レンダリング後イメージをそこへコピーするようにした。
バックバッファのサーフェイスをロックしコピーするのはやはり無理だったので、レンダーターゲットを指定して、そこからコピーするようにした。
表示はされたけど・・・ 重ひ・・・
Athlon XP 1600 + GeForce2 MX400で、5FPSぐらい。
ほとんどMeshサンプルそのままだけど・・・
この方式で普通に使えるぐらいの速度は出るかなぁ。
うーん・・・ どうするか。
投稿者 Takenori : 14:15 | コメント (0) | トラックバック
2005年03月16日
描画されない
プラグインを最初にロードし、変数にクラスを持たせ、ベースレイヤーでonPaintをオーバーライドし動作させてみる。
が、真っ黒。
そういえば、作ったクラス単体で動くかどうか試していない。
テスト用のプログラムを作り、動作確認。
少し間違っていたので修正しきちんと表示されるように。
修正したのでプラグインの方も再度ビルド。
動作させてみるがやはり真っ黒。
うーん、なんかDirect3Dで描画した後、上書きされているような・・・
吉里吉里の描画部分を追うが深いので途中で断念。
レンダーターゲットをサーフェイスにして、そこから吉里吉里のレイヤーへ描くようにすれば描画できると思うが、VRAM->システムメモリ->VRAMとなんか無駄な転送しまくりなのがちょっと嫌。
完全に3D化し効率的な動作を目指すのであれば、吉里吉里本体からレイヤー周りをはずして、Direct3Dに描かせるのが良い。
でもそしたら亜種になってしまう。
吉里吉里3Dとかいう名前にするのも楽しいかもしれないが・・・
そしたら、#ifdefとプロジェクトに含めるソースで切り分けられるようし、できるだけ共通のソースにしたほうがメンテナンスは楽。
まずはレイヤーに描いてみるかな。
吉里吉里3Dはその後に考えよう。
投稿者 Takenori : 01:59 | コメント (0) | トラックバック
Direct3Dを使えるようにしようとする
LAMPばかり触っていて疲れてきたので、Direct3Dを直接使い、吉里吉里上で表示させてみようと考え、作り始めた。
Direct3Dに設定したWindowに対して、GDIで描画したらどうなるか試してみる。
両方描画できているっぽい。
これならオーバーレイのような感じで使えそう。(オーバードローと言うような表現が良いかも)
まずはとにかく表示できるようにすることとし、チュートリアルのメッシュをベースに、各機能をクラス化した。
ただし、VectorやMatrixのクラスも追加するのは面倒なので、引数にx,y,zを渡すなどして少し省力化。
各クラスが出来たので、クラスプラグインとして利用できるように、インターフェイスとなるクラスと登録用の関数を書く。
激しく面倒くさい。
SWIGを拡張してTJSに対応させるか、簡単なスクリプトからクラスと関数を生成してくれるようなツールが欲しいと切に願う。
でも、今回はすべて手書き。
そもそもどうやって書くかまだあまり知らないし。
クラスを返したり、受け取ったりする部分はどのように書くのだろう?
よくわからないので、勘で次のように書いてみる。
tTJSVariant result;
iTJSDispatch2 *tjsclass = Create_NC_Transform3D();
tTJSVariant val = (tjs_int)m_XObject->getTransform();
tjsclass->PropSet( TJS_MEMBERMUSTEXIST, TJS_W("transform3d"), NULL, &val, tjsclass );
result = tTJSVariant(tjsclass);
tjsclass->Release();
val.Clear();
return result;
実行させてみるが、どうもうまくいっていない様子。
Transform3Dと言うクラスにネイティブにクラスのポインタを持たせ、transform3dというプロパティでそのメンバへ直接値を入れられるようにして、PropSetで渡せば何とかなるかと思ったのだが・・・
吉里吉里の内部のコードを見てみると、コンストラクタの引数で値を渡している物があった。
そうか! コンストラクタで実態を渡せるようにした方が良いか。
よく考えるとそれではまずいこともありそうな気がするが、とりあえずそうする。
で、次のように書く。
tTJSVariant result;
iTJSDispatch2 *tjsclass = Create_NC_Scene();
iTJSDispatch2 *out;
tTJSVariant param((tjs_int)m_Graphics.getRootScene());
tTJSVariant *pparam = ¶m;
tjsclass->CreateNew(0, NULL, NULL, &out, 1, &pparam, tjsclass);
result = tTJSVariant(out,out);
tjsclass->Release();
//out->Release();
return result;
このソースは上のソースとは違う場所。
コメントアウトしている場所は、これをやると開放しすぎてしまうので、コメントアウト。
ここは、なんかわからないけど、初期化されてねー、アクセス違反が出るなどなどかなり悩んだ。
なので、ここではRelease()をコールするのは間違いのよう。
とりあえず、これで吉里吉里からこのクラスプラグインが使えるようになった。
いろいろとはまったけど。
投稿者 Takenori : 01:28 | コメント (0) | トラックバック
2005年03月06日
ソフトウェア3D
Widgetのことで、Layerのメソッドを見てみると、図形描画系のメソッドはFillRectぐらいしかない。
ライン描画と円の描画は昔書いたので、そのコードを久しぶりに見てみる。
あんまり変更しなくても、動くことは動きそう。
とりあえず、Widgetならライン描画ぐらいあれば事足りるわけだが、なんとなくポリラインやポリゴン、三角形なども描画出来たらなぁ・・・ テクスチャマッピングとか。
そんなことを考えていてふと、ソフトウェア3Dライブラリを組かな? と思った。
昔ターゲット用に遊びで組んだものは、フラットシェーディングまででライティングは全然だった。
基礎の学習とコードの追える3Dライブラリとして作るのもいいかも。
以前、途中まで書いた3Dのドキュメントも見直して公開し始めても良いかも。
3Dの基礎的な部分って意外とドキュメントや書籍が少なくてかなり困った記憶があるが、今は整備されているだろうか?
なんか、すごい脱線していっているかも・・・
