(no title)


_ ! [プログラミング] リフレクションlib

どうやらさらにバグがある模様。ツリー構造のモデルでたまにデシリアライズに失敗…

_ ! [プログラミング] 描画

ツリーの問題が解決しないけど、単に表示部分をテストしてみた。

_ 色々と苦労したけど、ワイヤー上でVB/IBの状態確認…


スキンメッシュ行列


リフレクションlibにバグが潜んでいた

抽象クラスはNG. templateのインスタンス化後、メンバ取得のために抽象クラスのインスタンス作ろうとするのでNG
ユーザーのオブジェクト型をさらに派生したクラスでのエラー

どうやら、class Aを継承したclass B, class Cが居て、それぞれの初期化と、A自身の初期化で、おかしな状況になっていた。こちらは修正済み。

しかし、最初の項目はシステム上どうしても無理だ…。
抽象クラスのメンバのシリアライズは派生先で再定義してもらうしかないのか…。システム的に破綻っぽい orz

スキンメッシュ

とある場所で、ボーンの部分で、ローカルのワールドの逆行列という記述をみた。
さっぱりなので、色々と調べてみた結果このような表記はXSIの部分で使われているようだ。この行列Inverted_matBasePoseとかOffset行列とかいろいろな呼び方をされている模様。

モデルが初期ポーズをとっている状態でボーン空間をきちんと合わせるのに必要な行列ということらしい。

各ノードのワールドマトリックスを作るには、


ここで逆変換を作用させて、ボーンのローカル空間へ. 骨のポーズ状態が原点としているらしい…

“日々精進時々堕落”というWebが参考になりました。
各状態が算出された後の実装方法は、DirectXのSkinnedMeshサンプルで何とかなるんですが、それに必要なデータの情報ってなかなかないですよね。

 


(no title)


[プログラミング] スキンメッシュ注意点

スキニングメッシュを読み込むときには、

  • D3DXMESHCONTAINER
  • D3DXFRAME
  • ID3DXAllocateHierarchy

らを派生し、ロード&生成コードを自前でかかなくてはいけない。

ここで、派生の決まり事である、デストラクタはvirtualを付けよ。
という点を無意識のうちに書いていて、ミスを犯した。

ルートとなるD3DXLoadMeshHierarchyFromXでの結果格納のpFrameで、
ウォッチで値を見てみると数バイトずれて結果が表示されていた。
そこで疑いを持った。

  • 呼び出し規約でも間違えた?
  • virtualが悪い?

のどちらかがまず怪しい感じがしたので見てみた結果比較的短時間でわかった。

あと気になったのは、ボーンのオフセット行列。
メッシュコンテナに入っていて描画時はそこまで違和感を感じないのだが、
なぜボーン(Frame)の個々の要素として持たないんだろうと。

モデラーから出力されたデータを想定すると、各ボーン毎にオフセット行列があっても良い気がする。


スレッドプログラミング


Java互換スレッド操作ができるライブラリ作成中。

あちらこちらでバグにはまり、時間だけ浪費している感じですがようやく動くようになってきました。

待ち行列とsynchronizedクラスのペアで操作
この部分で、1日ほぼ費やしました。

[code lang=”cpp”]synchronized lock( waitingQueue->getCriticalSection() );
{ // データがないので待つ
waitingQueue->wait();
}[/code]

という操作している部分で、2重ロックしていたという…。

結論、待ち行列管理する部分でのwait時にはロック保持しないことに。

そして、動作チェックということで、マルチスレッドのデザインパターンサンプルを作成してみたり。


リモートデバッグ


DirectXのプログラムを作っているわけですが、開発機が既にVistaのため、デバイスロストを発生させることが出来ないので、WindowsXPのマシンを用意してリモートデバッグを試みてみたのですが、なにやらうまくいかず…。実行体を全く同じパスにおいて実行してみるも、拒否されたとか言われてしまう。

WinXP SP2での変更のため、MSDNヘルプの通りにやっても動かないという話もあるし。

とりあえず試したのは、

ファイアウォールの無効化D
COMのリモートによる起動を許可

あと、XPHOMEではローカルセキュリティポリシーが存在しないため、そもそもリモートデバッグのクライアントを入れることが不可能ぽいです

 

DirectX環境依存

SetRenderStateのカリング指定で、無効な値を入れてしまったときの挙動が環境によって異なっていた。GeForce系は無事に動いていたので発見が遅れました。

ちゃんと設定しないとねーということで。

他にも、デバイスロスト時のリソース復帰について環境依存が。
D3DPOOL_MANAGEDであってもテクスチャが正常に復帰されないバグに見舞われました。

環境は 945GMのチップセット統合。他には915GMでも起こると推測されます。

