Iphone 如何确定3D旋转对象与屏幕边缘的距离

Iphone 如何确定3D旋转对象与屏幕边缘的距离,iphone,ios,objective-c,core-animation,catransform3d,Iphone,Ios,Objective C,Core Animation,Catransform3d,我使用核心动画将视图绕y轴旋转了50度我希望视图边缘与屏幕边缘相接触。我如何才能做到这一点 我知道视图的长度和视图旋转的度数(50度),所以一开始我想,我可以用三角法确定视图和边缘之间的距离。但是,相机的透视图受CATransform3D结构的m34属性的影响。如何计算移动视图以与屏幕边缘对齐所需的距离 CATransform3D rotation = CATransform3DIdentity; rotation.m34 = -1.0/500.0; rotation = CATransfor

我使用核心动画将视图绕y轴旋转了50度我希望视图边缘与屏幕边缘相接触。我如何才能做到这一点

我知道视图的长度和视图旋转的度数(50度),所以一开始我想,我可以用三角法确定视图和边缘之间的距离。但是,相机的透视图受
CATransform3D
结构的
m34
属性的影响。如何计算移动视图以与屏幕边缘对齐所需的距离

CATransform3D rotation = CATransform3DIdentity;
rotation.m34  = -1.0/500.0;
rotation = CATransform3DRotate(rotation, 50.0 * M_PI / 180, 0.0, 1.0, 0.0);
view.layer.transform = rotation;
view.layer.zPosition = 200;

您希望将最终变换矩阵(包括M34更改)应用于视图边缘的端点,即您要计算的距离。这将为您提供点在投影空间中的最终位置

iOS 5增加了GLKit,其中包括一整套用于矩阵和向量计算的函数库。以GLKmatrix4MultiplyVector 3为例。该函数获取一个由3部分组成的向量,并将其乘以一个4x4矩阵,然后返回得到的3部分向量


你可能需要GLKmatrix4MultiplyVector 4,因为如果我没记错的话,你希望向量的分量比轴的数目多1个(因此对于3D向量,你需要4个分量的向量)。向量数学不是我的强项,所以我需要使用它时必须查找这些内容。

如果我理解正确,您需要以下内容:

为了简化计算,您需要使用
CALayer
anchorPoint
anchorPoint
是应用变换的地方,其效果在旋转中特别明显。我们要做的是告诉
CALayer
围绕它的一个点旋转,而不是围绕中心旋转(这是默认设置)

这是我的
loadView

UIView *view = [[UIView alloc] initWithFrame:[UIScreen mainScreen].applicationFrame];
view.backgroundColor = [UIColor whiteColor];

CGRect frame = CGRectMake(view.frame.size.width - 100.f,
                          view.frame.size.height / 2.f - 50.f,
                          100.f, 100.f);
UIView *red = [[UIView alloc] initWithFrame:frame];
red.backgroundColor = [UIColor redColor];
[view addSubview:red];

CATransform3D rotation = CATransform3DIdentity;
rotation.m34  = -1.0/500.0;
// Since the anchorPoint is displaced from the center, the position will move with
// it, so we have to counteract it by translating the layer half its width.
rotation = CATransform3DTranslate(rotation, 50.f, 0, 0);
rotation = CATransform3DRotate(rotation, 50.0 * M_PI / 180, 0.0, 1.0, 0.0);
// We tell the anchorPoint to be on the right side of the layer (the anchor point
// position is specified between 0.0-1.0 for both axis).
red.layer.anchorPoint = CGPointMake(1.f, 0.5f);
red.layer.transform = rotation;
red.layer.zPosition = 200;
我得到的是你在上面看到的图像


希望有帮助

变换对象的帧的默认值保持不变。Frame是可以包含整个关联视图的最小未转换矩形,为什么它仍然不起作用?您真的需要沿z轴转换视图吗?@CodaFi,我认为将Frame与superview的边缘对齐不起作用,来自Apple:如果此属性不是身份转换,frame属性的值未定义,因此应该忽略。@marchinram那么文档是错误的<代码>帧在变换层时完全定义。见鬼,一些WWDC UIKit会话甚至有它的工作原理图(请参阅的UIKit渲染会话)@CodaFi它是定义的,但我认为它们意味着如果转换不是身份,你不能依赖它来定位,为了进行测试,我创建了一个50点宽的UIView,并将其完全按照上面的方法进行转换,之后边界宽度为50,帧宽度为32.139381。所以“未定义”这个词是错误的,但“框架”受变换的影响,而“边界”则不受影响,无论哪种方式,我都不认为可以用“框架”来解决Jack的问题