0

一个图层,用frame {0,0,w,h}, backgroundColor red, anchorPoint at {0,0.5},transform.m34 = -1.0/1800, 设置position at {0,0}, 然后沿 y ,旋转一个角度CATransform3DRotate(layer.transform , 0.25 * M_PI, 0, 1, 0), 现在我想算出红色区域的宽度。

一开始我以为应该是cos(0.25 * M_PI) *w,后来我用代码测试了一下,红色区域变短了cos(0.25 * M_PI) *w,应该是透视的原因(物体越近显得越大),但不知道怎么算出红色区域宽度。

4

1 回答 1

3

如果我对您的理解正确,那么您要做的是在一系列变换后确定两个不同点的相对位置。计算出这样做的方程式可能会很棘手,我发现先根据矩阵写出所有内容然后通过自己乘以矩阵来得到方程式很有帮助。

假设您的锚点位于原点,使用列主矩阵(如 open GL 和 CA 层)。Position1 将表示矩形的左边缘,Position2 表示右边缘。

Position1 = {1,0,0,0,
            0,1,0,0,
            0,0,1,0,
            0,0,0,1};

Position2 ={1,0,0,w,  
            0,1,0,0,  
            0,0,1,0,  
            0,0,0,1};  

位置 2 现在需要围绕 y 轴旋转您的角度,所以我们声明

Rotation = {cos,0,sin,0,
              0,1,  0,0,
           -sin,0,cos,0,
              0,0,  0,1};

旋转需要应用于 Position2 并且它们都需要乘以投影矩阵。Position1 不需要旋转,因为它位于旋转轴上。重要的是要意识到仅仅将 m34 设置为一个小的负数并没有做任何神奇的事情,你真正做的是乘以投影矩阵

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

乘以不同格式的投影矩阵也可以,使用您最熟悉的任何格式。您可以使用Open GL之类的矩阵或您正在使用的矩阵,因为它们确实是等价的。

Position2 = MultiplyMatrices(Rotation,Position2);
Position2 = MultiplyMatrices(YourProjection,Position2);
Position1 = MultiplyMatrices(YourProjection,Position1);

Position1 和 Position2 现在保持在 CALayer 对其执行变换时将给出的确切位置。由于这些是齐次坐标,您必须确保将 x、y、z 分量 (m41,42,43) 除以 w (m44) 以转换回笛卡尔坐标。那么你需要做的就是得到宽度

float width = Position1.m41-Position2.m41;

如果你还没有,你可能应该让自己做矩阵乘法的函数,这样你就可以快速轻松地进行这样的计算。你也不会因为这种方式代数错误而感到困惑:)。如果您真的想以代数方式进行操作,只需将其相乘,它就会为您提供所需的内容。此外,如果我的矩阵表示法令人困惑,这里是从列主要到 CALayer 变量的转换。

{m11,m12,m13,m14,
 m21,m22,m23,m24,
 m31,m32,m33,m34,
 m41,m42,m43,m44};

一个简单的平移矩阵在哪里

{1,0,0,0,
 0,1,0,0,
 0,0,1,0,
 x,y,z,1};
于 2012-06-08T16:07:39.307 回答