2009-07-07 4 views
0

Je suppose que c'est un problème mathématique plutôt qu'un problème instantané. En un mot, j'ai deux cubes qui tournent autour de leur centre commun. Jusqu'ici tout va bien. En utilisant les fonctions appendTranslation et appendRotation matrix, j'ai réussi à faire tourner les deux cubes ok.Flash CS4 Rotation Sprite 3D Z Problème de commande

Le problème est que l'ordre de dessin semble avoir peu d'effet sur le Z Buffering. J'ai réussi à Z Buffer correctement et commander les cubes dans l'ordre de profondeur. Cependant, bien que l'ordre de dessin soit correct, le cueb n'est correctement fermé que la moitié du temps. Imaginez deux cubes sur le plan de l'axe des x, de chaque côté avec un espacement égal tournant autour de l'axe Y. À 90 degrés, un cube occlura l'autre et vice-versa à une rotation de 270 degrés. Mon problème est que cela se produit correctement seulement à l'un de ces endroits. Cela semble être un problème de signe car la rotation vers l'arrière (donc -90 et -270) n'a le même effet qu'aux endroits opposés.

Voici le code correspondant:

PixelCubeGroup.as - Rotation est appelé chaque cycle

function rotateObj(rotx:Number,roty:Number,rotz:Number):void { 

      var i:int; 

      for(i=0; i<pixelVec.length; i++){ 

       var v:Vector3D = centerPos; 
       v = v.subtract(pixelVec[i].getPos());     
       pixelVec[i].rotateObj(rotx,roty,rotz,v); 

      } 

      } 

PixelCube.as Les choses qui sont tirées et mis en rotation

function rotateObj(xrot:Number,yrot:Number,zrot:Number, pivot:Vector3D){ 

     // rotate the cube by changing the values in the matrix 3D around a pivot point 
     m.identity();  
     m.appendTranslation(-pivot.x,-pivot.y, -pivot.z); 
     m.appendRotation(xrot, Vector3D.X_AXIS); 
     m.appendRotation(yrot, Vector3D.Y_AXIS); 
     m.appendRotation(zrot, Vector3D.Z_AXIS); 
     m.appendTranslation(pivot.x,pivot.y,pivot.z); 


} 

function draw():void 
    { 

    var renderV:Vector.<Number> = new Vector.<Number>(); 


    currentV = new Vector.<Vector3D>(); 

    for each(var vv:Vector3D in v) 
    { 
     // apply the matrix to the vertices in 'v' 
     vv = m.transformVector(vv); 

     vv.w = (400 + vv.z)/400; 

     vv.project(); 


     renderV.push(vv.x, vv.y); 

     currentV.push(vv); 
    } 

    // draw things out 
    container.graphics.clear(); 
    container.x = xPos; 
    container.y = yPos; 
    container.z = 1; 

    var id = 0 

    plane.sort(sortByZ); 

    for each(var p:Vector.<int> in plane) 
    { 
     container.graphics.beginFill(palleteColours[id],1.0); 
     var planeV:Vector.<Number> = new Vector.<Number>(); 

     for (var i:int = 0; i < planeSides; i++) 
     { 
      planeV.push(renderV[p[i]* 2], renderV[p[i] * 2 + 1]); 

     } 

     container.graphics.drawTriangles(planeV, indices, null, TriangleCulling.NEGATIVE); 

     container.graphics.endFill(); 
     id ++; 

    } 

    } 

J'ai réussi à le réduire aux lignes de traduction. Effectuer une rotation de deux cubes sans traduction fonctionne bien et respecte l'ordre de dessin, ce qui n'est pas le cas. Je soupçonne qu'un Z Value voyou y arrive quelque part.

+0

Cela semble plus que prévu pour les API 3D AS3. Vous pourriez être mieux avec un moteur 3D complet, comme PaperVision – bgw

+0

Une autre édition a révélé que l'algorithme du peintre que j'ai appliqué est à peu près ignoré pour une raison de bizzaro – Oni

+0

Non, c'est certainement à la hauteur de la tâche de AS3. Je suis allé dans cette voie parce que je n'ai pas besoin d'une configuration Papervision complète, mais pour une raison étrange, à certaines rotations, l'ordre est ignoré – Oni

Répondre

1

L'a triée. Apparemment, l'ordre de dessin/Z, si vous voulez, est régi par l'ordre dans lequel addChild() et removeChild() sont appelés, plutôt que dans l'ordre des appels graphiques. Un peu bête là-bas Adobe!

Questions connexes