2010年12月27日月曜日

etc - C79

C79ですが、運よく当選したので、

31日(3日目) モ-27b うにマック

に居ます。


まだ何もできてないですやばいしぬ。
運よく完成すれば、3Dモデルデータ1品 PMD形式 の予定です。
→完成しなかったのでMQO形式になりますすいません。
PMDエクスポータも結構本気で書いてるので、近々(できれば1月3までとかに)何とかPMD化すると思われるので、PMDが運良く完成した場合のDL用のパスワードをCDに添付しておきます。

.blend形式も需要ないけど入れておきます。



あと、

blekeiさん
blekei's WIP


と、Hさんのモデルデータ(MQO形式)が付きます。



---------------------------



残り、モーフとウェイト調整

2010年12月12日日曜日

blender - Blender2.5でKinect(4)

ライブラリをOpenNI(http://openni.org/)に変更。色はlibfreekinectのデモ風のを使いまわし。

見た目変わってないけど、モーションキャプチャ用のアルゴリズムが用意されているので、後は使うだけ状態。

折角論文読んで実装しようかと思ってたときに、完全に実装されている出来が良いライブラリをオープンソースで出されて、モヤモヤする。libfreekinect最初から飛びついてた人も結構モヤモヤしているのではないだろうか。

2010年12月11日土曜日

blender - Blender2.5のRNA(2)

ビューを1つ追加したが、ヘッダが出ない。
大体片っ端からTimelineのところを探してKinectに書き直して追加していったので、追加する箇所は全部あっていたんですが、どうしてもヘッダ出ない。(ここまでが前回)

そして苦戦の末





ついに出ました!

ここのUIは、Blender実行時に、
2.55/scripts/ui

以下のpythonスクリプトから、動的に作っているようです。
このpythonスクリプトのなかで、RNAで設定したプロパティやら、space_typeの定義やらが使えます。

つまりUIの追加は、既存のpanelとかspaceとかにボタン追加したりする程度なら、scripts/ui以下のファイルいじればOKですが、spaceとか親玉っぽいUIの追加は、非常にめんどくさいです。

現時点でいじったファイルは、こんな感じです。

2010年12月9日木曜日

blender - Blender2.5のRNA

目的
・UIのビューのヘッダ、せめてビューを切り替えるメニューのところが出したい


まだドキュメント読んでない上に、下のことをやっても、まだでない。


トライアンドエラーで分かったこと
1. RNA_access.h に、RNA_Space*** という記述があるが、
 ここに他と同じように追加
2. rna_space.cのコメントアウトされている中に、
 static void rna_def_*** 関数を追加。中身↓ 

StructRNA *srna;
PropertyRNA *prop;

srna= RNA_def_struct(brna, "SpaceKinectEditor", "Space");
RNA_def_struct_sdna(srna, "SpaceKinect");
RNA_def_struct_ui_text(srna, "Space Kinect Editor", "Kinect editor space data");


ここで、RNA_def_structの第二引数は、①で追加したものの、「Space***」という名前になっていないと駄目。

3. rna_space.cの一番したのほうにある、RNA_def_spaceに 2. で作った関数を追加

4. 2.のRNA_def_struct_sdnaの第二引数の名前の構造体を、DNA_space_type.hに追加する。

5. rna_space.cの一番上のほうにある、rna_Space_refineで4.の構造体のアドレスを返すようにする

6. ビルドするときは、ALL_BUILDをスタートアッププロジェクトにしてリビルドしたほうが良さそう。



ちなみにmakesrnaプロジェクトの出力である、makesrna.exeは、バイナリのあるディレクトリにhogeというフォルダを作り

makesrna.exe hoge/

とコマンドプロンプトで叩くと、hoge以下に、rna_gen_lamp.cなど、真ん中に "gen"が付いたcファイルがドバッと吐き出される。これがbf_rnaプロジェクトに入ってるものである。



やりたいことがいっぱいあり過ぎて時間無いけどメモっておきたい為、いつにもまして適当に書いてますしお

2010年12月7日火曜日

blender - Blender2.5でKinect(3)

深度。ここまではデモ通り。

あとはUI周りとイベント周りをもう少しマシにして、やっと製作開始できそう。



この時点では技術的には何もやっていないし、コンピュータビジョンとか知識ゼロだけど、
万が一、万が一なんか出来てしまったときのための、前準備。

2010年12月6日月曜日

blender - Blender2.5でKinect(2)

やっとカラーバッファ出た。逆だけど。



アニメ見たり、リンク通したり、プロジェクト作ったり、VSがビルド後イベントのxcopyでよく固まるので、やたら本質的では無い部分に時間を取られた。

よし寝よう

2010年12月5日日曜日

blender - Blender2.5で開発(1)



ビルドに成功したので早速開発していきたい。

CMakeで生成された、Blender.sln(ソリューションファイル)を開くと、100個近いプロジェクトが開かれる。
この大量のプロジェクトは、それぞれが.libとして出力され、blenderというプロジェクトを通じて、リンクされているようだ。

ここに2つほど、自作プロジェクトを加えてみた。
この辺触ろうと思う人なら大体何とかなると思うので、
引っかかった点だけ書いておく。

粒度の小さい他のプロジェクトをコピって名前を置換し、無事自作プロジェクトを作り、
外部ライブラリも他と同じ位置に設置し、プロジェクトの階層構造もばっちり、
後はコンパイル通してリンクで結合するだけ

の状態で、どこのCMakeFileを書き換えても、どうしてもblenderというプロジェクトの
追加のライブラリディレクトリと、追加の依存ファイルが変わらない状態になった。

blenderプロジェクトの追加のライブラリなどの変更は、

Blender/build_files/

以下にあるmacros.cmakeで変更するようだ…

1時間ハマった

2010年12月4日土曜日

blender - Blender2.5をvs2005でビルド(win)

自分含めて何となくみんな気づいていると思いますが、
最近やたらCMakeを採用しているオープンソースソフトウェアが多いです。
Blenderも例外ではなく、CMakeがサポートされていています。
Blenderは、scons、CMake、その他ビルド方法がありますが、VSならCMake一押しです。

CMakeを使うと、VSのプロジェクト/ソリューションファイルが生成され、それを普通にIDEで開いて、デバッグビルドできます。(ステップ実行とかも普通に出来ます)
さらに、多数のライブラリを使用しているBlenderですが、ライブラリのON/OFFを、かなり簡単に切り替えられます。

そんなわけで、CMakeを使って、VSのプロジェクトファイルを生成し、ビルドしてみました。



以下、超手抜き説明

1. CMakeで、プロジェクト/ソリューションファイルを生成するとこまで
http://blog.mikepan.com/build-blender-2-5-a-visual-guide/
ここのページの通りにやります。

2. VSでソリューションファイルを開き、ビルドします

3. includeできません、の場合は、ディレクトリ階層ミスって無いか確かめてください
間違っても、プロジェクトファイルに絶対パスで追記するなどやってはいけません

4. GHOST_SystemWin32.cppや、wm_operators.cなどでエラー

ファイルの頭に、ビルドしているPCのwindowsのバージョンをdefineして見てください。

// vistaの場合
#define WINVER 0x0600
#define _WIN32_WINNT 0x0600

// 7の場合
#define WINVER 0x0601
#define _WIN32_WINNT 0x0601

5. openexrでエラー
6. ~.libが破損しています

公式から落としてきてライブラリをビルドしなおせば多分直りますが、
openexrとtiff.libは、とりあえず開発中に使わないし、
libsamplerate.libとかいうのはオーディオ関係で使わないので、
無効にしました。特に後者はwin用にビルドするのはキツそうでした。


無効にする方法

無効にするときですが、

1. まず、ALL_BUILDプロジェクトに入っている、CMakeLists.txtを開きます

2. 上のほうにONとかOFFとか書いてあるので、エラー出てたライブラリを探し、OFFにします


OPTION(WITH_IMAGE_OPENEXR "Enable OpenEXR Support (http://www.openexr.com)" OFF)
OPTION(WITH_IMAGE_TIFF "Enable LibTIFF Support" OFF)
OPTION(WITH_SAMPLERATE "Enable samplerate conversion" OFF)


3. ビルドすると、外部でファイルが変更されたので再読み込みするか聞いてくるので、再読み込み

これで影響があったプロジェクトファイルが再生成され、再読み込みされます。たぶん。

4. ビルドすると、エラーが出るので、エラーが出たプロジェクトのプロパティの、プリプロセッサの、プリプロセッサの定義から、OFFにしたライブラリのスイッチ(WITH_TIFFだとか)を削除

5. ビルド

成功





所要時間としては、自分の場合、途中libsamplerateをビルドしようとしてたりしてハマってたので、
5時間くらいかかりましたorz

無事デバッグ/リリースビルド/実行できたので、あとはsvn updateのときにCMakeLists.txtに気をつけるくらいで何とかなると嬉しい

2010年11月21日日曜日

blender - Blender勉強会@3331 ARTS CYD

Blender勉強会@3331 ARTS CYD の参加登録が始まりました。

2011/01/29 14:00 ~ 19:00 開催

ノートPCが必要なので注意です。


http://atnd.org/events/10192

2010年11月20日土曜日

etc - Kinect

XBox持ってないけどKinect単品で買ってきました。


Kinectまとめっぽいwiki
http://openkinect.org

windows用の、すぐ使えるドライバ(バイナリ)も配布されています。

早速ドライバインストールしてみた。
README通りにやって、あっさりデモ起動。


うおおお、これはすごい!!!
そのうちモーションキャプチャくるんじゃなイカ!

2010年10月30日土曜日

blender - blender + octane render

GeForceなどNVIDIAのCUDA対応グラボがあると、

1ユーロいまなら111円くらいだから、12000円くらいでこれが出来ちゃいます

Blenderは無料だしね!




(設定は特に何もせず、ボタン1個押しただけ)


octane renderですが、
最初出たときは、アニメーションレンダリングできなかったんですが、
地味にバージョンアップを続け、バッチレンダリングが搭載、
さらにBlenderから直接レンダできるユーザスクリプトも出ています。

こんなに安くて大丈夫か?

2010年10月16日土曜日

blender - 何かのキャラ

2、3年前くらいに適当に作った顔に、subsurf lv1をappendして、
そこからひたすら地道に1つ1つ頂点をいじりまくって出来たミクの顔ですが、
ボーンで曲げるにしても、頂点多くて面倒な状態だったので、
リトポで元に戻しました。

リトポはBlender2.54βで初めて行ったのですが、
慣れていないので決行苦労して、最終的にアプリが落ちたので2.49bに切り戻し。

それから、どうにも微妙にイラッとする顔が出来たので、
どうしようかと思って放置してアニメを見まくった結果



何とか使えそうなキャラがいました。
まだ全然似てないですが、ボーンでほっぺた膨らませば少しは似そうな感じがします。

2010年10月11日月曜日

etc - 画像処理エンジニア検定

とかいうのを発見したので、受ける予定です。

http://www.cgarts.or.jp/kentei/index.html
・画像処理エンジニア検定 エキスパート
・CGエンジニア検定 エキスパート

に申し込んでみました。1つ5千円くらいです。
いきなり両方エキスパートに申し込んでみるテスト。


また、同じ協会が出している、試験対策本があるのですが、
凄い良くまとまっていて、超お勧めです。両方買っちゃいました。


ディジタル画像処理
http://www.amazon.co.jp/dp/4903474011

コンピュータグラフィックス
http://www.amazon.co.jp/dp/4903474003/


コンピュータグラフィクスのほうは式があんまり出てこないんですが、ディジタル画像処理のほうは、全然知らない用語と式がガンガン出てきます。
資格試験とか全くあてにならないと良く言われますが、
グラフィック分野の職では、かなり役に立ちそうな気がします。

参考に、過去問を少し解けるページがあるよみたいです


試験日は11月28日とのこと

2010年9月20日月曜日

etc - 進捗(2)

MSAA(たぶん)をソフトウェア実装



拡大

etc - 進捗

作り中のビューワー(C++のwindows用アプリ)ですが、バイリニアフィルタを付けた結果、
割りとメタセコレベルに近づいてきたんですが、
エラーっぽいのがエッジ付近に出ることがあり(画像)、あと一息。



メタセコはメタセコでなんかおかしいような気がするんだけど、
誰もソフトウェアモードとか使ってないよね、、



そろそろ最適化/並列化もやっていかないと間に合わないなー

で、これ何に使うのかってところが一番怪しい。
レイトレならまだしも、ラスタライザを今更CPUで実装したからって何になるんだ…。


そういや、MMDスターターパック というモデルデータがいっぱい入ってる本を買ったので、
テスト用のモデルもそっちにしようかなー。
骨入ってるし

2010年8月19日木曜日

etc - haxe(ry (3)

どんどんプログラミングのブログになってきてるなーorz
次のエントリくらいからモBlender 2.53します…。


さてhaXeの計測結果。使う可能性があるやつだけ計測したので項目バラバラ。


write virtual memory : 2453ms
write virtual memory through inline function : 2381ms
write local variable : 2331ms
write local array : 5974ms
read virtual memory : 153ms
read local variable : 83ms
read instance variable : 81ms
read local array : 361ms


こんなもんかー

計測コードは、1つ抜粋するとこんな感じ。readのほうはもっと適当

time = flash.Lib.getTimer();
for( i in 0...30000000 ) {
instance.set(i, Math.random());
}
trace("write virtual memory through function: " + (flash.Lib.getTimer() - time) + 'ms');



積の計算時間はIntもFloatも同じくらいっぽい

Arrayが遅すぎるので、typedefとかいう良さそうな名前のを使おうと思ったが、
virtual memoryの約20倍遅い!!名前に騙されるとこだった危ない

2010年8月14日土曜日

etc - C78 2日目

14:00到着orz




戦利品




お疲れ様でした!

2010年7月24日土曜日

etc - haXeでFlash至上最速の3Dラスタライザを目指して(2)

[3] 速度検証

swf-version 10 で、flash9.Memoryを使用することでVirtualMemoryが使用されるらしいので眺める。
http://haxe.org/api/flash9/memory
これが今回haXeを使用する最大の理由である。

同様にflash9.Vectorも速いらしい。
http://haxe.org/api/flash9/vector
これと、Matrixだとか、Matrix3Dだとか。
それらを、自前で実装した場合の速度と比較する必要がある。

(後で)

[4] 画像描画

画像が描画できないと話にならない。
ということで、1millionのソースを適当に削って、画像1枚描画するだけのコードに。
haXeはもちろん、ASも知らないけど、どうみても劣化Javaなので何とかなる。
パッケージはよく調べてないので、そのままコピペ。


package;
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.geom.Matrix3D;
import flash.geom.Vector3D;
import flash.utils.ByteArray;
import flash.utils.Endian;

import flash.text.TextField;
import flash.text.TextFieldAutoSize;
import flash.text.TextFormat;

class Rasterizer extends Sprite {

// storage params
private static inline var WIDTH : Int = 550;
private static inline var HEIGHT : Int = 400;
private static inline var PIXELS : Int = WIDTH*HEIGHT;
private static inline var PIXEL_BYTES : Int = PIXELS*4;
// 使うvirtualmemoryの合計バイト数
private static inline var BYTES : Int = PIXEL_BYTES;

private var bitmap : Bitmap;
private var bitmapData : BitmapData;

// たぶんコンストラクタ
function new()
{
super();
initBuffers();
addEventListener( Event.ENTER_FRAME, enterFrameHandler );
}

// たぶん再描画ハンドラ
private function enterFrameHandler( event : Event ): Void {
// ビットマップ初期化
for( i in 0...PIXELS ) {
flash.Memory.setI32( i*4 , 0xFF0000 );
}

// 画面描画
flash.system.ApplicationDomain.currentDomain.domainMemory.position = 0;
this.bitmapData.lock();
this.bitmapData.setPixels( this.bitmapData.rect , flash.system.ApplicationDomain.currentDomain.domainMemory );
this.bitmapData.unlock( this.bitmapData.rect );
}

// 初期化
function initBuffers():Void {
// ビットマップ生成
this.bitmapData = new BitmapData( WIDTH , HEIGHT , false , 0 );
this.bitmap = new Bitmap( this.bitmapData );
addChild( this.bitmap );

// メモリ確保
var storage : ByteArray = new ByteArray();
storage.endian = Endian.LITTLE_ENDIAN;
storage.length = BYTES;
flash.Memory.select( storage );
}


static function main()
{
var clip:flash.display.MovieClip = flash.Lib.current;
var rasterizer:Rasterizer = new Rasterizer();
clip.addChild( rasterizer );
}
}


// compile.hxml

-swf9 rasterizer.swf
-swf-version 10
-main Rasterizer


// rasterizer.html

<div id="swf" style="width:550px;height:400px">
<object type="application/x-shockwave-flash" width="550" height="400" data="rasterizer.swf">
<param name="movie" value="rasterizer.swf" />
<param name="quality" value="high" />
</object>
</div>




これを実行すると、上のように赤で塗りつぶされた、
VirtualMemoryを使った画像(Flash)が表示される。

etc - haXeでFlash至上最速の3Dラスタライザを目指して(1)

Flash作ったこと:0回
Action書いたこと:0回
時間:明日ワンフェスに行くので今日しかない
愛読書:無謀キャプテン


よし、やるぞ!

[1] インストールとHelloWorld

http://haxe.org/download

ここから HaXe の WindowsInstaller を落としてきてインストール。
C:\Program Files/Motion-Twin/haxe/ とかいうところに勝手にインストールされた。



Gettins started with haXe/Flash を眺める。

まずはHelloWorldがるのでやってみよう。

テキストエディタで

class Test {
static function main() {
trace("Hello World !");
}
}


と書いて、どこか適当なディレクトリにTest.hxと名前をつけて保存する。
どこか適当なディレクトリだからってデスクトップとかはやめておこうJK。
今回はF:\work\haxe に保存。

さらにテキストエディタで新規作成して

-swf9 test.swf
-main Test

と書いて、先ほどと同じディレクトリにcompile.hxmlと名前をつけて保存する。

先ほどと同じディレクトリを、コマンドプロンプトを開いて、

haxe compile.hxml

と入力して実行する。



コマンドプロンプトの開き方が分からない人は適当にググってください。
成功すると上の画像のように、何も表示されず、
代わりに先ほどのディレクトリに、test.swfが出来ています。



続いて、このtest.swfをブラウザで表示させるために、テキストエディタで
Gettins started with haXe/Flash
にある、test.htmlを書いて保存します。

ダブルクリックで開くと、標準のブラウザで、先ほど作ったFlashが表示されます。




[2] Flash 10, One Million 3D particles with Haxe のコンパイルと実行

さっき作ったファイルを全部消去。
Flash 10, One Million 3D particles with Haxe.
ここのソースを名前をつけて保存。

先ほどと同じように compile.hxmlを新規作成して


-swf9 onemillion.swf
-swf-version 10
-main OneMillion


と記入して、保存。
先ほどと同じように、コマンドプロンプトで、
haxe compile.hxml
でコンパイル。

onemillion.htmlを新規作成して、下記を記載

<object type="application/x-shockwave-flash" width="550" height="400" data="onemillion.swf">
<param name="movie" value="onemillion.swf" />
<param name="quality" value="high" />
</object>


ダブルクリックで開く。表示された。




(長くなってきたので次のエントリに続く)

2010年7月10日土曜日

etc - 3D vision!!!

NVIDIA 3D VISION(3Dメガネ)と、ACERの3D VISION対応モニターを購入しました。ACERのモニターは割りと地雷らしいので注意!今のところ、グラフィックは問題ないけど、文字の表示が微妙。


[環境]
・GeForce8800GT
・vista 32bit business
・Core2Duo E7500

vistaか7しか対応してないので注意。
あと、GPUだけでなく、CPUも2倍使うとの噂なので、デュアルコア以上じゃないと厳しいかもしれない。


[基本事項]
DirectXを使ったフルスクリーンのゲームじゃないと3D visionが稼動しないので注意。
よって、OpenGLのBlenderなどでは全く反応しない。

設定は、ドライバインストール後に、設定ウィザードとかいうのが出てきて、(出なかったらコンパネのNVIDIAコントロールパネルの3DVisionのところあたりから出せる)、周波数を50Hz設定にしないと、俺の目が悪いのか凄いチラ付いて見れたもんじゃなかった。他はモニタを120Hzにしておく程度。


[早速検証]

・らぶデス2以降
普通に見れた。これは凄い!2.5次元はじまった!
ただし、グラボとCPUに2倍性能が必要らしいので、激しく注意。
まだ試してないけど、1体が限界かもしれない。

・リアル彼女体験版
禿げた!→設定で直った。
でも目ん玉が奥にあるように見えて、他にも怪しい部分が結構あって微妙。


・VOCALOMARK(β)
アイマスみたいな、パキっとしたトゥーンは、相性が悪い。これは最初想像していたとおりの感じだった。前後で2、3体並べば、割と奥行きは感じられた。

・東方地霊殿
3D vision反応して稼動したけど、3D映画のセリフのところが自機/敵/玉になってる感じ。

・自作ベンチマーク
普通に稼動したけど、前述のとおり、階調が少ししかないトゥーンは相性が悪くて、見栄えは微妙。あと、正射影表示にしたら、バグった感じにブレた表示になった。射影は必須なのかもしれない。


(続く)

2010年6月13日日曜日

etc - UVテクスチャ(2)

だいたいあってるレベルまで来た!
まだ、どうも三角形の左と上側の辺が1ピクセルおかしかったりする・・




このクソかわいいモデルは、この辺からメタセコの練習用に(←強調)借りてきました。

こんな感じに、全身テクスチャで、ピチっとテクスチャが割り当たっているモデルは、さすがプロ!

逆に、俺のモデルは、プログラムのテストのために、あえて色んな方法でマテリアル/テクスチャを作っているのです。正方テクスチャじゃなかったりだとか、UV座標が重なってたりだとか、0-1の範囲からはみ出てたりだとか、頂点カラーが一部のオブジェクトだけについてたりとか、UVが一部のオブジェクトだけについてたりとか、一部のオブジェクトは全部ノードで色が付いていたりだとか。えぇ、負け惜しみです。。

2010年6月8日火曜日

etc - UVテクスチャ(1)

本日帰宅後(0:00)から超特急突貫実装




色々決めうちしてるけど、できたぞおおおお!
神様仏様Nick様!


真ん中の板がおかしいのは・・・大体合ってるから何とかなるに違いない。


まだ微妙~に違うな

2010年6月6日日曜日

etc - Z値の計算が上手くいかない(3)

だいたいあってる状態まで持っていけた。

95%くらいは合ってるだろう。

頂点カラー乗ってるミドルポリってケツくらいしかないや・・・




いやー長かった。
1つは凄いしょぼいミスで、もう1つは固定小数点絡みのミスだった。



現在Core2DuoE7500で、
1024x768で3万ポリゴン(頂点カラー計算,テクスチャ座標計算)で30~60fps。
これをSIMD化するかTBBかませば、もうちょい早くなるはず。
でもアニメーションと輪郭線付けて2パス化したら予想では10~30fps。

2010年5月31日月曜日

etc - Z値の計算が上手くいかない(2)

Zがおかしいと思いつつ、頂点カラーを実装。
当然同じ方法なので同じようにおかしくなる。
でもなんか分かってきたかもしれん、、

距離0に近いと思われる視点で見ると、結構まとも。多分これが正解に近い絵


fov_yを変えたとき、つまりWVPのz,wが変化なしで、x,yあたりを変化させたとき、
小さく見えるようになるけど、⊿zが変わってない(気がする)

2010年5月23日日曜日

etc - Z値の計算が上手くいかない

全然わかんねーーーーー



この状態では一見よさそうだが・・





広い面を描画するとこのとおり・・・orz


やっぱv1.z * (1.0f/v1.w) = 1だよなー。
ということは、v1.z * w1じゃなくてv1.wだけでいいような・・


でも、そうすると、なんか浮動小数点誤差っぽいやつが出てくる・・。

2010年5月10日月曜日

blender - PVなど

ekakiyaさんの新作きてた。
相変わらず何やってるかわからんけど凄い。

DRAGON
http://vimeo.com/11301558

こっちは前のフル版

SAKURA
http://vimeo.com/8634528

2010年5月5日水曜日

etc - GW

あと1日で終わってしまう!



まだこの状態から進んでないけど、あと1日でなんとかしたい。
この状態だと60fps以上出てます。





オワタ

2010年5月1日土曜日

etc - CPUが本気出してラスタイズ

するとこうなるらしい。




7fps!

Core2Duo E7500にてラスタイズ。
800x600 AA無し。
PixelShader2.0で、ポリ数5万越えのテクスチャバリバリモデルが動いてる。すげー。



環境マッピングデモ。1280x950で50fps

2010年4月27日火曜日

etc - messagepack

3D独自フォーマット(気軽に出力して気軽にテストするためのフォーマット)として、
protocolbuffersを使っていて、大体満足していたのですが、
大容量のポリゴンにも耐えうる、テスト用に留まらない、メインで使えるシリアライザ/デシリアライザを探して、前から気になってたmessagepackをテスト中です。


MessagePack公式はこちら


導入は、結構自力で何とかなったのですが、後でまとめた記事を発見しましたorz
C++ですが、こちら。最初に発見していれば30分は短縮できた。。
糸且之入Eヨ言己 - MessagePackとProtocol Buffersを試してみた


さて、突貫で作った速度計測用コード。
個人的に最大のポイントは、なんと元々のstd::vector<um_vector4>(独自型)にデシリアライズ後変換できる!ということです。
protocolbuffersでは、メンバ変数へのアクセスが全てメソッド経由のクラスに強制的にされてしまい、デシリアライズ後に、自前のバッファにコピーしないと遅くて使い物にならないです。
一瞬で分かったprotocolbuffersのDSLより難しいのは間違いないですが、こっちのほうが速度も断然速そうです。


intを400万個、floatを800万個くらいシリアライズしてみました




// てきとーなベクタ
typedef union um_vector4
{
struct { float r, g, b, a; };
struct { float x, y, z, w; };
struct { int ix, iy, iz, iw; };
float rgba[4];
float xyzw[4];

um_vector4() {}
um_vector4(const float _x, const float _y, const float _z, const float _w)
{
x = _x; y = _y, z = _z; w = _w;
}

// ↓これでMessagePackでシリアライズ可能になるらしい
MSGPACK_DEFINE(x, y, z, w);
} um_vector4;

// てきとーなポリゴンクラス
class TestMessage {
private:
std::vector<um_vector4> f; //面です
std::vector<um_vector4> v; //頂点です
std::vector<um_vector4> n; //法線です
public:
// get const
const std::vector<um_vector4>& face_buffer() const { return f; };
const std::vector<um_vector4>& vertex_buffer() const { return v; };
const std::vector<um_vector4>& normal_buffer() const { return n; };
// get mutable
std::vector<um_vector4>& mutable_face_buffer() { return f; };
std::vector<um_vector4>& mutable_vertex_buffer() { return v; };
std::vector<um_vector4>& mutable_normal_buffer() { return n; };

// ↓これでMessagePackでシリアライズ可能になるらしい
MSGPACK_DEFINE(f, v, n);
};

int main(void)
{
TestMessage test;
// てきとーに100万ずつくらいぶち込んでおく
float t = ::timeGetTime();
std::vector<um_vector4>& face_buffer = test.mutable_face_buffer();
std::vector<um_vector4>& vertex_buffer = test.mutable_vertex_buffer();
std::vector<um_vector4>& normal_buffer = test.mutable_normal_buffer();
for (int i = 0; i < 1000000; ++i) {
face_buffer.push_back(um_vector4(xor128(), xor128(), xor128(), xor128()));
vertex_buffer.push_back(um_vector4(dxor128(), dxor128(), dxor128(), dxor128()));
normal_buffer.push_back(um_vector4(dxor128(), dxor128(), dxor128(), dxor128()));
}
dprintf(_T("generate: %f ms\n"), ::timeGetTime() - t);

// 5個くらい出力
for (int i = 0; i < 5; ++i) {
dprintf(_T("%d: %d, %d, %d, %d\n"), i, face_buffer[i].ix, face_buffer[i].iy, face_buffer[i].iz, face_buffer[i].iw);
dprintf(_T("%d: %f, %f, %f, %f\n"), i, vertex_buffer[i].x, vertex_buffer[i].y, vertex_buffer[i].z, vertex_buffer[i].w);
dprintf(_T("%d: %f, %f, %f, %f\n"), i, normal_buffer[i].x, normal_buffer[i].y, normal_buffer[i].z, normal_buffer[i].w);
}

// シリアライズ
t = ::timeGetTime();
msgpack::sbuffer sbuf;
msgpack::pack(sbuf, test);
dprintf(_T("serialize: %f ms\n"), ::timeGetTime() - t);

// デシリアライズと型変換
t = ::timeGetTime();
msgpack::object o;
msgpack::zone z;
msgpack::unpack(sbuf.data(), sbuf.size(), NULL, &z, &o);
TestMessage deserialized;
o.convert(&deserialized);
dprintf(_T("deserialize and convert: %f ms\n"), ::timeGetTime() - t);


// 5個くらい出力
const std::vector<um_vector4>& dface_buffer = deserialized.face_buffer();
const std::vector<um_vector4>& dvertex_buffer = deserialized.vertex_buffer();
const std::vector<um_vector4>& dnormal_buffer = deserialized.normal_buffer();
for (int i = 0; i < 5; ++i) {
dprintf(_T("%d: %d, %d, %d, %d\n"), i, dface_buffer[i].ix, dface_buffer[i].iy, dface_buffer[i].iz, dface_buffer[i].iw);
dprintf(_T("%d: %f, %f, %f, %f\n"), i, dvertex_buffer[i].x, dvertex_buffer[i].y, dvertex_buffer[i].z, dvertex_buffer[i].w);
dprintf(_T("%d: %f, %f, %f, %f\n"), i, dnormal_buffer[i].x, dnormal_buffer[i].y, dnormal_buffer[i].z, dnormal_buffer[i].w);
}

return 0;
}


結果
generate: 248.000000 ms(まぁ生成は関係ないか)
0: 1331203329, 1326780490, 1306167479, 1331471174
0: 0.845902, 0.582280, 0.106706, 0.861866
0: 0.166993, 0.605348, 0.553501, 0.120232
1: 1311440957, 1327167508, 1326297665, 1307982867
1: 0.402404, 0.302981, 0.092047, 0.032100
1: 0.945747, 0.539411, 0.276434, 0.823911
2: 1322125276, 1318789220, 1304199979, 1292073686
2: 0.217559, 0.149822, 0.104422, 0.495793
2: 0.635239, 0.104648, 0.915693, 0.168465
3: 1332878461, 1326061273, 1317898430, 1330834387
3: 0.126696, 0.479609, 0.193420, 0.554528
3: 0.188907, 0.408642, 0.185277, 0.004868
4: 1314834350, 1310288645, 1305860913, 1325258904
4: 0.781957, 0.098019, 0.581745, 0.787152
4: 0.966463, 0.302529, 0.916513, 0.091087
serialize: 280.000000 ms
deserialize and convert: 823.000000 ms
0: 1331203329, 1326780490, 1306167479, 1331471174
0: 0.845902, 0.582280, 0.106706, 0.861866
0: 0.166993, 0.605348, 0.553501, 0.120232
1: 1311440957, 1327167508, 1326297665, 1307982867
1: 0.402404, 0.302981, 0.092047, 0.032100
1: 0.945747, 0.539411, 0.276434, 0.823911
2: 1322125276, 1318789220, 1304199979, 1292073686
2: 0.217559, 0.149822, 0.104422, 0.495793
2: 0.635239, 0.104648, 0.915693, 0.168465
3: 1332878461, 1326061273, 1317898430, 1330834387
3: 0.126696, 0.479609, 0.193420, 0.554528
3: 0.188907, 0.408642, 0.185277, 0.004868
4: 1314834350, 1310288645, 1305860913, 1325258904
4: 0.781957, 0.098019, 0.581745, 0.787152
4: 0.966463, 0.302529, 0.916513, 0.091087

2010年4月26日月曜日

etc - octane renderer

中古のGeForce8800GT買ってきました。
で、octane renderer (β版) を買ってしまいました。



これはCUDAレンダラなのですが、βの間は、99ユーロで買えます。(現在12,462円)
Blenderどころじゃないくらい良く落ちるのですが、なんせ安い!
今買っておくと、1.*まではライセンス有効で、2.0にも安くアップグレードできるっぽいです。

機能詳細など。


購入方法はpaypalで、購入前に公式のforumに登録しておく必要があるっぽいです。
forumのユーザ名を入力して、購入手続きを経ると、
forumの「Commercial Product News & Releases」スレからダウンロードできるようになります。
ダウンロードして起動すると、Machine IDが表示されるので、それをコピペして、ライセンス登録用のメアドにメール送ると、アクティベートキーが返信されてきます。

これ中の人が手動でやってるんだろうか・・・?

2010年4月21日水曜日

etc - ラスタイズ(1)

World x View x Projection x Screen変換を経て、
カメラも位置もView座標系から取得し(see. teapot)、
スキャンラインとZバッファ使い、とかやってると、
もう何がなにやら分からなく、とりあえず遅くても見れる画像を1枚でも表示したい!!!
と奮闘した結果、



100%CPU処理で20fpsほどで、割とまともな画像が出ました。
(3万ポリゴン程度です)

スキャンラインじゃなくてStampというか、四角形ごとにレンダリングしていって、さらに並列でやると結構早くなるらしいです。
Zバッファも、階層Zバッファなるものが良さそうです。

計算はほぼすべて浮動小数点でやっているので、そこも何とかしたいのですが、アンチエイリアスかけるときに浮動小数使うのかもしれないので(素人なのでシラネ)、安全を期してピクセルに落とす寸前までfloatのみでやってます。

2010年4月13日火曜日

blender - Windows 100% 5月号(2)

うちの初音ミクがスプラッシュの、独自ビルドのBlenderが
Windows 100% 5月号 に載りました。



そんなことよりも、「初音ミクは実在していた」という特集があるのですが、
これがヤバイ!
おいおいおいおい、PTAMをVC落としてきてビルド・・・だと!?
いつのまにBLASとかビルドしちゃう雑誌に変貌していたんだ・・・

2010年4月11日日曜日

blender - Windows 100% 5月号

Windows 100% 5月号に藤堂さんのBlenderのチュートリアル記事が載るようです!

http://blender.jp/modules/news/index.php?storytopic=8









---------------

最近は、私は更新頻度からして分かるように、Blender使う機会が少なくなって、もっぱらプログラミングです。
Blenderを始めた当初、「確実な方法をとって行けば、やった時間に比例して萌えキャラがかわいくなるはず。俺理系だし。」という意味不明な理論を元に、順調に上手くなっていきましたが、そろそろ壁が見えてきたので。

---------------

octane render今のうちに買おうかなー

2010年4月4日日曜日

etc - Qtに移行しただけ(3)

svg読み込んだだけ。




休日は、新社会人になった友人とほぼ遊んでいたので、全然進んでないですorz

ラスタにするかSVGにするかで迷ったので、SVGで、そこそこ多めに読み込ませてみた。
QtはSVGもサポート。Inkscapeで吐いたやつそのまま読み込める。
拡大縮小が僅かに遅い気がするけど、きれいだからこのまま行こうかな。

・・・UIのデザインセンスが欲しい。


縦も捨てがたい・・・


Blenderっぽくなってきた。ま、いっか。

2010年3月28日日曜日

etc - Qtに移行しただけ(2)

画像読み込んでみただけ



いつもやる気があるわけではないので、アニメ見ながらコメントを書いたり。
Qtまだ慣れてなくて結構戸惑う。

2010年3月26日金曜日

etc - Qtに移行しただけ



やっと好みの環境が整ってきたので実装開始。
さて、、、何実装しようか・・。

2010年3月21日日曜日

etc - 写真貼っただけ

初心者が3Dを気軽に作って楽しむとして、自分で持ってるフィギュアの写真とって貼り付
けるだけで、大部分の人が満足するのではないかと思った。

素体とかを大量に用意しておいて、基本写真を投影するだけ、あとUVマップの編集機能があればよし。写真にフィルタでもかければイラスト調にもなるだろうし。



しかもボーンがあらかじめ仕込んであって、モーションを共有できて、すぐ動きます、的な。
ああ、でも、目パチ口パクとかすると、閉じた目とか、口の中身どうすんだって話になるからダメか。



あと1歩でゆっくりになるな・・

2010年3月18日木曜日

etc - 首が回らない



かもしれない・・。突っ込みがあったらいつか直そうと思って放置してやつに、ついに突っ込みが入ったので修正。

http://sites.google.com/a/render.jp/vmdimporter/

2010年3月10日水曜日

etc - ZGameEditor便利

たしかGeek3Dより。



なんだか良くわからないけど、メガデモ用のツールっぽいです。
GLSLシェーダをさくっと作って遊ぶのに使えそう。
このツール単体で、ビルドしてexe吐けます。。
作り終わったら圧縮して64Kとか、かなり小さくなるっぽい。
画像で実行中のshaderdemoとかいうサンプルは122KBくらいになりました。
画像中央のNodeみたいなのは何かというと、Boxを数式で変換して円状の物体に変えているっぽい。
しかもMITライセンスでオープンソースです。太っ腹!

GT220だと動かなかった。Radeon5770だと動いた。

便利なので、また時間あれば使ってみます。

2010年3月7日日曜日

blender - hanausagi

すっげー昔のUSBメモリが出てきたので開けてみたら
こんなものが入っていた。

2007年3月6日午後2時

本当にBlender使い始めて1週間くらい経ったとき、15分くらいで作ったと記憶。
blenderも同じUSBに入っていて、バージョンが2.43だった



せっかくなのでblendファイルをうp。
http://cid-63799ff4ff0632b6.skydrive.live.com/browse.aspx/%E5%85%AC%E9%96%8B?uc=1

霊夢も、ちょうど14日に例大祭があるので、そのあたりに何かできたらいいなー。

↓また折角の休日にどうしようもないものを作ってしまった


↓別視点