【问题标题】:Flash CS4 3D Sprite Rotation Z Order ProblemFlash CS4 3D Sprite 旋转 Z 顺序问题
【发布时间】:2009-07-07 17:37:35
【问题描述】:

我怀疑这是一个数学问题,而不是一个闪存问题。简而言之,我有两个围绕它们共同中心点旋转的立方体。到目前为止,一切都很好。使用 appendTranslation 和 appendRotation 矩阵函数,我设法让两个立方体旋转正常。

问题是绘图顺序似乎对 Z 缓冲影响不大。我已经设法正确地 Z 缓冲区并按深度顺序排列立方体。然而,尽管绘制顺序正确,但 cueb 仅在一半时间被正确遮挡。

想象在 x 轴平面上有两个立方体,两边以相等的间距绕 Y 轴旋转。在 90 度时,一个立方体将遮挡另一个,反之亦然,在 270 度旋转时。我的问题是这仅在这些地方之一正确发生。这似乎是一个符号问题,因为向后旋转(因此 -90 和 -270)仅在相反的位置具有相同的效果。

以下是相关代码:

PixelCubeGroup.as - 每次循环调用 Rotate

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 值正在某个地方进入。

【问题讨论】:

  • 这似乎超出了 AS3 3D API 的用途。使用完整的 3D 引擎(例如 PaperVision)可能会更好
  • 进一步的编辑显示,由于某些奇怪的原因,我应用的 Painter 算法几乎被忽略了
  • 不,这绝对是AS3的任务。我走这条路是因为我不需要完整的 Papervision 设置,但出于某种奇怪的原因,在某些旋转时,顺序被忽略

标签: flash 3d zbuffer


【解决方案1】:

排序。显然,如果您愿意,绘图/Z 顺序受调用 addChild() 和 removeChild() 的顺序控制,而不是任何图形调用的顺序。 Adobe有点傻!

【讨论】:

    猜你喜欢
    • 2011-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-14
    • 1970-01-01
    • 2011-09-07
    • 1970-01-01
    相关资源
    最近更新 更多