Преобразование CGAffineTransform в GLKMatrix3

Я пытаюсь отобразить видео на текстурной поверхности, но у меня есть несколько проблем с координатами текстуры.

Я использую CoreVideo для захвата поверхности текстуры с помощью вызова CVOpenGLESTextureCacheCreateTextureFromImage. Эта часть работает нормально. Теперь я хочу повернуть видео, чтобы оно отображалось в правильной ориентации. Мне пришло в голову, что один из способов сделать это — использовать матрицу координат текстуры. С этой целью я беру предпочтительные Transform и naturalSize из моего AVAssetTrack.

Теперь у меня начинаются проблемы. Предпочтительное преобразование содержит перевод (tx, ty) в пикселях, но мне нужно это «нормализованное», поэтому я делаю следующее, чтобы получить свою матрицу:

    CGSize transSize    = CGSizeApplyAffineTransform( videoSize, videoTransform );
    videoTransform.tx   /= -transSize.width;
    videoTransform.ty   /= -transSize.height;

(Обратите внимание, что я не уверен, почему мне нужно отрицать преобразованный размер, но если я этого не сделаю, то вещи не окажутся в диапазоне 0-> 1).

Затем я формирую GLKMatrix3 следующим образом:

GLKMatrix3 CGAffineTransformToGLKMatrix3( CGAffineTransform affineTransform )
{
    return GLKMatrix3Make(  affineTransform.a,  affineTransform.b,  0,
                            affineTransform.c,  affineTransform.d,  0,
                            affineTransform.tx, affineTransform.ty, 1 );
}

Это, кажется, преображает все почти идеально. Однако в то время как видео, снятые в альбомной ориентации, выглядят идеально, видео, снятые в портретной ориентации, выглядят перевернутыми.

Так что, очевидно, я делаю что-то не так, но я потратил на это немало времени и ничего не добился. У кого-нибудь есть идеи, где я ошибаюсь?


person Goz    schedule 04.02.2015    source источник


Ответы (1)


Вам нужно знать, каким образом пейзажное видео было повернуто на -90 или 90, чтобы инвертировать это преобразование для отображения.

Аффинная матрица 3x3

xx    xy    x0
yx    yy    y0
0     0     1

не уверен, как карта a, b, c, d, tx, ty, но ожидайте, что документы Apple могут помочь

Вот пример аффинного выражения с углом a // поворот против часовой стрелки, радианы

cos(a)   -sin(a)    0
sin(a)    cos(a)    0
0         0         1
person Mark Essel    schedule 18.02.2015
comment
не уверен, что это поможет, но если вы предпочитаетеTransform a & d == -1.0, он укажет, в какую сторону вращать, я думаю, не на 100% уверен, какой элемент какой - person Mark Essel; 19.02.2015