Я подозреваю, что это скорее математическая проблема, чем вспышка. Короче говоря, у меня есть два куба, которые вращаются вокруг своей общей центральной точки. Все идет нормально. Используя матричные функции appendTranslation и appendRotation, мне удалось заставить два куба вращаться нормально.
Проблема в том, что порядок рисования, похоже, мало влияет на Z-буферизацию. Мне удалось правильно настроить Z Buffer и расположить кубики по глубине. Однако, несмотря на правильный порядок прорисовки, сигнал перекрывается правильно только в половине случаев.
Представьте себе два куба на плоскости оси x, каждая из сторон на равном расстоянии друг от друга, вращающихся вокруг оси Y. При повороте на 90 градусов один куб будет перекрывать другой, и наоборот при повороте на 270 градусов. Моя проблема в том, что это происходит правильно только в одном из этих мест. Похоже, это проблема со знаком, поскольку вращение назад (то есть -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 куда-то попадает.