Cocoa+OpenGL編程(一):一個簡單的例子


 

工具: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會同時更新。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM