工具:Xcode 4.2
開發環境:Cocoa,OpenGL,Objective-C
一、創建工程MyOpenGL
打開Xcode,選擇Create a new Xcode project, 然后在彈出地窗口中選擇 Cocoa Application, 下一步以后輸入工程的名字:MyOpenGL。
成功以后,Xcode窗口如下:
二、加入OpenGL,GLUT庫
點擊Xcode窗口左邊Project Navigator中的MyOpenGL,窗口中間會出現Project的信息,選擇Targets中的MyOpenGL,選擇右邊的Build Phase, 選擇Link Binary With Libraries,添加OpenGL和GLUT庫。
三、設計程序界面
點擊Xcode窗口左邊Project Navigator中的MyOpenGL上的下拉菜單,進入MyOpenGL目錄,點擊MainMenu.xib。點擊中間Objects欄的Window-MyOpenGL,會出現程序的主界面。
在Object library中選擇OpenGL View對象,雙擊或者將其拖到主界面中,調整成自己想要的大小。
同樣,選擇Horizantal Slider對象,放到界面中。選擇Text Field對象,放到界面中。
至此,可以編譯運行程序了。Product-》Build / Run。
四、設置對象屬性
點擊界面中的OpenGL View對象,在右邊的Inspector欄,選擇Attributes Inspector,設置Depth為24Bit,選擇Double Buffer。在Size Inspector欄,在Autosizing中選擇自己想要的對象大小調整方式。
同樣對Slider和Text Field設置Autosizing屬性。
這時重新編譯運行程序,就可以看到,當界面改變大小時,對象如何改變了。
五、添加MyOpenGLView類
File-》New File-》Objective-C Class-》輸入文件名:MyOpenGLView,類選擇NSObject。這時在Project Navigator中會出現兩個文件,分別為頭文件MyOpenGLView.h和主文件MyOpenGLView.m。編輯其內容如下:
其中size變量用來控制Teaport的大小。
// // MyOpenGLView.h // MyOpenGL // // Created by liyropt on 7/25/12. // Copyright (c) 2012 __MyCompanyName__. All rights reserved. // #import <Foundation/Foundation.h> #import <GLUT/GLUT.h> @interface MyOpenGLView : NSOpenGLView{ float size; } - (void)setSize:(float) s; @end
// // MyOpenGLView.m // MyOpenGL // // Created by liyropt on 7/25/12. // Copyright (c) 2012 __MyCompanyName__. All rights reserved. // #import "MyOpenGLView.h" @implementation MyOpenGLView - (id)initWithCoder:(NSCoder *)c { self = [super initWithCoder:c]; NSLog(@"prepare"); [self setSize:0.5]; // The GL Context must be active before you can use OpenGL functions NSOpenGLContext *glcontext = [self openGLContext]; [glcontext makeCurrentContext]; //Add your OpenGL init code here GLfloat mat_specular []={0.9, 0.3, 0.2, 1.0}; GLfloat mat_shininess []={50.0}; GLfloat light_position []={2.0, 4.0, -1.0, 0.0}; float white_light []={1.0, 1.0, 1.0, 1.0}; GLfloat lmodel_ambient []={0.1, 0.5, 0.8, 1.0}; glClearColor(0.0, 0.0, 0.0, 0.0); glShadeModel(GL_SMOOTH); glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular); glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess); glLightfv(GL_LIGHT0, GL_POSITION, light_position); glLightfv(GL_LIGHT0, GL_DIFFUSE, white_light); glLightfv(GL_LIGHT0, GL_SPECULAR, white_light); glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient); glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); glEnable(GL_DEPTH_TEST); glMatrixMode(GL_PROJECTION); glLoadIdentity(); // gluPerspective(90.0, 0.7, 0.0, 10.0); glRotatef(30, 0.0, 1.0, 0.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); return self; } - (void)reshape { NSLog(@"reshaping %f", size); //Get view dimensions NSRect baseRect = [self convertRectToBase:[self bounds]]; int w, h; w = baseRect.size.width; h = baseRect.size.height; //Add your OpenGL resize code here glViewport(0, 0, (GLsizei)w, (GLsizei)h); } - (void)drawRect:(NSRect)r { //Add your OpenGL drawing code here glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glColor3f(1.0, 0.0, 0.0); glutSolidTeapot(size); glutWireCube(size*2.0); //Signal that drawing is done - causes a buffer swap [[self openGLContext] flushBuffer]; } - (void)setSize:(float)s { size=s; } @end
六、添加MyController類
同樣,添加文件MyController,編輯其內容如下:
// // MyController.h // MyOpenGL // // Created by liyropt on 7/25/12. // Copyright (c) 2012 __MyCompanyName__. All rights reserved. // #import <Foundation/Foundation.h> #import "MyOpenGLView.h" @interface MyController : NSObject { IBOutlet MyOpenGLView *theView; IBOutlet id textField; } - (IBAction)doUpdate:(id)sender; @end
其中插座變量 *theView用於建立OpenGL View實例,textField用於設置Text Field對象顯示的內容。動作doUpdate用於響應Slider的滑動。
// // MyController.m // MyOpenGL // // Created by liyropt on 7/25/12. // Copyright (c) 2012 __MyCompanyName__. All rights reserved. // #import "MyController.h" @implementation MyController - (IBAction)doUpdate:(id)sender { NSLog(@"%f\n", [sender floatValue]); [theView setSize:[sender floatValue]]; [theView setNeedsDisplay:YES]; [textField setFloatValue:[sender floatValue]]; } @end
七、建立連接
將應用程度中的各個對象之間建立連接,使它們能夠相互通信。在Xcode中,建立連接的方法很簡單。
首先需要將類實例加入到Interface Builder中。點擊MainMenu.xib,在Objects Library中選擇Objects對象,雙擊。在Xcode中間的Objects欄中會出現Objects圖標,在Insecptor欄中修改其Class為MyOpenGLView類。
同樣,添加MyController類實例。
按住Control鍵,點擊Slider對象,移動鼠標到My Controller類實例,在彈出的對話框中選擇doUpdate動作。這樣,一旦Slider被滑動,doUpdate動作就會別激活。
同樣,建立從My Controller類實例到OpenGL View對象的連接,選擇插座變量 theView; 建立從My Controller類實例到TextField對象的連接,選擇插座變量 textField。
八、編譯運行,完成。
當滑動Slider時,OpenGL View和Text Field會同時更新。