OpenGL ES中的自定义视图转换

时间:2008-11-21 19:24:47

标签: iphone animation opengl-es

我正在尝试创建自定义转换,以替代您在此处获得的默认转换,例如:

[self.navigationController pushViewController:someController animated:YES];

我准备了一个基于OpenGL的视图,它对映射到平面的一些静态纹理执行效果(假设它是Core Animation中翻转效果的副本)。我不知道该怎么办:

  • 抓取当前视图内容并从中创建纹理(我记得看到一个功能就是这样,但找不到它)
  • 如何对当前屏幕外的视图执行相同操作并将替换当前视图
  • 是否有一些我可以挂钩的API,以使我的转换类尽可能本地化(使其成为一种核心动画效果)?

非常感谢任何想法或链接!

更新

Jeffrey Forbes的答案非常适合捕捉视图内容的解决方案。

我还没想到的是如何捕获我想要转换到的视图的内容,在转换完成之前该视图应该是不可见的。

另外,我应该使用哪种方法来呈现OpenGL视图? 出于演示目的,我使用了pushViewController。这会影响导航栏,但实际上我想用动画回一个项目,请查看此视频以获得解释:

http://vimeo.com/4649397

另一个选择是使用presentViewController,但显示全屏。 你认为创建另一个窗口(或视图吗?)可能有用吗?

4 个答案:

答案 0 :(得分:3)

虽然我没有对自己进行更多的研究而无法完全回答你的问题,但我可以帮助一下:

- 为了获取UINavigationController的视图,您需要截取屏幕截图。最简单的方法是将其抓入UIImage:

UIGraphicsBeginImageContext(self.view.frame.size);
[[self.view layer] renderInContext:UIGraphicsGetCurrentContext()];
UIImage* test = UIGraphicsGetImageFromCurrentImageContext();
UIImageView* view = [[UIImageView alloc] initWithImage:test];
UIGraphicsEndImageContext();

我不确定你是否可以将GLContext(手机上不熟悉)渲染成CGImage,但我会做那样的事情(并从中初始化UIImage)。我会预渲染你想要做的动画的每一帧,并使用其中提供的动画内容将其拍成UIImageView。也就是说,如果你的动画足够简单。否则,它可能归结为编写自己的动画功能: - /

答案 1 :(得分:3)

我刚刚组建了一个过渡类,用于在OpenGL ES中实现自己的过渡动画。

随时阅读here

项目中有两个示例转换,您可以随意添加它。

答案 2 :(得分:1)

我认为您可能想到的功能是http://www.opengl.org/sdk/docs/man/xhtml/glCopyTexImage2D.xml ...您将视口设置为纹理大小然后照常绘制,然后执行glCopyTexImage2D将场景复制到纹理上。

或者您应该查看FrameBuffer对象。 XCode中的默认OpenGL模板使用这些。只需生成示例项目,看看它们是如何工作的。

答案 3 :(得分:0)

我最近在像你这样的视图控制器之间写了一些过渡动画。如果您想从隐形视图中获取任何额外信息,可以尝试延迟转换,如下所示:

- (void)animationFromModalView:(UIView *)modalView toMasterView:(UIView *)masterView
{

[masterView setNeedsLayout];
[masterView layoutIfNeeded];

[self performSelector:@selector(delayAnimationFromModalViewToMasterView) withObject:nil afterDelay:.1f];
}