我怀疑这是一个数学问题,而不是一个闪光问题。简而言之,我有两个围绕共同中心点旋转的立方体。到现在为止还挺好。使用appendTranslation和appendRotation矩阵函数,我设法让两个立方体旋转好。
问题是绘图顺序似乎对Z缓冲几乎没有影响。我已正确设法使用Z缓冲区并按深度顺序排列立方体。然而,尽管获得了正确的绘图顺序,但是只有一半的时间才能正确地遮挡了cueb。
想象一下x轴平面上的两个立方体,两侧以相等的间距围绕Y轴旋转。在90度旋转时,一个立方体将遮挡另一个立方体,反之亦然。我的问题是这只在其中一个地方正确发生。它似乎是一个标志问题,因为向后旋转(所以-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正在某处进入。
答案 0 :(得分:1)
对它进行排序。显然,如果您将调用绘图/ Z顺序,则调用addChild()和removeChild()的顺序,而不是任何图形调用的顺序。有点愚蠢的Adobe!