android openGl材料 我收集的值得下载Word文档格式.docx
《android openGl材料 我收集的值得下载Word文档格式.docx》由会员分享,可在线阅读,更多相关《android openGl材料 我收集的值得下载Word文档格式.docx(70页珍藏版)》请在冰豆网上搜索。
privateFloatBuffer[]normalsBuffers;
privateFloatBuffer[]slicesBuffers;
privatefloatyAngle;
privatefloatzAngle;
floatradius=1.3f;
publicBall()
{
slicesBuffers=newFloatBuffer[slices];
normalsBuffers=newFloatBuffer[slices];
for(inti=0;
i<
slices;
i++){
float[]vertexCoords=newfloat[6*(stacks+1)];
float[]normalCoords=newfloat[6*(stacks+1)];
doublealpha0=i*(2*Math.PI)/slices;
doublealpha1=(i+1)*(2*Math.PI)/slices;
floatcosAlpha0=(float)Math.cos(alpha0);
floatsinAlpha0=(float)Math.sin(alpha0);
floatcosAlpha1=(float)Math.cos(alpha1);
floatsinAlpha1=(float)Math.sin(alpha1);
for(intj=0;
j<
=stacks;
j++)
doublebeta=j*Math.PI/stacks-Math.PI/2;
floatcosBeta=(float)Math.cos(beta);
floatsinBeta=(float)Math.sin(beta);
setXYZ(vertexCoords,6*j,
radius*cosBeta*cosAlpha1,
radius*sinBeta,
radius*cosBeta*sinAlpha1);
setXYZ(vertexCoords,6*j+3,
radius*cosBeta*cosAlpha0,
radius*cosBeta*sinAlpha0);
setXYZ(normalCoords,6*j,
cosBeta*cosAlpha1,
sinBeta,
cosBeta*sinAlpha1);
setXYZ(normalCoords,6*j+3,
cosBeta*cosAlpha0,
cosBeta*sinAlpha0);
}
slicesBuffers[i]=FloatBuffer.wrap(vertexCoords);
normalsBuffers[i]=FloatBuffer.wrap(normalCoords);
publicvoidsetXYZ(float[]vector,intoffset,floatx,floaty,floatz){
vector[offset]=x;
vector[offset+1]=y;
vector[offset+2]=z;
publicvoiddraw(GL10gl)
gl.glLoadIdentity();
gl.glTranslatef(0.0f,0.0f,-7.0f);
gl.glColor4f(1.0f,0.2f,0.3f,1.0f);
gl.glRotatef(yAngle,1.0f,0.0f,0.0f);
gl.glRotatef(zAngle,0.0f,1.0f,0.0f);
gl.glVertexPointer(3,GL10.GL_FLOAT,0,slicesBuffers[i]);
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP,0,2*(stacks+1));
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
publicvoidsetyAngle(floatyAngle)
this.yAngle=yAngle;
publicvoidsetzAngle(floatzAngle)
this.zAngle=zAngle;
}
publicclassOval
privatefloat[]vertices=newfloat[720];
privateFloatBufferverBuffer;
publicOval()
//初始化圆形数据
720;
i+=2){
//x坐标
vertices[i]=(float)(Math.cos(DegToRad(i))*1);
//y坐标
vertices[i+1]=(float)(Math.sin(DegToRad(i))*1);
//设置圆形顶点数据
ByteBufferqbb=ByteBuffer.allocateDirect(vertices.length*4);
qbb.order(ByteOrder.nativeOrder());
verBuffer=qbb.asFloatBuffer();
verBuffer.put(vertices);
verBuffer.position(0);
publicfloatDegToRad(floatdeg)
return(float)(3.14159265358979323846*deg/180.0);
//重置投影矩阵
//移动操作,移入屏幕(Z轴)5个像素,x,y,z
gl.glTranslatef(0.0f,0.0f,-5.0f);
//旋转,angle,x,y,z
gl.glRotatef(yAngle,0.0f,1.0f,0.0f);
gl.glRotatef(zAngle,1.0f,0.0f,0.0f);
//设置当前色为红色,R,G,B,Alpha
gl.glColor4f(1.0f,0.1f,0.1f,1.0f);
//设置顶点类型为浮点坐标
gl.glVertexPointer(2,GL10.GL_FLOAT,0,verBuffer);
//打开顶点数组
//向OGL发送实际画图指令
gl.glDrawArrays(GL10.GL_TRIANGLE_FAN,0,360);
//画图结束
gl.glFinish();
这个是renderer类声明了Ball和Oval变量
publicclassGLRenderimplementsRenderer{
Ovalo=newOval();
Ballb=newBall();
//度到弧度的转换
@Override
publicvoidonDrawFrame(GL10gl){
gl.glClear(GL10.GL_COLOR_BUFFER_BIT|GL10.GL_DEPTH_BUFFER_BIT);
gl.glMatrixMode(GL10.GL_MODELVIEW);
gl.glEnable(GL10.GL_CULL_FACE);
gl.glLightModelx(GL10.GL_LIGHT_MODEL_TWO_SIDE,GL10.GL_FALSE);
//o.draw(gl);
<
spanstyle="
color:
#ff0000;
"
>
//------画圆<
/span>
b.draw(gl);
//------画球<
b.setyAngle(yAngle);
o.setyAngle(yAngle);
b.setzAngle(zAngle);
o.setzAngle(zAngle);
publicvoidonSurfaceChanged(GL10gl,intwidth,intheight){
if(height==0)height=1;
gl.glViewport(0,0,width,height);
gl.glMatrixMode(GL10.GL_PROJECTION);
GLU.gluPerspective(gl,45.0f,(float)width/(float)height,1.0f,100.0f);
publicvoidonSurfaceCreated(GL10gl,EGLConfigconfig){
gl.glShadeModel(GL10.GL_SMOOTH);
gl.glClearColor(0,0,0,0);
gl.glClearDepthf(1.0f);
gl.glEnable(GL10.GL_DEPTH_TEST);
gl.glDepthFunc(GL10.GL_LEQUAL);
gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT,GL10.GL_NICEST);
gl.glCullFace(GL10.GL_BACK);
gl.glEnable(GL10.GL_LIGHT0);
最后是GLSurfaceView类
publicclassMyGLSurfaceViewextendsGLSurfaceView
GLRendermyRenderer;
//自定义的渲染器
privatefinalfloatTOUCH_SCALE_FACTOR=180.0f/320;
//角度缩放比例
privatefloatmPreviousY;
//上次的触控位置Y坐标
privatefloatmPreviousX;
//上次的触控位置X坐标
floatyAngle=0;
//绕y轴旋转的角度
floatzAngle=0;
//绕z轴旋转的角度
publicMyGLSurfaceView(Contextcontext)
super(context);
myRenderer=newGLRender();
//创建渲染器
this.setRenderer(myRenderer);
//设置渲染器
this.setRenderMode(GLSurfaceView.RENDERMODE_CONTINUOUSLY);
//设置渲染模式
publicbooleanonTouchEvent(MotionEvente)
{//触摸事件的回调方法
floatx=e.getX();
//得到x坐标
floaty=e.getY();
//得到y坐标
switch(e.getAction())
caseMotionEvent.ACTION_MOVE:
//触控笔移动
floatdy=y-mPreviousY;
//计算触控笔Y位移
floatdx=x-mPreviousX;
//计算触控笔X位移
yAngle+=dx*TOUCH_SCALE_FACTOR;
//设置沿y轴旋转角度
zAngle+=dy*TOUCH_SCALE_FACTOR;
//设置沿z轴旋转角度
myRenderer.setyAngle(yAngle);
myRenderer.setzAngle(zAngle);
requestRender();
//重绘画面
mPreviousY=y;
//记录触控笔位置
mPreviousX=x;
returntrue;
//返回true
重写了ontouch事件通过xy计算出变化的角度可以让图形做简单的转动改一改就可以平动了
不过球因为没有做处理只是用单一颜色绘制的所以看起来和圆差不多可以加上颜色数组就比较明显了
本篇文章来源于Linux公社网站()原文链接:
Performance
业绩,效能
Identical
相同的
Scale规模
规模,尺寸,比例尺
Foundational基础
Manipulate操纵
Graphics图形
Geometry几何
Crossplatform跨平台
Capture捕捉
Compression压缩
Coordinates坐标
Square正方形
Android光学建模知识,有时间多看一下
【内容导航】
第1页:
第2页:
OpenGL概念建立
第3页:
WindowsNT环境下的OpenGL
第4页:
OpenGL基本程序结构
第5页:
OpenGL数据类型和函数名
第6页:
OpenGL辅助库的基本使用
第7页:
OpenGL建模
第8页:
OpenGL变换
第9页:
OpenGL颜色
第10页:
OpenGL光照
第11页:
位图和图像
第12页:
纹理映射
第13页:
复杂物体建模
第14页:
特殊光处理
第15页:
效果处理
第16页:
显示列表
3D绘图基本概念
发表于2011年05月30日由guidebee
前面介绍了使用Android编写OpenGLES应用的程序框架,本篇介绍3D绘图的一些基本构成要素,最终将实现一个多边形的绘制。
一个3D图形通常是由一些小的基本元素(顶点,边,面,多边形)构成,每个基本元素都可以单独来操作。
Vertex(顶点)
顶点是3D建模时用到的最小构成元素,顶点定义为两条或是多条边交会的地方。
在3D模型中一个顶点可以为多条边,面或是多边形所共享。
一个顶点也可以代表一个点光源或是Camera的位置。
下图中标识为黄色的点为一个顶点(Vertex)。
在Android系统中可以使用一个浮点数数组来定义一个顶点,浮点数数组通常放在一个Buffer(java.nio)中来提高性能。
比如:
下图中定义了四个顶点和对应的Android顶点定义:
1
2
3
4
5
6
privatefloatvertices[]={
-1.0f,
1.0f,0.0f,
//0,TopLeft
-1.0f,-1.0f,0.0f,
//1,BottomLeft
1.0f,-1.0f,0.0f,
//2,BottomRight
1.0f,
//3,TopRight
};
为了提高性能,通常将这些数组存放到java.io中定义的Buffer类中:
7
//afloatis4bytes,thereforewemultiplythe
//numberifverticeswith4.
ByteBuffervbb=ByteBuffer.allocateDirect(vertices.length*4);
vbb.order(ByteOrder.nativeOrder());
FloatBuffervertexBuffer=vbb.asFloatBuffer();
vertexBuffer.put(vertices);
vertexBuffer.position(0);
有了顶点的定义,下面一步就是如何将它们传给OpenGLES库,OpenGLES提供一个成为”管道Pipeline”的机制,这个管道定义了一些“开关”来控制OpenGLES支持的某些功能,缺省情况这些功能是关闭的,如果需要使用OpenGLES的这些功能,需要明确告知OpenGL“管道”打开所需功能。
因此对于我们的这个示例,需要告诉OpenGL库打开Vertexbuffer以便传入顶点坐标Buffer。
要注意的使用完某个功能之后,要关闭这个功能以免影响后续操作:
8
//Enabledthevertexbufferforwritingandtobeusedduringrendering.
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
//OpenGLdocs.
//Specifiesthelocationanddataformatofanarrayofvertex
//coordinatestousewhenrendering.
gl.glVertexPointer(3,GL10.GL_FLOAT,0,vertexBuffer);
//OpenGLdocs.
Whenyouaredonewiththebufferdon'
tforgettodisableit.
//Disabletheverticesbuffer.
gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
//OpenGLdocs.
Edge(边)
边定义为两个顶点之间的线段。
边是面和多边形的边界线。
在3D模型中,边可以被相邻的两个面或是多边形形共享。
对一个边做变换将影响边相接的所有顶点,面或多边形。
在OpenGL中,通常无需直接来定义一个边,而是通过顶点定义一个面,从而由面定义了其所对应的三条边。
可以通过修改边的两个顶点来更改一条边,下图黄色的线段代表一条边:
Face(面)
在OpenGLES中,面特指一个三角形,由三个顶点和三条边构成,对一个面所做的变化影响到连接面的所有顶点和边,面多边形。
下图黄色区域代表一个面。
定义面的顶点的顺序很重要在拼接曲面的时候,用来定义面的顶点的顺序非常重要,因为顶点的顺序定义了面的朝向(前向或是后向),为了获取绘制的高性能,一般情况不会绘制面的前面和后面,只绘制面的“前面”。
虽然“前面”“后面”的定义可以应人而易,但一般为所有的“前面”定义统一的顶点顺序(顺时针或是逆时针方向)。
下面代码设置逆时针方法为面的“前面”:
gl.glFrontFace(GL10.GL_CCW);
打开忽略“后面”设置:
gl.glEnable(GL10.GL_CULL_FACE);
明确指明“忽略“哪个面的代码如下:
gl.glCullFace(GL10.GL_BACK);
Polygon(多边形)
多边形由多个面(三角形)拼接而成,在三维空间上,多边形并一定表示这个Polygon在同一平面上。
这里我们使用缺省的逆时针方向代表面的“前面Front),下图黄色区域为一个多边形。
来看一个多边形的示例在Android系统如何使用顶点和buffer来定义,如下图定义了一个正方形: