应用始终相对于屏幕的透视

时间:2012-06-25 22:59:00

标签: iphone objective-c transform perspective catransform3d

我想问一个关于通过CATransform3D实现的观点的问题。 我知道如果你有一个320x480的视图然后应用它:

    CATransform3D perspective = CATransform3DIdentity;
    CGFloat zDistance = 1000;
    perspective.m34 = 1.0 / -zDistance;  
    view.layer.sublayerTransform = perspective;

您创建一个透视图,使其看起来像观察者正在直视屏幕的中心,因此相同的转换看起来不同,具体取决于正在转换的子视图位于屏幕上的位置。例如,当视图位于屏幕中间时,倾斜视图如下所示:

如果它在左下角,它看起来像这样:

现在,我的问题是,只有当我正在转换的视图是另一个320x480px大的视图的子视图时,才能使相对于屏幕的透视图有效。但是,如果我要转换的视图是一个只有100x100px的视图的子视图呢?如果超视图不是屏幕的大小,有没有办法使透视相对于整个屏幕? 提前致谢

1 个答案:

答案 0 :(得分:0)

根据apple

“anchorPoint属性是一个CGPoint,它指定与位置坐标对应的图层边界内的位置。锚点指定边界相对于位置属性的定位方式,以及作为点的位置。转换应用于。“

默认情况下,您的视角不应该与屏幕中心相关,甚至不应该相对于图层的中心,是您拥有锚点的位置?除此之外,您似乎要问的是如何使您的视角看起来与不同点相关。诀窍在于您的透视图是通过乘以透视矩阵创建的。将m34设置为较小的数字没有任何魔力,您将乘以投影矩阵。

YourProjection = {1,0,0             ,0,
                  0,1,0             ,0,
                  0,0,1             ,0,
                  0,0,-1.0/zdistance,1};

请记住,您可以通过将连续变换相乘来组合它们。只需将您的图层转换为您想要的任何位置,然后应用您的投影矩阵,然后将其从不同的原点转换回来,presto,perspective。

float x = your coordinates relative to the screen center;
float y = same thing
TranslationMatrix = {1,0,0,0,
                     0,1,0,0,
                     0,0,1,0,
                     x,y,0,1};
ReverseTranslationMatrix = {1,0,0,0,
                            0,1,0,0,
                            0,0,1,0,
                            -x,-y,0,1};
//now just multiply them all together
Final = ReverseTranslation*YourProjection*Translation;

你需要自己做矩阵数学,希望你已经有了一个通用的4x4列主要矩阵类,可以为你做乘法,如果没有,我建议你做一个。另外,如果您有兴趣,可以考虑阅读。 This用于解释您当前使用的矩阵是如何工作的,或This用于不同的投影矩阵。