スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

へぼソフト完成までの道のり

とりあえず前回の記事を達成させるためにいろいろ部品を作ることにした。
まず静止画を3D座標として受け取る部分の製作。

以前World,View,Projection,Viewportについての記事は散々書いたし、調べごと結構していたので楽そうだ。

まずシェーダを使わずピクチャボックスに3Dを作成してみる

逆関数を作る

2Dからworld座標を得る方法にたどり着く

という流れで進めてみた

何かあっという間に完成

ピクチャボックスは

//ピクチャボックス描写
private void PictureBox1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
{
Vector3 test1 = new Vector3(0,0,0);
Vector3 test2 = new Vector3(0,0,0);
//world
Matrix world1 = Matrix.CreateTranslation(30,0,0);
Matrix world2 = Matrix.CreateTranslation(20,0,10);
//view
Matrix View = Matrix.CreateLookAt(new Vector3(0, 20, 20), new Vector3(20, 0, 0), Vector3.Up);
Vector4 pos1 = Vector4.Transform(test1, world1 * View * Projection);
Vector4 pos2 = Vector4.Transform(test2, world2 * View * Projection);

int x1 = (int)(+(pos1.X / pos1.W * view_size.X / 2.0f) + view_size.X / 2.0f);
int y1 = (int)(-(pos1.Y / pos1.W * view_size.Y / 2.0f) + view_size.Y / 2.0f);
int x2 = (int)(+(pos2.X / pos2.W * view_size.X / 2.0f) + view_size.X / 2.0f);
int y2 = (int)(-(pos2.Y / pos2.W * view_size.Y / 2.0f) + view_size.Y / 2.0f);

pos1 = Vector4.Transform(test1, world1 * View * Projection);

e.Graphics.DrawLine(blackPen, x1, y1, x2, y2);
//モデル移動座標

//変数デバッグ用
e.Graphics.DrawString(i.ToString(),new Font("MS UI Gothic", 20),Brushes.Blue, 0, 0);
}


こんなかんじでDirectXを使わずに3D表現ができる。(といってもこれは一本の線だけども)
ここから逆関数を考えるつもりだったが

ViewportクラスにUnprojectというメソッドが用意されておりこれで楽に逆行列が求まってしまうことを知って拍子抜けである。


モーションキャプチャのほうは二個のカメラから関節に塗った色を判別させる予定だがカメラから得られるベクトル同士がきちんとぶつかるとは思えない。
二つの直線がねじれの位置にあるとして、一番近くなる2点の中間点を取るプログラムを考えなくてはならなくなった。

明日考えよう。

ねよっと

コメントの投稿

非公開コメント

プロフィール

あしゅ

Author:あしゅ
ぷぃぷぃ日常。
いつのまにか雑記ブログに。

カテゴリ
最新記事
検索フォーム
最新コメント
リンク
このブログをリンクに追加する
ブロとも申請フォーム

この人とブロともになる

カウンター
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。