AS3.0用の3Dエンジンを書いています...そして、厄介な問題に遭遇しました。AS3.0は現在、アフィンビットマップ変換のみをサポートしています(3Dは管理が非常に難しいため、エンジンを作成しています)。つまり、大きな頂点で真の遠近法を実現することはできません。
ループを実行して、ビットマップの各ピクセルをそのZ位置に基づいてレンダリングすることができます...しかし、遠近法は非線形であるため、これはほとんどのコンピューターよりも1000倍多くなります...
したがって、解決策は、頂点を自動的に(プログラマー/モデラーが行う必要がないように)小さな三角形に分割することです。
残念ながらこれは...途切れ途切れです...?アフィン変換は十分に正確ではないか、正確ではありませんが、他の三角形には適合しません...デモンストレーション用の画像:
(デッドイメージ)
赤い部分でわかるように、それらは非常に途切れ途切れで、正面中央の列で最も目立ちます。
だから-私は何が間違っているのですか?Sandy、away3D、Alternativaでこれはどのように行われていますか?
編集1:三角形への変換に使用しているコードは次のようになります。
public static function transformTriangle(bd:BitmapData, pts:Vector.<Point>, gfx:Graphics):void {
var matrix:Matrix = new Matrix();
matrix.tx = pts[0].x;
matrix.ty = pts[0].y;
matrix.a = (pts[1].x - pts[0].x) / bd.width;
matrix.b = (pts[1].y - pts[0].y) / bd.height;
matrix.c = (pts[2].x - pts[0].x) / bd.width;
matrix.d = (pts[2].y - pts[0].y) / bd.height;
gfx.beginBitmapFill(bd, matrix, false, true);
gfx.moveTo(pts[0].x, pts[0].y);
gfx.lineTo(pts[0].x, pts[0].y);
gfx.lineTo(pts[1].x, pts[1].y);
gfx.lineTo(pts[2].x, pts[2].y);
gfx.lineTo(pts[0].x, pts[0].y);
gfx.endFill();
}
編集2:これは変圧器の小さなデモです:
こちらをクリック(デッドリンク)
(青い点を制御するための矢印、選択したハンドルを変更するための1〜3-テンキーと上部の数字キーの両方を試してください)