これはフラッシュの問題ではなく、数学の問題だと思います。簡単に言えば、共通の中心点を中心に回転する 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 値が侵入していると思われます。