Cocoa+OpenGL编程(一):一个简单的例子

本文详细介绍了如何使用Xcode 4.2搭建OpenGL开发环境,包括创建项目、引入OpenGL库、设计界面、添加自定义视图类等步骤,并通过一个简单的Teapot绘制示例展示了如何与用户界面组件交互。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

工具: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


按 Ctrl+C 复制代码

 

七、建立连接

将应用程度中的各个对象之间建立连接,使它们能够相互通信。在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会同时更新。


 转自:http://www.cnblogs.com/liyropt/archive/2012/07/25/2608794.html

本书介绍了应用OpenGL开发三维图形的方法。内容包括:怎样利用Visual C 5.0 MFC中的类建立OpenGL应用程序的基本格式,建立和控制2D形状和3D形体、标准二次曲面、Bezier曲线及曲面、NURBS曲线及曲面、点光源、无限光源、聚光、基本材质、贴图材质、Mip贴图、位图字符、文字、OpenGL动画等,观察物体,操作像素、位图、图像,融合和反走样物体,雾化场景,利用帧缓存进行颜色屏蔽、深度控制、遮掩、全局场景反走样、景深模拟和场景对焦效果处理,利用对话框、菜单、鼠标选择物体、信息反馈实现OpenGL基本的交互图形程序设计。最后,本书通过6个实用例程说明如何将OpenGL的建模技术、图像处理技术和人机交互技术等3大技术进行结合。 本书涉及了所有的OpenGL核心函数和实用库函数,注重OpenGL的内存联系和实际运用。书中的每个工程文件模式固定且十分简洁,内容循序渐进。本书配有CD-ROM张,包含了书中所有源程序和18个工程文件所生成的可执行文件等内容,帮助读者学习。本书适合于具有基本计算机图形学基础知识及Visual C 5.0 MFC编程基础知识的计算机软件开 图书目录: 第1章 走进三维真彩世界 第2章 OpenGL概述 第3章 极小化OpenGL 第4章 绘制二维图形 第5章 OpenGL变换 第6章 显示列表 第7章 模拟真实世界 第8章 OpenGL动画 第9章 OpenGL图像处理基础 第10章 纹理贴图 第11章 增强图像效果 第12章 实用库函数 第13章 曲线和曲面 第14章 高级制作技术 第15章 交互技术 第16章 制作技术与应用实例 附录 配书CD-ROM内容介绍
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值