当前位置:  编程技术>移动开发
本页文章导读:
    ▪OpenGL超级宝典札记6        OpenGL超级宝典笔记6第十章 曲线和表面          学习通过对控制点和结点序列进行调整,创建弯曲和皱折的表面,并学习通过几个较小的表面和更容易处理的NURBS或Bezier表面来组成复杂的.........
    ▪ pushViewController/presentModalViewController/addSubView差异及使用方法        pushViewController/presentModalViewController/addSubView区别及使用方法 1. 用UINavigationController的时候用pushViewController:animated ----返回之前的视图[[self navigationController] popViewControllerAnimated:YES]; ---ps:push以.........
    ▪ 播音开机自启动       广播开机自启动通过广播来实现开机启动activity 1.      创建activity 2.      创建广播 3.      在清单文件中注册 具体实现: 1、界面Activity:SayHello.java      package com.ghstudio.BootStartDem.........

[1]OpenGL超级宝典札记6
    来源: 互联网  发布时间: 2014-02-18
OpenGL超级宝典笔记6

第十章 曲线和表面

         学习通过对控制点和结点序列进行调整,创建弯曲和皱折的表面,并学习通过几个较小的表面和更容易处理的NURBS或Bezier表面来组成复杂的表面。还有,学习只用几个指定边界的点来绘制复杂的表面、形状和模式,还学习使用GLU函数库的分格器对象把凹形区域以及中间有洞的区域分解为更为简单的凸形图元。

a)  内部支持的表面 OpenGL所附带的工具函数库(GLU)包含了一些函数,它们可以渲染3种二次方程表面。这些二次方程函数可以渲染球体、圆柱体和圆盘。球体:void gluSphere(GLUQuadricObj *obj, GLdouble radius, Glint slices, Glint stacks);//后两个参数分别表示球体的片(slice)和栈(stack)。圆柱体:void gluCylinder(GLUquadricObj *obj, GLdouble baseRadius, GLdouble topRadius, GLdouble height, Glint slices, GLstacks);// 当topRadius参数为0,从而形成一个圆锥体。圆盘:void gluDisk(GLUquadricObj *, GLdouble innerRadius, GLdouble outerRadius, GLint slices, Glint loops);//内半径为0时,表示一个实心的圆盘,不为0则是有洞的圆盘。

b)  Bezier曲线和表面这是一种简单的数学模型,仅仅指定几个控制点就可以表示曲线和表面。控制点:曲线是有一组控制点来表示,这些控制点影响着曲线的形状。对Bezier曲线而言,第一个控制点和最后一个控制点实际上是曲线的一部分,其他控制点的作用就像是磁铁,把曲线拉向它们。求值器evaluate:需要制定控制点以及参数方程中u和v参数的定义域。然后,通过调用适当的求值函数,OpenGL可以生成组成曲线或表面的点。

c)  NURBS 随着添加的控制点越来越多,创建一条具有良好连续性的曲线将变得非常困难,通过NURBS函数获得更高层次的控制。NURBS的真正威力在于我们可以对一条曲线的任一特定片段的4个控制点所施加的影响进行调整,以产生所需要的平滑性,这种调整是通过一系列的称为结点knot的值进行的。

d)  创建NURBS表面首先创建一个NURBS对象,这样在调用NURBS相关函数对曲线或表面的外观进行修改时就可以引用它。gluNewNurbsRender函数为NURB创建一个渲染器,gluDeleteNurbsRenderer则用于销毁这个渲染器。定义表面:一个控制点数组和结点序列传递给gluNurbsSurface函数,这个函数位于一对gluBeginSurface/gluEndSurface之间。修剪:在NURBS表面上创建删除部分。在一对gluBeginSurface/gluEndSurface之间,调用gluBeginTrim函数,用gluPwlCurve函数指定一条修剪曲线,然后用gluEndTrim函数完成曲线的修剪。

e)  分格化(tessellation)为了使OpenGL的速度尽可能快,所有的几何图元都必须是凸的。但是许多情况是凹或者是更为复杂,有洞的多边形。为将该形状分解为更容易管理的三角形。分格器回调函数:void gluTessCallback(GLUTesselator *tobj, GLenum which, void (*fn)());第一个参数是分格器对象,第二个参数指定被注册的回调函数的类型,最后一个参数是个指向回调函数本身的指针。

 

第十一章 这就是管线:更快的几何图形渲染

                  这章讨论了提高几何图形吞吐量的几种不同方法,使用索引数组、显示列表和顶点数组等方法。还学习如何使用顶点缓冲区对象实现最大限度的性能优化,既有显示列表的速度优势,又具有顶点数组的极大灵活性。

         a)显示列表为了提高性能,运用预批处理的方法,使它们能够快速复制到命令缓冲区,以获得更快的执行速度,这种预编译的命令集称为显示列表。

         b)顶点数组创建一些数组,存储模型所使用的顶点数据,从而大大地节省计算时间。步骤:加载几何图形,启用数组,读取数据,用数据绘图。

         c)索引顶点数组就是并不按顺序从头遍历到尾的顶点数组,它的访问顺序是由一个单独的索引数组指定。可以节省内存,并减少变换开销。

         d)顶点缓冲区对象当使用顶点数组时,可以把单个的数组从客户内存传输到图形硬件,此特性称为顶点缓冲区对象,允许我们按照与加载和管理纹理相似的方式使用和管理顶点数组数据。步骤:使用顶点数组,然后创建缓冲区对象,方式与创建纹理对象相似。


    
[2] pushViewController/presentModalViewController/addSubView差异及使用方法
    来源: 互联网  发布时间: 2014-02-18
