我正在将基于C ++的引擎从Android移植到iOS,我对iOS设备上的横向模式如何工作有一些疑问。
我可以在横向模式下成功启动设备,但无论我如何旋转(或强制旋转),我的帧缓冲都会保持纵向模式。例如,我希望分辨率为960x640而不是默认的320x480。
我一直在研究它,我看到有些人这样做但是使用OpenGL明确地旋转场景,这意味着实际的轴不是横向模式,对我来说这是一个丑陋的解决方法。
答案 0 :(得分:5)
确保您的OpenGL UIView附加到UIViewController,而不是直接插入UIWindow。为此,请创建自定义视图控制器:
@interface MyViewController : UIViewController
@end
@implementation MyViewController
- (void)loadView {
// Create your EAGL view
MyEAGLView *eaglView = [[MyEAGLView alloc] initWithFrame:CGRectMake(0, 0, 0, 0)];
self.view = eaglView;
[eaglView release];
}
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
return YES;
}
@end
然后通过AppDelegate将其添加到您应用的窗口中:
- (void)applicationDidFinishLaunching:(UIApplication *)application {
MyViewController *viewController = [[MyViewController alloc] init];
[self.window setRootViewController:viewController];
[viewController release];
[self.window makeKeyAndVisible];
}
self.window只是应用程序的UIWindow,如果您将窗口存储在其他位置,则可能需要更改它。
之后,UIViewController会在设备转动时处理旋转并调整视图大小,您可以覆盖MyEAGLView对象中的layoutSubviews方法来处理调整OpenGL上下文的大小。您可能还想查看Apple的OpenGL应用程序示例代码,因为它正确处理了这些内容。
答案 1 :(得分:0)
您可以按如下方式在顶点着色器中旋转OpenGL输出:
#version 300 es
in vec4 position;
in mediump vec4 texturecoordinate;
in vec4 color;
uniform float preferredRotation;
out mediump vec2 coordinate;
void main()
{
//const float pi = 4.0 * atan(1.0);
//float radians = (( -90.0 ) / 180.0 * pi );
// Preferred rotation of video acquired, for example, by:
// AVAssetTrack *videoTrack = [tracks objectAtIndex:0];
// CGAffineTransform preferredTransform = [videoTrack preferredTransform];
// self.glKitView.preferredRotation = -1 * atan2(preferredTransform.b, preferredTransform.a);
// Preferred rotation for both portrait and landscape
mat4 rotationMatrix = mat4( cos(preferredRotation), -sin(preferredRotation), 0.0, 0.0,
sin(preferredRotation), cos(preferredRotation), 0.0, 0.0,
0.0, 0.0, 1.0, 0.0,
0.0, 0.0, 0.0, 1.0);
// Mirror vertical (portrait only)
mat4 rotationMatrix = mat4( cos(preferredRotation), sin(preferredRotation), 0.0, 0.0,
-sin(preferredRotation), cos(preferredRotation), 0.0, 0.0,
0.0, 0.0, 1.0, 0.0,
0.0, 0.0, 0.0, 1.0);
// Mirror horizontal (landscape only)
mat4 rotationMatrix = mat4( 1.0, 0.0, 0.0, 0.0,
0.0, cos(preferredRotation), -sin(preferredRotation), 0.0,
0.0, sin(preferredRotation), cos(preferredRotation), 0.0,
0.0, 0.0, 0.0, 1.0);
// Mirror vertical (landscape only)
mat4 rotationMatrix = mat4( cos(preferredRotation), 0.0, sin(preferredRotation), 0.0,
0.0, 1.0, 0.0, 0.0,
-sin(preferredRotation), 0.0, cos(preferredRotation), 0.0,
0.0, 0.0, 0.0, 1.0);
gl_Position = position * rotationMatrix;
coordinate = texturecoordinate.xy;
}
显然,您只选择一个矩阵4,具体取决于方向 视频,然后它的旋转。每个矩阵4翻转视频 窗口 - 不旋转它。对于轮换,你必须先选择 matrix4基于方向,然后替换 preferredRotation变量的度数(以弧度为单位) 其公式也提供了。)
有很多方法可以旋转视图,图层,对象等;但是,如果 你是通过OpenGL渲染图像,那么你应该选择它 方法,只有这种方法。