J'écris un moteur 3D pour AS3.0 ... Et j'ai rencontré un problème ennuyeux. AS3.0 supporte actuellement uniquement les transformations affines Bitmap (la 3D est beaucoup trop difficile à gérer, c'est pourquoi j'écris le moteur) - ce qui signifie que je ne peux pas obtenir une vraie perspective sur les gros sommets.Moteur 3D - comment diviser correctement le vertex
je pouvais faire une boucle et rendre chaque pixel du bitmap en fonction de sa position Z ... Mais c'est quelque chose 1000 fois plus que la plupart des ordinateurs peuvent faire, parce que la perspective est non-linéaire ...
Donc - la solution serait - de diviser le sommet automatiquement (de sorte que le programmeur/modeleur n'a pas à le faire) en triangles plus petits.
Malheureusement c'est ... saccadé ...? Les transformations affines ne seront pas assez précises, ou seraient, mais ils ne tiennent pas sur les autres triangles ... Une image pour démontrer:
(image morte)
Comme vous pouvez le voir sur la parties rouges, ils sont très saccadés, les plus visibles dans la colonne du milieu avant.
Alors, qu'est-ce que je fais de mal? Comment cela se fait-il dans Sandy, away3D, Alternativa pour n'en nommer que quelques-uns avec une certaine perspective?
EDIT: Le code que je utilise pour transformer en triangles ressemble à ceci:
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 : Voici une petite démo du transformateur:
CLIQUEZ ICI (lien nul)
(flèches pour contrôler les points bleus, 1-3 pour modifier la poignée sélectionnée - essayez les deux pavés numériques)
utilisez-vous drawTriangles pour cela? – Zevan
Non. J'ai un code, que je mets dans le post btw, qui transforme correctement BitmapData en points triangle, donc je ne pense pas que le problème soit là. Je pourrais porter des Triangles, parce que, après tout, j'utilise déjà des Vecteurs pour la performance. –
Je pense que si vous essayez d'utiliser DrawTriangles à la place, cela va résoudre votre problème. Voici quelques articles liés à drawTriangles et z-tri http://actionsnippet.com/?s=drawTriangles&searchsubmit=Recherche – Zevan