2008年02月09日

OrthoLHも作って考えた。

昨日の関数で右手系と左手系と別に作るのもめんどくさいし
-1か1をかけるだけだから共用にしようと思ったけれど
どちらかしか使わないので非効率になるからさっくり二つずつ関数をつくった。
またOrthoLHも作った。これでVIEW行列とPROJECTION行列の主要な関数はそろったわけだ。
しかし「Flash」ということであればスケールをZ値で処理したいから
Worldでのスケールを使ってもいいのだがPROJECTION行列で遠近でやるほうがよいようにも考えた。
LHとRHのコードの違いは

LookatRH

zv.x:= Eye.x-At.x;
zv.y:= Eye.y-At.y;
zv.z:= Eye.z-At.z;


PerspectiveFovRH

with mout do begin
//
d[10]:=f1;
d[11]:=-1;
//
end;


OrthoLHも作った。これはPerspectivFovLHと似ているがZでのスケーリングがない点が異なる。
変形済み頂点より効率が悪いがスプライトなど2Dをやるのにはむいていると思う。


function OrthoLH(out mOut: SMatrixf; w, h, zn, zf: Single): PSMatrixf; //
var
ysc,xsc,f1:Extended;
begin
(*
2/w 0 0 0
0 2/h 0 0
0 0 1/(zf-zn) 0
0 0 zn/(zn-zf) 1
//*)
with mout do begin
d[0]:=2/w;
d[1]:=0;
d[2]:=0;
d[3]:=0;

d[4]:= 0;
d[5]:= 2/h;
d[6]:= 0;
d[7]:=0;

d[8]:=0;
d[9]:=0;
f1:=1/(zn-zf);
d[10]:=-f1;
d[11]:=0;

d[12]:=0;
d[13]:=0;
d[14]:= zn*f1;
d[15]:=1;

end;

result:=@mOut;
end;

これの右手系版は

d[10]:=f1;

だけが違う。
パース変更は少ないはずなので4つの関数を1セットにしてもいいのかもしれない。

viewclipの行列は別途かけられるのでここでもwとhは2.0がデフォルト。

ここで大層痛い事実に気が付いた。
WORLD座標の行列だが
少ないながらもFlashで考えても256個もスプライトがあれば数的に充分なことができるのだが
固定パイプではWORLD0行列しか使えないらしい。
つまりキャラクターごとに行列を固定にするという手は頂点シェーダ を使わないと出来ないわけだ。

またさらに気づいたこととしてはシェーダリファレンスをみると
頂点シェーダ 2.0以降で無いと三角関数は使えず現状対応ハードを持ち合わせていない。

つまり回転関連の計算については自分で計算して行列なりクォータニオンなり作らないといけないわけで
そう考えるとベタ座標の計算済みモードに対する時間的でメリットを覆すだけのものがなければ
無理に使うことも無いともいえる。
まぁようするにポリゴンラスタライザーの場合は頂点引き伸ばし系などの理由がない限り
固定パイプで構成するのが良しといえそう。
とりあえずは代替策としてインデックス付き頂点ブレンディングという手もある。



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

メールアドレス:

ホームページアドレス:

コメント:

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


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

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