2008年02月21日

ワールドスケールに関するルールやっと帰着

とりあえず

ワールドスケール行列 * PROJECTION行列 →オフセット値(大抵1をセットするとか)

という形のものをPROJECTION行列にセットすれば
例えば320ドットの画像は辺長320のポリゴンに貼り付ければよいということにした。

この「ワールドスケール」という概念はあまりなくて
たいていは一辺1.0のポリゴンとかが多いけれど
現実の寸法はむしろ1mから0.1mm単位のサイズで数値として考えても5桁で足りるし
わかりやすい。画像にあわせたものもドットと一致させた方がよいと思うのだ。
今回のように上下を反転させたり左上原点にしたりと
基本長がある場合にいわゆる3Dの「0-1の世界」にあわせるのには都合がよいと思う。
体系理論として解説とか書く場合は最初から導入した方がよいだろう。

ここは回数呼ぶところでは無いので専用命令の必要はなさそう。
とりあえずリセット用には結果物を保持する必要はありそうだ。
透視投影変換はあまり関係ないがFlash用でなおかつ3D機能での反射を使いたいときに
VIEW行列の値が影響する場合もあるだろうからVIEW行列は純粋に
ワールド座標系での存在を意味する行列としたい。

あと枝葉末節だが
回転系の関数はカレントのポインタの次の行列値を併用するのをデフォルトとして
も普通にアセンブラで書いた。atanとか使うとラジアンベースの方が都合よいのかもしれないけれど
現状deg基準
あとちょっとだけ4x4より高速化したMatrixMultiply33とかZ回転だけのMatrixRotation2Dのコードを追加
三角関数は現状まだFSINCOSを使っていてスタックのdeg値依存
レジスター方式なのだからレジスターに角度をおいて計算するほうが良いので要改善、
一応4変数にいれる版も作ってたけれど汎用関数にせず行列用は行列用の中で直接代入させている。

FLD one_deg
FLD Angle
fmul
FSINCOS
fst dword ptr [eax] // Cossin
fstp dword ptr [eax+20] // Cossin
fst dword ptr [eax+4] // sin
fchs
fstp dword ptr [eax+16] // -sin
fld1
fst dword ptr [eax+40] // 1
fstp dword ptr [eax+60] // 1

FPUでやっているのだけれど行列のクリアはxmmレジスターを使っているから要アラインメント
eaxは算術レジスター+128がbp1なのだが
定数などもコピーしているので one_deg(=0.0174532925199432)とかもSingleで4つ並べといてアクセスするほうが早いのかもしれない。
この辺delphiのグローバル変数のアクセスの方法を理解していないとベータとはいえないのかも、

三角関数はとりあえずFPUよりなにが速いという話もないのだが
SSEでマクローリン展開を3次程度までやる方法とテーブルでcosとsinを同時に求める方法と
1回はスピードテストしたいのだけれど
ここのところ一挙にexeサイズが17kbyteから23kbyteまで膨らんじゃったので
遅くても再呼び出しで節約するコードとかのほうが良い気もする。


ラベル:projection
posted by Xo_ox at 21:00| Comment(0) | 3D | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
×

この広告は180日以上新しい記事の投稿がないブログに表示されております。