2013-04-23 80 views
1

我知道屏幕的左上角(假設手機左側橫向)是(0,0)。但是,如果我想讓我的(0,0)點成爲左下角而不是左上角,那我該怎麼做?手動旋轉橫向模式左側的座標系

我想在指定位置使用OpenGL繪製對象,我當前正在屏幕上觸摸,但y值正在屏幕的錯誤一側繪製。下面是一個問題的例子,如果它有幫助。請注意,白點是我觸摸屏幕的地方,紫色是我使用OpenGL繪製的粒子系統。

https://www.dropbox.com/s/n2lhzfdbp4audi2/iOS%20Simulator%20Screen%20shot%20Apr%2023%2C%202013%206.25.49%20PM.png

https://www.dropbox.com/s/foueopvlgfu03vs/iOS%20Simulator%20Screen%20shot%20Apr%2023%2C%202013%206.25.53%20PM.png

設置我支持的接口是這樣的:

- (NSUInteger)application:(UIApplication*)application supportedInterfaceOrientationsForWindow:(UIWindow*)window 
{ 
    return UIInterfaceOrientationMaskAllButUpsideDown; 
} 

- (NSUInteger)supportedInterfaceOrientations 
{ 
    return UIInterfaceOrientationMaskLandscapeLeft; 
} 

在我drawFrame方法:

glViewport(0, 0, 480, 320); 

glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 

glOrthof(0.0f, 480, 0.0f, 320, -100.0f, 100.0f); 

glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 

//render the particles being drawn, etc 

在我touchesBegan方法:

UITouch *touch = [[event allTouches] anyObject]; 
CGPoint location = [touch locationInView:touch.view]; 

if (pe.active != YES) 
{ 
    pe.active = YES; 

    NSLog(@"x: %f y: %f", location.x, location.y); 

    pe.sourcePosition = Vector2fMake(location.x, location.y); 
} 

然後我試圖手動通過在我的viewWillAppear方法這樣做90度旋轉座標系:

self.view.transform = CGAffineTransformIdentity; 
self.view.transform = CGAffineTransformMakeRotation((M_PI * (-90)/180.0)); 
self.view.bounds = CGRectMake(0.0, 0.0, 480, 320); 

指定CGAffineTransformMakeRotation呼叫與如上所示-90度應改變的座標系統,但它沒有。

任何幫助,非常感謝。

+0

我沒有看到任何OpenGL。繪圖時更改座標系。 – 2013-04-23 23:30:30

+0

我編輯了我的問題並添加了圖片以更好地解釋我的問題,謝謝。 – coderz 2013-04-24 01:33:34

回答

-1

通常,您應該避免設置VC的視圖框架,邊界和變換。這些都是由UIKit自動設置的,用於處理旋轉和調整大小(例如用於通話狀態欄)。

有兩個簡單的修正:

  • 將觸碰點(location.x, height-location.y
  • 使用的投影矩陣(glOrthof(0, width, height, 0, ...))左上原點。您可能不得不擔心座標系的旋向。

我現在更喜歡第二個選項:當使用盡可能少的座標系時,事情會少得多。

其他的一些小問題

  • 你應該用實際的寬度和高度,而不是硬編碼320和480。記住要檢查的「視網膜」和「視網膜4英寸」爲好。
  • self.view.transform = CGAffineTransformIdentity;由於您立即用寫入來破壞它是毫無意義的。在下一行。

如果你真的需要設置視圖的變換,使其成爲VC的看法的子視圖。另請注意,如果您設置了變換,某些視圖無法正常工作(例如,某些版本的iOS上的UITableView使用其框架來決定應該使用其邊界的寬度單元格的寬度)。它的情況並不少見需要這樣一個視圖結構:

  • 外容器(其幀/變換例如通過UIKit中設置)
    • 內膽(這是你設置的轉換)
      • 的您關心的實際視圖(例如UITableView)您沒有設置其變換。

不用說了,我會盡量避免這種只要有可能。

+0

完美的解決方案!我把你的建議換成了glorthof,效果很好,不敢相信我錯過了。是的,硬編碼的320和480只是因爲我很匆忙,但我肯定會改變它。謝謝一堆 – coderz 2013-04-24 06:08:51