pushViewController/presentModalViewController/addSubView区别及使用方法
1. 用UINavigationController的时候用pushViewController:animated
----返回之前的视图[[self navigationController] popViewControllerAnimated:YES];
---ps:push以后会在navigation的left bar自动添加back按钮,它的响应方法就是返回。所以一般不需要写返回方法,点back按钮即可。
2. 其他时候用presentModalViewController:animated
 [self presentModalViewController:controller animated:YES];//YES有动画效果
-----返回之前的视图    [self dismissModalViewControllerAnimated:YES];  
3. 切换视图一般用不到addSubview
UINavigationController是导航控制器,如果pushViewController的话,会跳转到下一个ViewController,点返回会回到现在这个ViewController;
如果是addSubview的话,其实还是对当前的ViewController操作,只是在当前视图上面又“盖”住了一层视图,其实原来的画面在下面呢,看不到而已。(当然,也可以用insertSubView atIndex那个方法设置放置的层次)。




另加一个

使用presentModalViewControllerAnimated方法从A->B->C,若想在C中直接返回A,则可这样实现:

C中返回事件:

  • void back  
  • {  
  •       [self dismissModalViewControllerAnimated:NO];//注意一定是NO!!  
  •       [[NSNotificationCenter  defaultCenter]postNotificationName:@"backback" object:nil];  
  • }

    然后在B中,

  • //在viewdidload中:  
  • [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(back) name:@"backback" object:nil];  
  •   
  • -(void)back  
  • {  
  •      [self dismissModalViewControllerAnimated:YES];  
  • }  


  •     
    [3] 播音开机自启动
        来源: 互联网  发布时间: 2014-02-18
    广播开机自启动

    通过广播来实现开机启动activity

    1.      创建activity

    2.      创建广播

    3.      在清单文件中注册

    具体实现:

    1、界面Activity:SayHello.java

         package com.ghstudio.BootStartDemo;

         import android.app.Activity;

         import android.os.Bundle;

         import android.widget.TextView;

         public class SayHello extends Activity {

         @Override

         public void onCreate(Bundle savedInstanceState) {

         super.onCreate(savedInstanceState);

         TextView tv = new TextView(this);

         tv.setText("Hello. I started!");

         setContentView(tv);

         }

         }

    2、接收广播消息:BootBroadcastReceiver.java

         package com.ghstudio.BootStartDemo;

         import android.content.BroadcastReceiver;

         import android.content.Context;

         import android.content.Intent;

         public class BootBroadcastReceiver extends BroadcastReceiver {

         static final String ACTION = "android.intent.action.BOOT_COMPLETED";

         @Override

         public void onReceive(Context context, Intent intent) {

         if (intent.getAction().equals(ACTION)){

         Intent sayHelloIntent=new Intent(context,SayHello.class);

        sayHelloIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

         context.startActivity(sayHelloIntent);

         }

    }

         }

    3、配置文件:AndroidManifest.xml

         <?xml version="1.0" encoding="utf-8"?>

         <manifest xmlns:android="http://schemas.android.com/apk/res/android"

        package="com.ghstudio.BootStartDemo"

         android:versionCode="1"

         android:versionName="1.0">

         <application android:icon="@drawable/icon" android:label="@string/app_name">

         <activity android:name=".SayHello"

        android:label="@string/app_name">

         <intent-filter>

         <action android:name="android.intent.action.MAIN" />

         <category android:name="android.intent.category.LAUNCHER" />

         </intent-filter>

         </activity>

         <receiver android:name=".BootBroadcastReceiver">

         <intent-filter>

         <action android:name="android.intent.action.BOOT_COMPLETED" />

         <category android:name="android.intent.category.DEFAULT"/>

         </intent-filter>

         </receiver>

         </application>

         <uses-sdk android:minSdkVersion="3" />

         <uses-permission

    android:name="android.permission.RECEIVE_BOOT_COMPLETED"></uses-permission>

         </manifest>

    4、完成后,编译出apk 包,安装到模拟器或手机中。关机,重新开机。


        
    最新技术文章:
    ▪Android开发之登录验证实例教程
    ▪Android开发之注册登录方法示例
    ▪Android获取手机SIM卡运营商信息的方法
    ▪Android实现将已发送的短信写入短信数据库的...
    ▪Android发送短信功能代码
    ▪Android根据电话号码获得联系人头像实例代码
    ▪Android中GPS定位的用法实例
    ▪Android实现退出时关闭所有Activity的方法
    ▪Android实现文件的分割和组装
    ▪Android录音应用实例教程
    ▪Android双击返回键退出程序的实现方法
    ▪Android实现侦听电池状态显示、电量及充电动...
    ▪Android获取当前已连接的wifi信号强度的方法
    ▪Android实现动态显示或隐藏密码输入框的内容
    ▪根据USER-AGENT判断手机类型并跳转到相应的app...
    ▪Android Touch事件分发过程详解
    ▪Android中实现为TextView添加多个可点击的文本
    ▪Android程序设计之AIDL实例详解
    ▪Android显式启动与隐式启动Activity的区别介绍
    ▪Android按钮单击事件的四种常用写法总结
    ▪Android消息处理机制Looper和Handler详解
    ▪Android实现Back功能代码片段总结
    ▪Android实用的代码片段 常用代码总结
    ▪Android实现弹出键盘的方法
    ▪Android中通过view方式获取当前Activity的屏幕截...
    ▪Android提高之自定义Menu(TabMenu)实现方法
    ▪Android提高之多方向抽屉实现方法
    ▪Android提高之MediaPlayer播放网络音频的实现方法...
    ▪Android提高之MediaPlayer播放网络视频的实现方法...
    ▪Android提高之手游转电视游戏的模拟操控
     


    站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3