2009-07-07 2 views
0

Я подозреваю, что это проблема математики, а не вспышка. В двух словах, у меня есть два куба, которые вращаются вокруг их общей центральной точки. Все идет нормально. Используя функции appendTranslation и appendRotation, мне удалось заставить два куба вращаться нормально.Flash CS4 3D Sprite Rotation Z Задача заказа

Проблема в том, что порядок рисования, по-видимому, мало влияет на буферизацию Z. Я правильно выполнил Z Buffer и упорядочил кубы по порядку глубины. Тем не менее, несмотря на то, что правый порядок рисования, куб только закрывается в середине времени.

Представьте себе два куба на плоскости оси x, каждая из сторон на равном расстоянии, вращающемся вокруг оси Y. При 90 градусах один куб будет закрывать другой и наоборот при вращении на 270 градусов. Моя проблема в том, что это происходит правильно только в одном из этих мест. Похоже, что это знак, поскольку вращение назад (так -90 и -270) имеет тот же эффект только в противоположных местах.

Вот соответствующий код:

PixelCubeGroup.as - Поворот называется каждый цикл

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 вещи, которые рисуются и вращают

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 ++; 

    } 

    } 

Я удалось сузить его до линий перевода. Выполнение вращения двух кубов без перевода отлично работает и уважает порядок рисования, тогда как это не так. Я подозреваю, что там что-то происходит.

+0

Это похоже на то, что предназначалось для API AS3 3D. Возможно, вам будет лучше работать с полным 3D-движком, например PaperVision – bgw

+0

. Дальнейшее редактирование показало, что алгоритм Painter's, который я применил, в значительной степени игнорируется по какой-то причине bizzaro. – Oni

+0

Нет, это определенно зависит от задачи AS3. Я пошел по этому маршруту, потому что мне не нужна полная настройка Papervision, но по какой-то странной причине при определенных поворотах порядок игнорируется – Oni

ответ

1

Отсортировано. По-видимому, порядок рисования/Z, если вы будете управляться порядком, который вызываются addChild() и removeChild(), а не порядок любых графических вызовов. Немного глупо там Adobe!