2010-11-20 5 views
0

Ich schreibe eine 3D-Engine für AS3.0 ... Und ich stieß auf ein lästiges Problem. AS3.0 unterstützt derzeit nur affine Bitmap-Transformationen (das 3D ist viel zu schwer zu verwalten, deshalb schreibe ich die Engine) - was bedeutet, dass ich keine echte Perspektive auf große Vertices erreichen kann.3D-Engine - wie man richtig Vertex split

Ich könnte eine Schleife tun und jedes Pixel der auf seiner Z-Position basierend Bitmap machen ... Aber das ist etwas, 1000-mal mehr als die meisten Computer tun können, weil Perspektive nicht-linear ist ...

Also - die Lösung wäre - den Vertex automatisch in kleinere Dreiecke aufzuteilen (so dass der Programmierer/Modellierer dies nicht tun muss).

Leider ist das ... abgehackt ...? Die affinen Transformationen werden nicht präzise genug, oder wären, aber sie werden nicht auf den anderen Dreiecken passen ... Ein Bild zu demonstrieren:

(tote Bild)

Wie man auf das sehen rote Teile, sie sind sehr abgehackt, am auffälligsten in der vorderen mittleren Spalte.

Also - was mache ich falsch? Wie ist das in Sandy, away3D, Alternativa, um einige mit einer gewissen Perspektive zu nennen?

EDIT: Der Code, den ich auf Dreiecke für die Umwandlung bin mit wie folgt aussieht:

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(); 
} 

EDIT : Hier eine kleine Kostprobe des Transformators ist:

HIER KLICKEN (toter Link)

(Pfeile zum Steuern der blauen Punkte, 1-3 zum Ändern des ausgewählten Griffs)

+1

verwenden Sie drawTriangles für diese? – Zevan

+0

Nein. Ich habe einen Code, den ich in den post btw, die BitmapData korrekt in Dreieckspunkte verwandelt, so dass ich glaube nicht, das Problem ist da. Ich könnte nach drawTriangles portieren, denn schließlich benutze ich Vectors bereits für die Performance. –

+1

Ich denke, wenn Sie stattdessen drawTriangles verwenden, wird es Ihr Problem beheben. Hier sind einige Beiträge zu DrawTriangles und Z-Sortierung http://actionsnippet.com/?s=drawTriangles&searchsubmit=Search – Zevan

Antwort

1

Ich denke, wenn Sie stattdessen drawTriangles verwenden, wird es Ihr Problem beheben. Hier sind einige Einträge im Zusammenhang mit drawTriangles und z-sorting link