2014-08-06 4 views
1

Как назначить значение вращению матрицы по оси Z. (li «вращение»)?Вращение без искажений с использованием Matrix3D

Позиция и размер рассчитываются правильно, но после добавления вращения изображение растягивается.

Я попробовал два метода для вращения:

_positionMatrix.identity(); 
var v3:Vector.<Vector3D> = new Vector.<Vector3D>(3); 
v3 = _positionMatrix.decompose(); 
v3[0].incrementBy(new Vector3D(x, y, 0));// x, y, z 
v3[1].incrementBy(new Vector3D(0,0,-rotation*Math.PI/180)); // rotationX, rotationY, rotationZ 
v3[2].incrementBy(new Vector3D(width,height,0)); // scaleX, scaleY, scaleZ 
_positionMatrix.recompose(v3); 

И:

_positionMatrix.identity(); 
_positionMatrix.appendScale(width,height,1); 
_positionMatrix.appendTranslation(x,y,0); 
_positionMatrix.appendRotation(-rotation,Vector3D.Z_AXIS); 

Но эффект идентичен:

enter image description here

Я считаю, что класс "PerspectiveProjection" может помогите, но не можете понять, как использовать его с вращением вокруг ось Z.

ответ

0

Спасибо, его правда, моя перспективная матрица проекции была «плохой». Этот код работает отлично:

private var _vertexData:Vector.<Number> = new <Number>[ 
     0,0,0, 0, 0, 0, 1,// x, y, z, r, g, b,a 
     1, 0, 0, 0, 0, 0, 1, 
     1, 1, 0, 0, 0, 0, 1, 
     0, 1, 0,0, 0, 0,1 
    ]; 



    var perspectiveProjectionMatrix:Matrix3D = new Matrix3D(); 
    var scaleX:Number = 2.0/_stage.stageWidth; // 2.0/500 
    var scaleY:Number = -2.0/_stage.stageHeight; // -2.0/375 
    perspectiveProjectionMatrix.copyRawDataFrom(
      new <Number>[ 
       scaleX, 0.0, 0.0, 0.0, 
       0.0, scaleY, 0.0, 0.0, 
       0.0, 0.0, -1.0, 0.0, 
       -1.0, 1.0, 0.0, 1.0 
      ] 
    ); 
    var modelViewMatrix:Matrix3D = trs(stage.stageWidth/2,stage.stageHeight/2, _rotation*Math.PI/180, _width*_globalScaleX, _height*_globalScaleY); 
    var resultMatrix:Matrix3D = new Matrix3D(); 
    resultMatrix.prepend(perspectiveProjectionMatrix); 
    resultMatrix.prepend(modelViewMatrix); 
    _context.setProgramConstantsFromMatrix(Context3DProgramType.VERTEX, 0,resultMatrix , true); 

Где "ТРС" является:

public function trs(tx:Number, ty:Number, rotation:Number, xScale:Number, yScale:Number):Matrix3D { 

var data:Vector.<Number> = new <Number>[1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]; 

var sin:Number = Math.sin(rotation); 
var cos:Number = Math.cos(rotation); 
data[0] = cos * xScale; 
data[1] = sin * xScale; 
data[4] = -sin * yScale; 
data[5] = cos * yScale; 
data[12] = tx; 
data[13] = ty; 


var matrix:Matrix3D = new Matrix3D(); 
matrix.copyRawDataFrom(data); 
return matrix; 

} 
0

Для начала, если у вас есть такая проблема - попробуйте устранить матричные преобразования один за другим, пока не найдете, какая матрица «плохой». Например, что произойдет, если вы сохраните только одно преобразование - масштаб или перевод или поворот? В вашем примере я не вижу преступника, поэтому проблема в коде. Я могу предположить, что ваша проекционная матрица ошибочна. Можете ли вы его предоставить? Как применить окончательную матрицу к объекту?

Смежные вопросы