【问题标题】:Converting a CGAffineTransform to a GLKMatrix3将 CGAffineTransform 转换为 GLKMatrix3
【发布时间】:2015-04-04 04:16:04
【问题描述】:

我正在尝试将视频渲染到纹理表面,但纹理坐标存在一些问题。

我正在使用 CoreVideo 通过 CVOpenGLESTextureCacheCreateTextureFromImage 调用来抓取纹理表面。这部分工作正常。现在我想旋转视频,使其以正确的方向显示。让我感到震惊的是,一种方法是通过纹理坐标矩阵。为此,我从我的 AVAssetTrack 中获取了 preferredTransform 和 naturalSize。

现在我开始遇到问题了。 preferredTransform 包含一个以像素为单位的平移 (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 );
}

这似乎几乎完美地改变了一切。然而,虽然横向拍摄的视频看起来很完美,但纵向拍摄的视频却是颠倒的。

所以很明显我做错了什么,但我在这方面花了相当多的时间却一无所获。有人知道我哪里出错了吗?

【问题讨论】:

    标签: ios c opengl-es avfoundation core-video


    【解决方案1】:

    您需要知道横向视频以哪种方式旋转 -90 或 90,以便反转该变换以进行显示

    3x3 仿射矩阵

    xx    xy    x0
    yx    yy    y0
    0     0     1
    

    不确定 a,b,c,d,tx,ty 如何映射,但希望苹果的文档可能会有所帮助

    这是一个角度为 a 的仿射示例 // 逆时针旋转,弧度

    cos(a)   -sin(a)    0
    sin(a)    cos(a)    0
    0         0         1
    

    【讨论】:

    • 不确定这会有所帮助,但如果 preferredTransform a & d == -1.0 它会指定我认为的旋转方式,而不是 100% 确定哪个元素是哪个
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多