0

これはフラッシュの問題ではなく、数学の問題だと思います。簡単に言えば、共通の中心点を中心に回転する 2 つの立方体があります。ここまでは順調ですね。appendTranslation および appendRotation マトリックス関数を使用して、2 つの立方体を正常に回転させることができました。

問題は、描画順序が Z バッファリングにほとんど影響を与えないように見えることです。Z Buffer を正しく実行し、立方体を深さの順に並べることができました。ただし、描画順序を正しく設定しても、cueb が適切にオクルージョンされるのは半分の時間だけです。

X 軸平面上に 2 つの立方体があり、両側が等間隔で Y 軸を中心に回転しているとします。90 度で一方の立方体がもう一方の立方体を遮り、270 度でその逆になります。私の問題は、これがこれらの場所の 1 つでのみ正しく発生することです。逆方向 (つまり -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 ++;

     }

  }

翻訳行に絞り込むことができました。平行移動なしで 2 つの立方体の回転を実行すると、正常に機能し、描画順序が尊重されますが、これはそうではありません。どこかに不正な Z 値が侵入していると思われます。

4

1 に答える 1

1

並べ替えました。どうやら、描画 / Z 順序は、グラフィック呼び出しの順序ではなく、addChild() および removeChild() が呼び出された順序によって管理されるようです。少しばかげているアドビ!

于 2009-07-09T09:47:59.940 に答える