返回CATransform3D以将四边形映射到四边形

我试图派生一个CATransform3D,它将一个带有4个angular点的四边形映射到另外一个带有4个新angular点的四边形。 我花了一点时间研究这个问题,看起来步骤包括将原来的Quad转换为Square,然后将Square转换为新的Quad。 我的方法是这样的(从这里借用的代码):

- (CATransform3D)quadFromSquare_x0:(float)x0 y0:(float)y0 x1:(float)x1 y1:(float)y1 x2:(float)x2 y2:(float)y2 x3:(float)x3 y3:(float)y3 { float dx1 = x1 - x2, dy1 = y1 - y2; float dx2 = x3 - x2, dy2 = y3 - y2; float sx = x0 - x1 + x2 - x3; float sy = y0 - y1 + y2 - y3; float g = (sx * dy2 - dx2 * sy) / (dx1 * dy2 - dx2 * dy1); float h = (dx1 * sy - sx * dy1) / (dx1 * dy2 - dx2 * dy1); float a = x1 - x0 + g * x1; float b = x3 - x0 + h * x3; float c = x0; float d = y1 - y0 + g * y1; float e = y3 - y0 + h * y3; float f = y0; CATransform3D mat; mat.m11 = a; mat.m12 = b; mat.m13 = 0; mat.m14 = c; mat.m21 = d; mat.m22 = e; mat.m23 = 0; mat.m24 = f; mat.m31 = 0; mat.m32 = 0; mat.m33 = 1; mat.m34 = 0; mat.m41 = g; mat.m42 = h; mat.m43 = 0; mat.m44 = 1; return mat; } - (CATransform3D)squareFromQuad_x0:(float)x0 y0:(float)y0 x1:(float)x1 y1:(float)y1 x2:(float)x2 y2:(float)y2 x3:(float)x3 y3:(float)y3 { CATransform3D mat = [self quadFromSquare_x0:x0 y0:y0 x1:x1 y1:y1 x2:x2 y2:y2 x3:x3 y3:y3]; // invert through adjoint float a = mat.m11, d = mat.m21, /* ignore */ g = mat.m41; float b = mat.m12, e = mat.m22, /* 3rd col*/ h = mat.m42; /* ignore 3rd row */ float c = mat.m14, f = mat.m24; float A = e - f * h; float B = c * h - b; float C = b * f - c * e; float D = f * g - d; float E = a - c * g; float F = c * d - a * f; float G = d * h - e * g; float H = b * g - a * h; float I = a * e - b * d; // Probably unnecessary since 'I' is also scaled by the determinant, // and 'I' scales the homogeneous coordinate, which, in turn, // scales the X,Y coordinates. // Determinant = a * (e - f * h) + b * (f * g - d) + c * (d * h - e * g); float idet = 1.0f / (a * A + b * D + c * G); mat.m11 = A * idet; mat.m21 = D * idet; mat.m31 = 0; mat.m41 = G * idet; mat.m12 = B * idet; mat.m22 = E * idet; mat.m32 = 0; mat.m42 = H * idet; mat.m13 = 0 ; mat.m23 = 0 ; mat.m33 = 1; mat.m43 = 0 ; mat.m14 = C * idet; mat.m24 = F * idet; mat.m34 = 0; mat.m44 = I * idet; return mat; } 

在计算这两个matrix之后,将它们相乘,然后分配给所讨论的视图,最后我得到一个转换的视图,但是这是非常不正确的。 事实上,无论我做什么,它似乎都被剪成平行四边形。 我错过了什么?

更新2/1/12

这似乎是我遇到问题的原因可能是我需要适应FOV和焦距模型视图matrix(这是我可以直接在Quartz中改变的唯一matrix)。我没有任何运气发现文档网上如何计算适当的matrix,虽然。

我能够通过移植和组合来自这两个URL的四元变形和单应性代码来实现这一点:

更新:我已经开源了一个这样的小class: https : //github.com/dominikhofmann/DHWarpView