2009-07-07 18 views
0

これはフラッシュの問題ではなく、数学の問題と思われます。簡単に言えば、共通の中心点を中心に回転する2つの立方体があります。ここまでは順調ですね。 appendTranslationとappendRotationの行列関数を使用して、2つの立方体を回転させてOKにしました。Flash CS4 3Dスプライト回転Z注文の問題

問題は描画順序がZバッファリングにほとんど影響しないようです。私はZバッファーを正しく管理し、キューブを深度順に並べ替えます。しかし、描画命令を正しく取得しているにもかかわらず、キューブは半分の時間だけ正しく閉塞されています。

x軸平面上の2つの立方体を、Y軸を中心に回転する等間隔の2つの立方体を想像してください。 90度では、一方のキューブが他方のキューブを閉塞し、逆も270度の回転で閉塞する。私の問題は、これがこれらの場所のいずれかでのみ正しく発生することです。後方への回転(-90と-270)は反対の場所でのみ同じ効果があるので、サインの問題であるようです。 - 回しが描かれ、

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

    } 

    } 

を回転させる事がIまし

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各サイクルと呼ばれる

PixelCubeGroup.as:ここ

は、関連するコードですそれを翻訳ラインに絞り込んだ。 2つのキューブを回転させずに回転させると、正しく動作し、描画順序を尊重しますが、これは行いません。私は不正なZ値がどこかに入っていると思う。

+0

これは、AS3の3D APIが意図した以上のものです。 PaperVisionのようなフル3Dエンジンを使うほうが良いかもしれません – bgw

+0

私が適用したペインタのアルゴリズムは、いくつかのビザロの理由で無視されていることが明らかになりました – Oni

+0

いいえ、これは間違いなくAS3の仕事です。私は完全なPapervisionセットアップが必要ないので、このルートを下ったが、何らかの奇妙な理由のために、特定のローテーションではオーダーは無視される – Oni

答えて

1

ソート済みです。どうやら、描画/ Zの順序は、グラフィックス呼び出しの順序ではなく、addChild()およびremoveChild()が呼び出される順序によって決まります。ビット愚かなそこにアドビ!