Проблема с порядком вращения 3D спрайта в Flash CS4 по оси Z

Я подозреваю, что это скорее математическая проблема, чем вспышка. Короче говоря, у меня есть два куба, которые вращаются вокруг своей общей центральной точки. Все идет нормально. Используя матричные функции appendTranslation и appendRotation, мне удалось заставить два куба вращаться нормально.

Проблема в том, что порядок рисования, похоже, мало влияет на 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 ++;

     }

  }

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


person Oni    schedule 07.07.2009    source источник
comment
Похоже, это больше, чем предназначалось для AS3 3D API. Возможно, вам будет лучше с полноценным 3D-движком, например PaperVision.   -  person bgw    schedule 08.07.2009
comment
Дальнейшее редактирование показало, что примененный мною алгоритм художника в значительной степени игнорируется по какой-то причудливой причине.   -  person Oni    schedule 08.07.2009
comment
Нет, это определенно задача AS3. Я пошел по этому пути, потому что мне не нужна полноценная настройка Papervision, но по какой-то странной причине при определенных поворотах порядок игнорируется.   -  person Oni    schedule 08.07.2009


Ответы (1)


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

person Oni    schedule 09.07.2009