polytestの技術的な説明



○ポリゴン描画について
ポリゴン描画はドット単位ではなくflashの多角形描画ルーチンをそのまま用いてます。
多角形ルーチンを用いてますが描画は三角形単位で行います。
テクスチャ付きポリゴンの描画にはGraphicsクラスのbeginBitmapFillを、
テクスチャなしポリゴンの描画にはGraphicsクラスのbeginFillを使用しています。
光源計算が有効の場合、さらにもう一枚ポリゴンを
ポリゴンがグローシェーディングの場合、GraphicsクラスのbeginBitmapFillで、
ポリゴンがフラットシェーディングの場合、GraphicsクラスのbeginFillで乗算描画します。
GraphicsクラスのbeginBitmapFill/beginFillの両方ともZバッファを使用することはできませんので
ポリゴンの優先順はZソートで行います。

テクスチャがある場合UVマッピングが必要ですがflashではUVマッピングを行うひとができません。
しかしflashではビットマップに対して3x2の変換行列を指定することができます。
そこで三角形ごとにUV値を3x2の行列に変換しています。

変換式は次のものを使用しています。
入力にpos1、pos2、pos3に三角形のスクリーン座標をuv1、uv2、uv3に三角形のUV値を指定します。
出力には変換された3x2の行列が返されます。
----------------------------------------------
//位置とUV値からMatrixを求める
public function GetMatrixFromPosUV(pos1:Point,pos2:Point,pos3:Point,uv1:Point,uv2:Point,uv3:Point) : Matrix {
	var mt:Matrix=new Matrix();
	//
	var x1:Number=pos1.x-pos3.x;
	var y1:Number=pos1.y-pos3.y;
	var x2:Number=pos2.x-pos3.x;
	var y2:Number=pos2.y-pos3.y;
	var u1:Number=uv1.x-uv3.x;
	var v1:Number=uv1.y-uv3.y;
	var u2:Number=uv2.x-uv3.x;
	var v2:Number=uv2.y-uv3.y;
	var tx:Number=pos3.x;
	var ty:Number=pos3.y;
	var tu:Number=uv3.x;
	var tv:Number=uv3.y;
	//分母計算
	var dd:Number=((u1*v2)-(u2*v1));
	if(dd<0.0001 && dd>-0.0001){
	//分母が小さすぎる場合
		mt.a=10000.0;
		mt.b=0;
		mt.c=0;
		mt.d=10000.0;
		mt.tx=tu;
		mt.ty=tv;
	} else {
	//計算可能
		var inv_dd:Number=1.0/dd;
		var A:Number =((x1*v2)-(x2*v1))*inv_dd;
		var B:Number =((y1*v2)-(y2*v1))*inv_dd;
		var C:Number =((x2*u1)-(x1*u2))*inv_dd;
		var D:Number =((y2*u1)-(y1*u2))*inv_dd;
		var E:Number =-((A*tu)+(C*tv)-tx);
		var F:Number =-((B*tu)+(D*tv)-ty);
		mt.a =A;
		mt.b =B;
		mt.c =C;
		mt.d =D;
		mt.tx=E;
		mt.ty=F;
	}
	return mt;
}
----------------------------------------------