0

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-テンキーと上部の数字キーの両方を試してください)

4

1 に答える 1

1

代わりにdrawTrianglesを使用しようとすると、問題が解決すると思います。drawTrianglesとz-sortingリンクに関連するいくつかの投稿があります

于 2010-11-21T17:20:19.227 に答える