結局のところ、Managedは当てには出来ないのかもということになり、自前でリストアコードを書いた方がきっと無難だろうなと思います。

 


d3dx_*.dll 非依存


ある人に聞いてみたらやはり可能とのこと。

事前コンパイル済みのシェーダーを使うことで何とかなりました。この場合の問題点は、名前ベースでシェーダー定数にアクセスできなくなること。
やるとすれば、VertexShaderConstantFなどを使い、レジスタ番号指定してデータセットになります。
シェーダーのバイトコードを解析して、定数レジスタと名前などマッピング取れるかなと思いましたが厳しいかも。ゆるくやるには、d3dx.dllは切れない感じですね。

考えてみた方法1

事前コンパイルしたバイトコード+ConstantTableの情報を、オリジナル形式でファイルに書き出したらどうだろう。
ConstantTableから名前→レジスタ番号が取れれば、それも事前にファイルに記録しておくことで何とかなるかも。

 


CDDirectPrint


プリンタをVistaでも正常に使いたい!

うちで使っているプリンタは、PM-930C。メーカーの情報によるとVistaでの動作は、標準ドライバで動作すると書いてあります。自分の環境はVistaはVistaでも x64版・・・。大丈夫かなぁとおもって試してみたところ、文章などのA4印刷は無事にできたことを確認できました。

しかし、CD/DVDのラベル印刷はどうもできない模様。

CD DirectPrintのソフトも手動でインストールをしてみたのですが、いざ印刷してみると、A4と思っているらしく位置がずれる…。どうがんばってもダメでした。

アップデートしようにも、exeの実行ではじかれるし。それでも、32bit VISTAならば動くことがわかりました。OS標準のドライバではなく、XPのドライバを使用して、CDDirectPrintをインストールすれば動くようです。x64で動かす方法は見つかりませんけど…。

 


MonsterXメモ


MonsterX on Vista

あまり記述を見かけませんが、MonsterXをVista上で動かしています。
ドライバ: 8月版
ソフト: hunuaa + huffyuv + lameMP3 + MxCapture

これで今のところ、キャプチャもうまくいっています。
C2D : E6300
Mem : 2GB

ただし、MxCaptureのAVI Muxの部分ではふぬああのものを使用しています。
標準のものでは、かなりのドロップフレームが発生してしまいちょっとまずいです。
また、hunuaaのmuxをインストールするところでも Vistaはやっかいでした。

ふつうに、regsvr32 huavimux.axでは失敗します。

いろいろと調査してみると、UACの関係らしいので、そこをクリアできれば正常に登録完了できました。

  1. コマンドプロンプトを”管理者として実行”
  2. 登録コマンドと実行

わかればたったこれだけなんですが、あまりにも検索で引っかからないのでここに書いておきます。

ちなみに、うちの環境では標準とhunuaaCap Muxでの違いはドロップフレームが一桁違うという結果が出ました。
hunuaa使用版で音声も無圧縮にしたらもう少し減る感じがしますが。

CPU使用率100%なので、不安定さが結構あるかも・・・。


久々に template C++


変数が配列かのテスト

templateと関数のオーバーロードなどを駆使して作ってみた。一応うまく動いているものの何か気になる。まずい点とか誰か指摘してくれないかなぁ…

使うときには、 int array[ 10 ];なるものを、 testArray( array )とやって、trueが返ってくれば 配列である。テンプレート使っているものの、関数呼び出しも使っているので、inline指定しているといってもコンパイル時に実行コードが決定されると言えないかもしれない。

最適化がうまくかかってくれれば、コンパイル時にチェック完了で余計なコード消えそうな気もするが…


一段落


引っ越し一段落

土曜日にベッドが着て、ようやく睡眠もまともになったと思います。
最もそのベッド組み立ては結構大変でしたが。重いしでかいし。
友人に手伝ってもらいに来て思うような位置にやっと置けました。感謝。

その後、近くの居酒屋いって飲んで、楽しかったです。

収納がついているベッドのため、今まで床上散乱していた本とか書類群を仮に納めてみました。
ゆくゆくは本棚かってそこへ入れる予定。ベッドの中へは衣類入れたいし。

とりあえず、自分的に人を呼んでも恥ずかしくはない散らかり具合なので、やっと引っ越し一段落です。

近日中にエレクター買って、HDDレコーダ&液晶TV買うところまでやりたいなーとか思っていたり。

ManagedDirectX + C#

初めて手を出しました。
JavaはそこそこなれているのでC#余裕だろー思っていましたが、

いろいろと、似たようなクラスや操作を探すのに手間取った感じです。
でも、メモリのリークとか考えなくていいし、温い環境だなぁと思ったり。

半分寝ぼけながらも作れそうです(笑