`

3D - 建立3D界面(下)

 
阅读更多
Phone开发 - 3D - 建立3D界面(下)
     前面主要写了iPhone开发的一些基本知识,有iPhone设备的介绍,iPhoneSDK开发的流程和文件的组成等,下面就据上部分介绍EAGL文件的内容:EAGLView.h和EAGLView.m文件.
     EAGLView类的主要功能是完成UIView到EAGL的3D接口,并且渲染一个旋转的彩色矩形.
首先完成3D接口必须导入OpenGLES.framework,
#import <OpenGLES/EAGL.h>
#import <OpenGLES/ES1/gl.h>
#import <OpenGLES/ES1/glext.h>
#import <OpenGLES/EAGLDrawable.h>   
#import <QuartzCore/QuartzCore.h>

     然后必须重载以下函数:


    + (Class)layerClass;

 

    - (void)layoutSubviews;

 

     下面是函数内容:

 

// You must implement this
+ (Class)layerClass {
return [CAEAGLLayer class];
}
- (void)layoutSubviews {
[EAGLContext setCurrentContext:context];
[self destroyFramebuffer];
[self createFramebuffer];
[self drawView];
}
     另外还使用到了两重要函数:

    - (BOOL) createFramebuffer;// 创建桢缓冲区

    - (void) destroyFramebuffer;// 销毁桢缓冲区


         下面是函数内容:

- (BOOL)createFramebuffer {
glGenFramebuffersOES(1, &viewFramebuffer);
glGenRenderbuffersOES(1, &viewRenderbuffer);

glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer);
glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer);
[context renderbufferStorage:GL_RENDERBUFFER_OES fromDrawable:(CAEAGLLayer*)self.layer];
glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, viewRenderbuffer);

glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_WIDTH_OES, &backingWidth);
glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_HEIGHT_OES, &backingHeight);

if (USE_DEPTH_BUFFER) {
glGenRenderbuffersOES(1, &depthRenderbuffer);
glBindRenderbufferOES(GL_RENDERBUFFER_OES, depthRenderbuffer);
glRenderbufferStorageOES(GL_RENDERBUFFER_OES, GL_DEPTH_COMPONENT16_OES, backingWidth, backingHeight);
glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES, GL_RENDERBUFFER_OES, depthRenderbuffer);
}

if(glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES) != GL_FRAMEBUFFER_COMPLETE_OES) {
NSLog(@"failed to make complete framebuffer object %x", glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES));
return NO;
}

return YES;
}

- (void)destroyFramebuffer {
glDeleteFramebuffersOES(1, &viewFramebuffer);
viewFramebuffer = 0;
glDeleteRenderbuffersOES(1, &viewRenderbuffer);
viewRenderbuffer = 0;

if(depthRenderbuffer) {
glDeleteRenderbuffersOES(1, &depthRenderbuffer);
depthRenderbuffer = 0;
}
}

另外,我们还忘了初始化是怎么弄的,EAGLView文件内容是存在了nib文件里面,所以我们用:initWithCode初始化如下:

//The GL view is stored in the nib file. When it's unarchived it's sent -initWithCoder:

- (id)initWithCoder:(NSCoder*)coder {

if ((self = [super initWithCoder:coder])) { // 重载

// Get the layer

CAEAGLLayer *eaglLayer = (CAEAGLLayer *)self.layer;

 

eaglLayer.opaque = YES; // 显示设置不透明

// 属性:(缓存颜色格式:kEAGLColorFormatRGBA8)

eaglLayer.drawableProperties = [NSDictionary dictionaryWithObjectsAndKeys:

  [NSNumber numberWithBool:NO], kEAGLDrawablePropertyRetainedBacking, kEAGLColorFormatRGBA8, kEAGLDrawablePropertyColorFormat, nil];

// 调用initWithAPI初始化 EAGLContext *context;

context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES1];

// 设为当前画布

if (!context || ![EAGLContext setCurrentContext:context]) {

[self release];

return nil;

}

// 时间间隔

animationInterval = 1.0 / 60.0;

}

return self;

}

 

最终,我们要描绘一个彩色的方块:

使用到函数 : - (void)drawView;

 

- (void)drawView {

// Replace the implementation of this method to do your own custom drawing

const GLfloat squareVertices[] = { //顶点数据

-0.5f, -0.5f,

0.5f,  -0.5f,

-0.5f0.5f,

0.5f,   0.5f,

};

const GLubyte squareColors[] = { // 颜色数据

255, 255,   0, 255,

0,   255, 255, 255,

0,     0,   0,   0,

255,   0, 255, 255,

};

// 设为当前画布

[EAGLContext setCurrentContext:context];

// 绑定桢缓冲区

glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer);

// 设置视图窗口大小

glViewport(0, 0, backingWidth, backingHeight);

// 投影变换

glMatrixMode(GL_PROJECTION);

glLoadIdentity(); // 设置为单位矩阵

glOrthof(-1.0f, 1.0f, -1.5f, 1.5f, -1.0f, 1.0f); //正投影,创建一个正交平行的可视空间

glMatrixMode(GL_MODELVIEW); // 模型变换

glRotatef(3.0f, 0.0f, 0.0f, 1.0f); // 围绕x轴旋转

 

glClearColor(0.5f, 0.5f, 0.5f, 1.0f); // 清屏颜色

glClear(GL_COLOR_BUFFER_BIT); // 清除颜色缓冲区

 

glVertexPointer(2, GL_FLOAT, 0, squareVertices); // 指定顶点数据指针

glEnableClientState(GL_VERTEX_ARRAY); // 开启顶点数组

glColorPointer(4, GL_UNSIGNED_BYTE, 0, squareColors); // 指定颜色数据数组指针

glEnableClientState(GL_COLOR_ARRAY); // 开启颜色数组

 

glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); // 解引用一个数组元素序列,描绘

 

// 绑定到渲染缓冲区

glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer);

[context presentRenderbuffer:GL_RENDERBUFFER_OES]; // 渲染到设备

}

 

到此从建立接口到显示就这样完成了,另外在动态渲染的时候用到了一个定时器NSTimer,以下是它的方法:(这里不详细介绍)

- (void)startAnimation {

self.animationTimer = [NSTimer scheduledTimerWithTimeInterval:animationInterval target:self selector:@selector(drawView) userInfo:nil repeats:YES];

}

- (void)stopAnimation {

self.animationTimer = nil;

}

- (void)setAnimationTimer:(NSTimer *)newTimer {

[animationTimer invalidate];

animationTimer = newTimer;

}

- (void)setAnimationInterval:(NSTimeInterval)interval {

 

animationInterval = interval;

if (animationTimer) {

[self stopAnimation];

[self startAnimation];

}

}

 

在以后文章里面会建立一个EAGLView类,它的功能只是建立UIView到EAGL的接口,所以以后需要3D视图的类都可以通过继承它来完成,就像一个接口一样使用,这次就写到这.有的地方还不够详细,以后碰到了再介绍...(待续)

 

分享到:
评论

相关推荐

    grav3d-gui_gravityinversion_python_zip.zip

    在Python编程环境中,有一款名为grav3d-gui的图形用户界面(GUI)工具,专门用于实现这一功能。这个软件包的核心是用Python编写的源码,能够帮助科学家和工程师便捷地处理重力数据并进行三维反演。 首先,我们需要...

    FLOW-3D-v11-1-user-manual_难得的FLOW-3D原版手册_flow_flow3dv11user_flow

    VOF方法能精确地模拟液体与气体之间的界面运动,无论是平静的水面还是剧烈的波涛,都能得到准确的仿真结果。此外,手册还会介绍如何设置和操作VOF模型,以及如何处理相关的边界条件。 另一个重要的知识点是FLOW-3D...

    基于UG的3D-CAPP系统装配工艺设计模块的设计及研究

    上海光华印刷机械有限公司基于UG的3D-CAPP系统装配工艺设计模块的研发项目正是在这种背景下展开的。 #### 三、UG OPEN API与二次开发 UG(Unigraphics)是一款强大的三维设计软件,提供了丰富的开放应用程序接口...

    smartfoxserver2x-- unity3d--官方案例(1)

    在Unity3D中,我们通常会使用SmartFoxServer2X提供的API来建立和管理连接。连接器负责登录、注册、发送和接收数据包,以及处理断线重连等问题。确保网络通信的稳定性和效率是游戏体验的关键。 最后,"Lobby"可能...

    3D-GIS地理信息系统项目实施及目标.docx

    ### 3D-GIS地理信息系统项目实施及目标 #### 一、项目预期目标 1. **建立三维GIS平台** - 目标:构建一个集成了海域与陆地信息的三维可视化地理信息平台。 - 描述:通过该平台,可以实现对地理信息的三维展示与...

    最新武汉理工大学-deform-3d-实验报告.docx

    - 使用DEFORM-3D/Preprocessor建立圆柱体镦粗模拟分析模型。 - 对模型进行求解计算。 - 后处理分析,测量镦粗后的尺寸变化、应变分布等。 - **参数设定**: - 毛坯尺寸:底面半径60mm,高度200mm。 - 材料:...

    3D-PressCAD-三維教學

    1. **3D料帶功能**:通過使用"3DM"指令,用戶可以調用3D料帶繪制主界面,從二維視圖轉換到三維視圖(西南等轴测)。進一步使用"3DS"將線框模型轉換成實體填充,"3DX"則將三維視圖反轉回二維視圖,實現從三維到二維的...

    Blender_3D-_Noob_to_Pro_-_Beginner_Tutorials

    无论你是完全的新手还是有一定基础的用户,这些教程都能帮助你从零开始,逐步建立起全面的Blender技能。通过实践练习,学员将能够独立创建3D模型,制作动画,并进行专业级别的渲染。 #### 二、课程结构与内容 教程...

    FLOW-3D_Cast_3.2_Manual.pdf

    - **FLOW-3D Cast** 是一款专为铸造行业设计的图形用户界面软件,它基于 FLOW-3D 流体流动仿真软件。 - 该软件提供了一个直观且易于使用的界面,用于定义、运行和后期处理铸造仿真任务。 - 用户通过一个统一的用户...

    工业地图-产品原型-界面设计后.zip

    在界面设计中,logo的设计和放置位置对于品牌形象的建立至关重要,它能传达公司的核心价值和产品特性。 "css"文件夹通常包含CSS(层叠样式表)文件,这些文件负责定义HTML元素的外观和布局,如颜色、字体、大小、...

    GO Map - 3D Map for AR Gaming3.4.1

    高度可定制的经典Unity检查器界面GO Map是最简单的地图插件。选择各种各样的例子,以充分了解GO地图功能,并建立每一个演示场景在您的智能手机上只要几次点击就可以使用真正的GPS位置.若要商用,请前往Unity官方资源...

    基于SolidWorks挤压成形液压机侧液压缸3D-CAD系统研制.pdf

    综上所述,本文展示了一套系统研制的方法论,即利用现有的3D设计和数据库技术,通过软件二次开发,建立一个针对特定领域(液压机侧液压缸)设计的专用CAD系统。通过这样的方法,可以显著提升设计质量和效率,降低...

    Jikeng.zip_FLAC3D 5.0_FLAC3D基坑建模及各工况运算代码_flac3D

    建模过程包括定义网格、设置材料参数、加载初始应力、以及设定开挖过程等步骤,这些都可以通过FLAC3D的用户友好的图形界面或脚本语言实现。 在工况运算代码方面,本套资料提供了针对不同工况的计算程序。工况可能...

    Unity3D 界面插件 NGUI

    Unity3D 界面插件 NGUI Unity3D 界面插件 NGUI 是 Unity3D 游戏引擎中的一个热门插件,可以帮助开发者快速创建游戏中的用户界面。下面是 NGUI 的基础应用知识点: 一、创建界面 * 创建一个新场景,并删除场景里...

    Java 图形界面开发--图文并茂建立学生管理系统.rar

    在这个"Java 图形界面开发--图文并茂建立学生管理系统"的教程中,我们将深入探讨如何利用Java语言构建一个直观且功能丰富的学生管理系统。 首先,我们需要了解Java中的图形用户界面(GUI)库。Java Swing和JavaFX是...

    Quest3D中文教程-经典版

    在入门阶段,介绍了Quest3D的基本安装步骤、范例场景以及用户界面等基础知识,这些都是学习Quest3D的必要步骤。特别的是,教程中特别强调了“信道”模块的重要性,它是建立Quest3D项目的核心。 信道模块是Quest3D中...

    Pro_Java_6_3D_Game_Development_Table-of-Contents

    ### Pro Java 6 3D Game Development:Java 3D, JOGL, ...通过阅读本书并实践其中的示例代码,读者将能够建立起坚实的Java 3D游戏开发基础,并掌握使用Java 3D API、JOGL、JInput 和 JOAL等API进行游戏开发的核心技能。

    孙书伟-FLAC3D在岩土工程中的应用

    由于其强大的计算能力和直观的可视化界面,FLAC3D在岩土工程、采矿工程、隧道工程等领域得到了广泛的应用。 #### 二、FLAC3D在岩土工程中的应用背景 岩土工程涉及到地质条件复杂的施工环境,如地下空间开挖、边坡...

Global site tag (gtag.js) - Google Analytics