ワイヤーフレーム

授業が暇だったので、ワイヤーフレームでボックスを表示するプログラムを書いてみた。頂点を行列でスクリーン座標に変換しているだけだし、よく考えたらいつもやってることだ。

面白くなってきたので、ポリゴンを塗りつぶすプログラムも書いてみた。
次は変換した頂点にこれを当て嵌めてみよう。

線形代数とか

いままでD3DXのやつを使っていたけど、そろそろ自分で書こうと思い、ベクトルとマトリクスを書いてる最中。
その中でも、逆行列を求める関数の高速化が悩みどころだ。3次正方行列までなら行列式とかを使って地道に計算してもいいが、4次だと計算量が馬鹿にならない。
ググったらLU分解とか、ガウスの消去法なるものが出てきたので、この辺を使って高速化でもするか。

.NetのBitmapをポインタで操作する

自前でピクセルデータとかいじらないし、使い道があるか分からんけど。

Bitmap ^buffer = gcnew Bitmap(256, 256);
// ロック対象矩形
Rectangle rect(0, 0, 256, 256);
// 書き込み専用でbufferをロック
Drawing::Imaging::BitmapData ^bmp_data = buffer->LockBits(rect, Drawing::Imaging::ImageLockMode::WriteOnly, Drawing::Imaging::PixelFormat::Format32bppArgb);
// bufferのアドレスを取得
IntPtr ptr = bmp_data->Scan0;
 // アンマネージドのポインタに変換
unsigned char *buf = (unsigned char*)ptr.ToPointer();
 // グラデーションを書き込む
for(int i = 0; i < 256; i++)
{
    for(int j = 0; j < 256; j++)
    {
        int n = (i * 256 + j) * 4;
        buf[n+0] = i;
        buf[n+1] = j;
        buf[n+2] = 255;
        buf[n+3] = 255;
    }
}

buffer->UnlockBits(bmp_data); // ロック解除

ピクチャボックスとかにセットすれば表示できる。

もう一つの輪郭抽出

Sさんに輪郭抽出の話をしたら、フィルタを使わない方法を教えてもらった。
メッシュの面を裏返して、少しだけ拡大して黒で描画するというものだ。

早速実装したが、カメラの距離によって輪郭線の太さが変わってしまう。輪郭線といっても元はメッシュだから当たり前か。