2

我想问一个关于通过CATransform3D. 我知道如果你有一个 320x480 的视图,然后应用这个:

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

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

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

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

4

1 回答 1

0

根据苹果

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

默认情况下,您的视角不应该相对于屏幕的中心,甚至不应该相对于图层的中心,那是您的锚点所在的位置吗?除此之外,您似乎要问的是如何使您的观点看起来与不同的点相关。诀窍是你的视角是通过乘以你的视角矩阵来创建的。将 m34 设置为一个小数字并没有什么神奇的,你乘以你的投影矩阵。

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

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

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 列主矩阵类,可以为你做乘法,如果没有,我建议你做一个。另外,如果您有兴趣,可以考虑阅读。 是为了解释您当前使用的矩阵是如何工作的,或者是为了对投影矩阵进行不同的处理。

于 2012-06-27T16:03:03.680 回答