2008年02月18日

結局VIEW行列でつじつま合わせ

y軸反転の頂点変形済み扱いのRHW互換の座標系だが
透視変換するときに3D変形をする部品の場合
Z軸だけ1.0ベースなのでとXYとのアンバランスが生じるのでワールドスケールとしてVIEW行列にかけてやり
PROJECTIONは従来のままでオフセットだけつけてやることにした。
つまり

var bp1,bp3:PSMatrixf;//aligned pointer

LookAtLH((bp1)^, vEyePt, vLookatPt, vUpVec);
with (bp1)^ do begin
d[0]:=d[0]/400;
d[5]:=d[5]/-400;
d[10]:=d[10]/400;
end;
g_pd3dD.SetTransform(D3DTS_VIEW,(bp1)^);

PerspectiveFovLH((bp3)^, PI/4, 4/3, 1.0, 1000.0);
(bp3)^.l[12]:=$BF800000;//-1.0
(bp3)^.l[13]:=$3F800000;//1.0


で変換済み頂点と互換になる。
行列をうまく消化していないせいだと思う。
ワールドスケールの変換というのはちゃんと考えた方がよいだろう。
※後日意味なしと判明、要見直し

で、頂点だが

PSVertex32 =^SVertex32 ;
SVertex32 =Packed record
x,y,z:Single;
case integer of
0:(nx,ny,nz,tu,tv:Single;);//FVF $112
1:(vcolor:LongWord;u1,v1,u2,v2:Single;);//FVF $242 double tex
2:(rhw,param:Single;pcolor:LongWord;u,v:Single;);//FVF 2d $164
3:(diffuse,specular:LongWord;px,py,pz:Single;);//$d2
4:(w:Single;color:LongWord;p1,p2,p3:Single;);//$44
end;



と定義して汎用にした。
実際に使うときは
rhw,color,**,u,v//FVF:=$1c4
w,color,px,py,pz //psize FVF:=$72 vwait FVF:=$56
w,color,**,u,v //vwait $1c6 psize FVF:=$1e2
w,param,pcolor,u,v //vwaitx2 FVF:= $148


とりあえず「color」というキーワードは5ワード目用として
埋め草でpsizeを入れるなりしてあわせる形にしようと思った。
これ以上複雑なものは32バイトにおさまらないからまぁいいだろう。

型の説明とかほとんどしてないので
これだけみると分かりにくいかもしれないけれど前後のドキュメント見ればわかるだろうし
これはあくまで試行錯誤の記録であって解説では無いので
完成形を後日分かりやすくのせるだろうということでご勘弁、

※スケール行列は一般に4x4行列の3x3だけ変更するが視体積という概念からd[15]も変更した方がいいのかも


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

メールアドレス:

ホームページアドレス:

コメント:

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


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

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