美文网首页
8.CATransform3D

8.CATransform3D

作者: LucXion | 来源:发表于2021-06-17 09:45 被阅读0次

iOS中的CALayer的3D本质上并不能算真正的3D(其视点即观察点或者所谓的照相机的位置是无法变换的),而只是3D在二维平面上的投影,投影平面就是手机屏幕也就是xy轴组成的平面(注意iOS中为左手坐标系),那么视点的位置是如何确定的呢?可以通过CATransform3D中的m34来间接指定, m34 = -1/z,其中z为观察点在z轴上的值,而Layer的z轴的位置则是通过anchorPoint来指定的,所谓的anchorPoint(锚点)就是在变换中保持不变的点,也就是某个Layer在变换中的原点,xyz三轴相交于此点。在iOS中,Layer的anchorPoint使用unit coordinate space来描述,unit coordinate space无需指定具体真实的坐标点而是使用layer bounds中的相对位置,下图展示了一个Layer中的几个特殊的锚点

m34 = -1/z中,当z为正的时候,是我们人眼观察现实世界的效果,即在投影平面上表现出近大远小的效果,z越靠近原点则这种效果越明显,越远离原点则越来越不明显,当z为正无穷大的时候,则失去了近大远小的效果,此时投影线垂直于投影平面,也就是视点在无穷远处,CATransform3D中m34的默认值为0,即视点在无穷远处.

  • CATransform3D并非真实的3D,它只是3D在二维平面上的投影,视点无法改变(即相机位置无法改变)

  • 投影平面坐标系为左手坐标系

  • 视点无法改变,但是可以通过m34来间接指定

  • m34

    • z为正时,是我们人眼观察现实世界的效果

    • 视点在无穷远处时,失去近大远小效果,此时z接近于0

    • m34 = -1/z,z为视点在z轴上的值,layer的z轴位置是通过锚点(anchorpoint)来指定

  • 锚点即不变点,xyz轴交点

image-20210616164853488.png

还有一个需要说明一下的就是齐次坐标到数学坐标的转换 通用的齐次坐标为 (a, b, c, h),其转换成数学坐标则为 (a/h, b/h, c/h).

    /*
    anchorPoint为默认的 (0.5, 0.5 ), 其三维空间中一个A点 (6, 0, 0),m34 = -1/1000.0, 则此点往z轴负方向移动10个单位之后,则在投影平面上看到的点的坐标表示为 (6, 0, 0, 1)   
    */
    CATransform3D transform = CATransform3DIdentity;
    transform.m34 = -1/1000.0;
    transform = CATransform3DTranslate(transform, 0, 0, -10);

相关文章

  • 8.CATransform3D

    iOS中的CALayer的3D本质上并不能算真正的3D(其视点即观察点或者所谓的照相机的位置是无法变换的),而只是...

网友评论

      本文标题:8.CATransform3D

      本文链接:https://www.haomeiwen.com/subject/tidfyltx.html