




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
#132D與3D應用劉寧Email:liuning2@Android平臺提供了兩類動畫TweenAnimation補間動畫,即通過對場景里的對象不斷做圖像變換(平移、縮放、旋轉)產生動畫效果
FrameAnimation幀動畫,即順序播放事先做好的圖像,跟電影類似。類似GIFAndroid的動畫2Tween動畫通過對View的內容完成一系列的圖形變換(包括平移、縮放、旋轉、改變透明度)來實現動畫效果。具體來講,預先定義一組指令,這些指令指定了圖形變換的類型、觸發時間、持續時間。這些指令可以是以XML文件方式定義,也可以是以源代碼方式定義。程序沿著時間線執行這些指令就可以實現動畫效果。補間動畫簡介3動畫的進度使用Interpolator控制LinearInterpolator實現了勻速效果Accelerateinterpolator實現了加速效果DecelerateInterpolator實現了減速效果還可以定義自己的Interpolator子類,實現拋物線、自由落體等物理效果。補間動畫簡介4動畫的運行模式有兩種:獨占模式,即程序主線程進入一個循環,根據動畫指令不斷刷新屏幕,直到動畫結束;中斷模式,即有單獨一個線程對時間計數,每隔一定的時間向主線程發通知,主線程接到通知后更新屏幕;補間動畫簡介5圖形變換通過仿射矩陣實現。圖形變換是線性代數基本知識。簡單來說就是,每種變換都是一次矩陣運算。在Android中,Canvas類中包含當前矩陣,當調用Canvas.drawBitmap(bmp,x,y,Paint)繪制時,android會先把bmp做一次矩陣運算,然后將運算的結果顯示在Canvas上。這樣,編程人員只需不斷修改Canvas的矩陣并刷新屏幕,View里的對象就會不停的做圖形變換,動畫就形成了。補間動畫簡介6Animation類及其子類是動畫的核心模塊,它實現了各種動畫效果,如平移、縮放、旋轉、改變透明度等。Animation類及其子類7Animation類及其子類8Interpolator定義了動畫的變化速度,可以實現勻速、正加速、負加速Interpolator類及其子類9對于LinearInterpolator,變化率是個常數,即f(x)=x.Interpolator類及其子類10對于AccelerateInterpolator,開始變化很慢,然后逐漸變快,即f(x)=x*x或者f(x)=pow(x,2*mFactor)Interpolator類及其子類11AccelerateDecelerateInterpolator,變化率開始和結束都很慢,但中間很快,即f(x)=(cos((x+1)*PI)/2.0f)+0.5f.Interpolator類及其子類12Transformation記錄了仿射矩陣Matrix,動畫每觸發一次,會對原來的矩陣做一次運算,View的Bitmap與這個矩陣相乘就可實現相應的操作(旋轉、平移、縮放等)。Transformation類封裝了矩陣和alpha值,它有兩個重要的成員,一是mMatrix,二是mAlpha。Transformation類13view創建動畫對象,設置動畫屬性,調用invalidate刷新屏幕,啟動動畫;invalidate方法觸發了onDraw函數;在onDraw函數中:調用動畫的getTransformation方法,得到當前時間點的矩陣將該矩陣設置成Canvas的當前矩陣調用canvas的drawBitmap方法,繪制屏幕。判斷getTransformation的返回值,若為真,調用invalidate方法,刷新屏幕進入下一楨;若為假,說明動畫完成。View中對Animation的實現1415在xml文件中定義Animation在資源文件夾中創建xml文件/res/anim/anim.xml在代碼中通過AnimationUtil.load加載這個xml文件創建Animation對象再通過View.startAnimation開始動畫如何使用Animation?16或者通過代碼動態創建Animation對象位移,形變等Animation和Interpolator的使用,請自行查閱SDK當有多種Animation同時進行時,會用到AnimationSet如何使用Animation?17Android3D繪圖OpenGL(OpenGraphicsLibrary)定義了一個跨編程語言、跨平臺的程序接口規格,是一個性能卓越的三維圖形標準。為游戲和應用程序提供虛擬的景深,成為當今增強應用程序(尤其是游戲)真實感的重要手段之一。Android的軟件開發包提供了對OpenGLES的實現。OpenGL&OpenGLES19我們周圍的世界并不是二維的,而是一個帶有深度的三維空間。為游戲和應用程序提供虛擬的景深,成為當今增強應用程序(尤其是游戲)真實感的重要手段之一。Android的軟件開發包提供了對OpenGLES的實現。OpenGL&OpenGLES20在PC領域,3DAPI主要為OpenGL及DirectX,一般主流的游戲和顯卡均支持這兩種渲染方式。DirectX在Windows平臺上具有較大的優勢,但OpenGL卻具有更好的跨平臺性。OpenGL&OpenGLES21OpenGL(OpenGraphicsLibrary)定義了一個跨編程語言、跨平臺的程序接口規格,是一個性能卓越的三維圖形標準。是一個專業的圖形程序接口,是一個功能強大、調用當便的底層圖形庫。在專業高端繪圖領域,OpenGL比DirectX更有優勢。OpenGL&OpenGLES22OpenGLES(OpenGLforEmbeddedSystems)是專為內嵌和移動設備設計的一個2D/3D輕量圖形庫,它是基于OpenGLAPI設計的,是OpenGL三維圖形API的子集。基于OpenGL桌面標準,受到了所有主流移動平臺的支持,包括Android、WindowsMobile、Symbian、AppleiPhone等。OpenGL&OpenGLES2324OpenGLES是從OpenGL裁剪定制而來的,去除了四邊形(GL_QUADS)、多邊形(GL_POLYGONS)等復雜圖元等許多非絕對必要的特性。OpenGLES現主要有兩種版本:OpenGLES1.x針對固定管線硬件,OpenGLES2.x針對可編程管線硬件。OpenGL&OpenGLES25AndroidSDK2.1及以下版本,都只支持OpenGLES1.1(SDK完整支持OpenGLES1.0,但并不完整支持OpenGLES1.1)Android2.2對OpenGLES2.0進行支持。
OpenGL&OpenGLES26OpenGL是一個跨平臺的API,數據類型的大小會隨使用的編程語言以及處理器(64位,32位,16位)等的不同而不同,所以OpenGL定義了自己的數據類型。當傳遞數據到OpenGL時,使用這些OpenGL的數據類型,能保證傳遞數據的尺寸和精度正確。
數據類型27GLenum:用于GL枚舉的無符號整型。通常用于通知OpenGL由指針傳遞的存儲于數組中數據的類型(例如,GL_FLOAT用于指示數組由GLfloat組成)。GLboolean:用于單布爾值。OpenGLES還定義了其自己的“真”和“假”值(GL_TRUE和GL_FALSE)以避免平臺和語言的差別。當向OpenGL傳遞布爾值時,請使用這些值而不是使用YES或NO(盡管由于它們的定義實際沒有區別,即使你不小心使用了YES或NO。但是,使用GL-定義值是一個好的習慣。)GLbitfield:用于將多個布爾值(最多32個)打包到單個使用位操作變量的四字節整型。我們將在第一次使用位域變量時詳細介紹,請參閱wikipedia
GLbyte:有符號單字節整型,包含數值從-128到127GLshort:有符號雙字節整型,包含數值從?32,768到32,767數據類型28GLint:有符號四字節整型,包含數值從?2,147,483,648到2,147,483,647GLsizei:有符號四字節整型,用于代表數據的尺寸(字節),類似于C中的size_t
GLubyte:無符號單字節整型,包含數值從0到255。GLushort:無符號雙字節整型,包含數值從0到65,535GLuint:無符號四字節整型,包含數值從0到4,294,967,295GLfloat:四字節精度IEEE754-1985
浮點數GLclampf:這也是四字節精度浮點數,但OpenGL使用GLclampf特別表示數值為0.0到1.0GLvoid:void值用于指示一個函數沒有返回值,或沒有參數
GLfixed:定點數使用整型數存儲實數。由于大部分計算機處理器在處理整型數比處理浮點數快很多,這通常是對3D系統的優化方式。但因為iPhone具有用于浮點運算的矢量處理器,我們將不討論定點運算或GLfixed數據類型。
GLclampx:另一種定點型,用于使用定點運算來表示0.0到1.0之間的實數。正如GLfixed,我們不會討論或使用它。數據類型29頂點Vertex3D圖像的最小單位稱為點(point)或者頂點vertex
。它們代表三維空間中的一個點,并用來建造更復雜的物體。多邊形就是由點構成,而物體是由多個多邊形組成。盡管通常OpenGL支持多種多邊形,但OpenGLES只支持三邊形(即三角形)。
在OpenGL中你可以聲明少至二維坐標(X,Y),多至四維(X,Y,Z,W)。W軸是可選的,默認的值是1.0。Z軸也是可選的,默認為0。大多數情況下,都將用到3個主要的坐標(X,Y,Z),而W一般都是被用來作為占位符。基本術語30OpenGL坐標系:OpenGL屏幕中心的坐標值是X和Y軸上的0.0f點中心左邊的坐標值是負值右邊的是正值移向屏幕低端的是負值頂端的是正值移入屏幕深度的是負值移出的是正值基本術語31三角形Triangle三角形需要三個點才能創建。因此在OpenGL中,我們使用3個頂點來創建一個三角形。不像真實世界中的物體,OpenGL中的多邊形通常都不會有兩面。它們只有一面,被當做frontface(前面),三角形只有其frontface面對觀察者時才可見。可以設置OpenGL將多邊形作為兩面處理,但默認狀態下,三角形只有一個可見面。通過知道哪一個面是多邊形的前面或可見面,才能使OpenGL只做一半的計算,從而節省計算量。
基本術語32三角形Triangle通常情況下,三角形是一個大物體的一部分,其面對物體內部的一面永遠也不可見。不被繪制的一面稱為backface(背面),OpenGL是通過觀察頂點的繪制次序來確定frontface和backface的。以反時針次序繪制頂點的構成的面是frontface(默認,可以改變)。以順時針次序繪制頂點的構成的面是backface。基本術語33三角形Triangle下圖中,左邊青色的三角形是backface,因此將不可見。而右方的三角形是frontface,所以將被繪制。基本術語34多邊形Polygon多邊形是至少有3個連接著的點組成的一個對象。三角形也是一個多邊形。
圖元Primitives一個Primitive是一個三維的對象,使用三角形或者多邊形創建。基本術語35構造一個自己的Renderer類引入Renderer接口:創建一個GLRender類實現Renderer接口:
構建一個3D開發的基本框架import
android.opengl.GLSurfaceView.Renderer;public
classGLRenderimplementsRenderer{}36在GLRender類中實現以下3個抽象方法:當窗口被創建時需要調用onSurfaceCreat()
當窗口的大小改變時調用onSurfaceChanged()
而所有的繪圖操作都在onDrawFrame()方法中進行構建一個3D開發的基本框架public
voidonDrawFrame(GL10gl){}public
voidonSurfaceChanged(GL10gl,intwidth,intheight){}public
voidonSurfaceCreated(GL10gl,EGLConfigconfig){}37當窗口被創建時需要調用onSurfaceCreate,可以在這里對OpenGL做一些初始化工作,例如:
構建一個3D開發的基本框架//啟用陰影平滑gl.glShadeModel(GL10.GL_SMOOTH);//黑色背景四個參數分別是(r,g,b,alpha)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_FASTEST);38當窗口大小發生改變時系統將調用onSurfaceChange方法,可以在該方法中設置OpenGL場景大小,如:
為屏幕設置透視圖,使得越遠的物體開起來越小
構建一個3D開發的基本框架//設置OpenGL場景的大小四個參數分別是(x,y,width,height)gl.glViewport(0,0,width,height);//設置投影矩陣gl.glMatrixMode(GL10.GL_PROJECTION);//重置投影矩陣gl.glLoadIdentity();//設置視口的大小floatratio=(float)width/height;gl.glFrustumf(-ratio,ratio,-1,1,1,10);//選擇模型觀察矩陣gl.glMatrixMode(GL10.GL_MODELVIEW);//重置模型觀察矩陣gl.glLoadIdentity();39當需要執行繪制圖操作的時候調用onDrawFrame。繪圖前,需要將屏幕清除成前面所指定的顏色,清除嘗試緩存并且重置場景,如:構建一個3D開發的基本框架//清除屏幕和深度緩存gl.glClear(GL10.GL_COLOR_BUFFER_BIT|GL10.GL_DEPTH_BUFFER_BIT);//重置當前的模型觀察矩陣gl.glLoadIdentity();40最后只要調用GLSurfaceView類的setRenderer方法,將我們自己自己構建的GLRender類設置為默認Renderer,并通過setContentView方法使Activity顯示一個GLSurfaceView即可。構建一個3D開發的基本框架Rendererrender=newGLRender();/**Calledwhentheactivityisfirstcreated.*/@Overridepublic
voidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);GLSurfaceViewglView=newGLSurfaceView(this);glView.setRenderer(render);setContentView(glView);}41OpenGL中繪制的任何模型都會被分解為三角形和四邊形。有了之前介紹的框架,只需要在GLRender類的onDrawFrame的方法中添加與繪圖相關的繪制代碼即可。簡單繪圖42定義三角形頂點數組定義了一個怎樣的三角形?簡單繪圖-三角形int
one=0x10000;
//三角形三個頂點
privateIntBuffertriggerBuffer=IntBuffer.wrap(new
int[]{0,one,0,//上頂點
-one,-one,0,//左下點
one,-one,0,});//右下點;43重置當前模型的觀察矩陣清除虛擬世界中的一切旋轉,移動或其他變化并將觀察者置于原點開啟頂點設置功能簡單繪圖-三角形//重置當前的模型觀察矩陣gl.glLoadIdentity();//允許設置頂點gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);44設置頂點數據第二行是通知OpenGL清除以前的一切圖形并將其設為clear顏色。glClear()的兩個參數是什么意思?簡單地說,它們是存儲與位域中的常量。OpenGL保存了一系列緩存(buffers),即用于繪圖各方面的內存塊。將這兩個值進行邏輯或是通知OpenGL清除兩個不同的緩存–顏色緩存(colorbuffer)和深度緩存(depthbuffer)。顏色緩存保存當前幀各像素的顏色(基本等同于你在屏幕上看到的)。深度緩存保存每個潛在像素離觀察者距離的信息。簡單繪圖-三角形//定義背景顏色為灰色四個參數分別是什么?gl.glClearColor(0.7f,0.7f,0.7f,1f);//清除屏幕和深度緩存gl.glClear(GL10.GL_COLOR_BUFFER_BIT|GL10.GL_DEPTH_BUFFER_BIT);45設置頂點數據由于我們使用頂點數組,我們必須通知OpenGL頂點的數組在什么地方。頂點數組是一個C數組,每三個值代表一個頂點。簡單繪圖-三角形//設置三角形gl.glVertexPointer(3,GL10.GL_FIXED,0,triggerBuffer);//三角形三個頂點
privateIntBuffertriggerBuffer=IntBuffer.wrap(new
int[]{0,one,0,//上頂點
-one,-one,0,//左下點
one,-one,0,});//右下點;之前定義的頂點數組46設置頂點數據publicabstractvoidglVertexPointer(intsize,inttype,intstride,Bufferpointer)Size用于描述頂點的尺寸,由于本例中使用的是XYZ坐標系,所以這里是3Type描述了頂點的類型,由于本例中數據是固定的,所以使用了GL_FIXEDStride描述了步長
Pointer頂點緩存,即之前定義的頂點數組簡單繪圖-三角形//設置三角形gl.glVertexPointer(3,GL10.GL_FIXED,0,triggerBuffer);47通知OpenGL通過剛才提交的頂點數組來繪制三角形
publicabstractvoidglDrawArrays(intmode,intfirst,intcount)Mode描述了繪制的模式,使用GL_TRIANGLES來繪制三角形。盡管OpenGLES不支持繪制三角形之外的四邊形或其他多邊形,但它仍然支持一些其他繪圖模式,如繪制點,線,線回路,三角形條和三角形扇。
First開始位置Count要繪制的頂點數簡單繪圖-三角形//繪制三角形gl.glDrawArrays(GL10.GL_TRIANGLES,0,3);48禁止先前啟動了的特性以保證不會被其他地方的代碼弄混運行結果簡單繪圖-三角形//取消頂點設置gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);49OpenGLES并不支持四邊形。那如果你想畫菱形怎么辦?只能通過三角形來定義菱形——一個菱形可以通過兩個三角形構成。如何實現?創建兩個三角形頂點數組?簡單繪圖-四邊形//三角形三個頂點
private
IntBuffer
triggerBuffer=IntBuffer.wrap(new
int[]{0,one,0,//第一個三角形上頂點
-one,-one,0,//左下點
one,-one,0,//右下點;0,-3*one,0,//第二個三角形下頂點
-one,-one,0,//左上點
one,-one,0,});//右上點;50雖然以上方法確實可行,但是卻并不是最優的方案,并且還會重復保存頂點(以上方法共需要保存6個頂點,其中第一個三角形的左下、右下點與第二個三角形的左上、右上點重疊)。實際上我們可以使用trianglestrips(GL_TRIANGLE_STRIP)方法通過四個頂點來繪制正方形。簡單繪圖-四邊形51三角形條的基本概念:第一個三角形條是由前三個頂點構成(索引0,1,2)。第二個三角形條是由前一個三角形的兩個頂點加上數組中的下一個頂點構成,繼續直到整個數組結束。看下圖更清楚–第一個三角形由頂點1,2,3構成,下一個三角形由頂點2,3,4構成,等等:簡單繪圖-四邊形52所以,四邊形是這樣構成的:通過提交的頂點數組來繪制四邊形
簡單繪圖-四邊形//正方形的4個頂點
privateIntBufferquaterBuffer=IntBuffer.wrap(new
int[]{
one,one,0,
-one,one,0,
one,-one,0,
-one,-one,0});gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP,0,4);53著色有平滑著色、單調著色簡單繪圖-彩色渲染平滑著色單調著色54單調著色設置當前所使用的顏色設置了當前顏色之后的所繪制的所有顏色都使用當前顏色。簡單繪圖-彩色渲染//設置當前色為紅色
gl.glColor4f(1.0f,0.0f,0.0f,1.0f);55平滑著色OpenGLES允許將每個頂點使用的顏色置于一個顏色數組(colorarray)中。如果選擇使用顏色數組,那么需要為每個頂點設置顏色。
三個頂點,每個頂點四個值簡單繪圖-彩色渲染//三角形的頂點顏色值(r,g,b,a)
privateIntBuffercolorBuffer=IntBuffer.wrap(new
int[]{
one,0,0,one,0,one,0,one,0,0,one,one,});56平滑著色開啟顏色渲染功能為三角形設置定義好的顏色關閉顏色渲染功能簡單繪圖-彩色渲染//設置顏色數組gl.glEnableClientState(GL10.GL_COLOR_ARRAY);gl.glColorPointer(4,GL10.GL_FIXED,0,colorBuffer);gl.glDisableClientState(GL10.GL_COLOR_ARRAY);57繞某軸旋轉定義旋轉角度變量在onDrawFrame里設置旋轉publicabstractvoidglRotatef(floatangle,floatx,floaty,floatz)Angle定義了旋轉的角度
x,y,z共同決定了旋轉軸的方向改變旋轉角度簡單繪圖-旋轉float
rotate;gl.glRotatef(rotate,0.0f,1.0f,0.0f);
//繞y軸rotate
-=0.5f;58例:繪制一個四棱錐與繪制三角形相似,重點都在于構建頂點坐標構建頂點坐標時,需要按照逆時針的方向來繪制(WHY?按照順時針繪制會怎么樣?)簡單繪圖-3D空間59四棱錐由四個三角形組成簡單繪圖-3D空間
private
IntBuffer
triggerBuffer=IntBuffer.wrap(new
int[]{0,one,0,-one,-one,0,one,-one,one,0,one,0,one,-one,one,one,-one,-one,0,one,0,one,-one,-one,-one,-one,-one,0,one,0,-one,-one,-one,-one,-one,one});60使用循環把四個面都繪制出來簡單繪圖-3D空間//繪制四棱錐
for(inti=0;i<4;i++){gl.glDrawArrays(GL10.GL_TRIANGLE,i*3,3);}61OpenGLES中具有的兩種不同的視口類型。正交(orthogonal)透視(perspective)OpenGL---透視62正交視線永遠不會交匯而且物體不會改變其大小。沒有透視效果。
OpenGL---透視63透視
物體會隨著移遠而越來越小,視線會在物體移離觀察者時最終交匯。這是對真實視覺的模擬,人們就是以這種方式觀察世界的。OpenGL---透視64rightneartopOpenGL---透視65設置正交視口通過glOrthof()通知OpenGLES你希望使用正交視口OpenGL---透視
floatratio=_width/_height;//屏幕寬長比//orthographic:gl.glOrthof(-1,//left1,//right-1/ratio,//bottom1/ratio,//top0.01f,//near100.0f);//far設定視口空間的寬度為兩個單位,沿x軸從-1.0到+1.0。
定義空間的X和Y坐標的寬高比與視窗的寬高比(也就是全屏時的寬高比)一樣,確保視口的X和Y坐標遵循一樣的比例。
66near
參數:說明了視口開始的位置。如果我們站在原點處,視口就位于我們的面前,習慣上使用.01
或.001
作為正交視口的起點。使得視口處于原點“前方”一點點。
far描述觀察的深度,根據你程序的需要來設定。設置正交視口定義了near(遠)和far(近)范圍來描述觀察的深度。OpenGL---透視floatratio=_width/_height;//屏幕長寬比//orthographic:gl.glOrthof(-1,//left1,//right-1/ratio,//bottom1/ratio,//top0.01f,//near100.0f);//far67調用glOrthof()之后,我們使用視窗矩形來調用glViewport()。
切換了MatrixMode到GL10.GL_MODELVIEW,設置OpenGL接受關于改變model繪制方式的調用。
OpenGL---透視
gl.glViewport(0,0,(int)_width,(int)_height);68調用了glEnable()并使用參數GL10.GL_DEPTH_TEST。使OpenGLES檢查對象的z方向的順序。如果我們沒有enable它,我們將看到最后被繪制的對象一直顯示在最前面。這意味著,即使這個物體本來應該被更近更大的物體遮蓋,我們依然可以看到它。
OpenGL---透視
gl.glMatrixMode(GL10.GL_MODELVIEW);
gl.glEnable(GL10.GL_DEPTH_TEST);69設置透視視口隨著視線越來越遠,可以看到更廣闊的世界物體隨著遠離觀察者而變小使用透視時可見空間的形狀稱為錐臺(frustum)OpenGL---透視70視野(fieldofvision)
由兩個角度定義的:伸出雙臂手掌合攏伸向前方。你的手臂現在指向你自己錐臺的z軸。現在慢慢分開你的雙臂,定義了一個逐漸增大的角度。這就是用于定義觀察錐臺的兩個角度之一,它定義了視野的寬度。OpenGL---透視71視野(fieldofvision)
上下展開你的雙臂,定義了另一個角度。如果你的雙手間距只有三厘米,那么角度將非常小。這稱為窄視野。如果你雙手分開兩米,視野的寬度變得很大。這就是所謂寬視角(廣角)。OpenGL---透視72設置透視視口我們選擇一個中間值,45°。使用這個值,我們怎樣計算我們的觀察錐臺?想象一下,從頂部看錐臺是什么樣子。OpenGL---透視45°
下面是示意圖:
73設置透視視口正切函數定義為直角對邊與相鄰邊的比率。
錐臺遠端寬度的一半就是視野角度正切的一半。將此值乘以near值,就可以得到right值。
right值取反就是left。OpenGL---透視nearright(45/2)°right=near*tan(45/2)74設置透視視口通過glFrustumf()通知OpenGLES你希望使用正交視口OpenGL---透視
floatsize=0.01f*(float)Math.tan(Math.toRadians(45.0)/2);
floatratio=_width/_height;//屏幕長寬比//perspective:gl.glFrustumf(-size,//leftsize,//right
-size/ratio,//bottomsize/ratio,//top0.01f,//near100.0f);//farsize=near*tan(45/2),為左右視野的寬度定義空間的X和Y坐標的寬高比與視窗的寬高比(也就是全屏時的寬高比)一樣,確保視口的X和Y坐標遵循一樣的比例。
rightneartop75OpenGL---透視透視效果隨著幾何體遠離你,它們會變得越來越小,正像火車鐵軌一樣。正交效果第一個四棱錐后面的四棱錐完全被第一個擋住了。因為沒有透視,后面的各幾何體的形狀完全取決于其前方的物體。
76OpenGL在沒有設置光效的情況下仍然可以看見東西。它只是提供一種十分單調的整體光讓我們看到物體。但是如果不定義光效,物體看上去都很單調。OpenGL---光效77OpenGLES實際上定義了兩種shademodel,GL_FLAT
和GL_SMOOTH。
GL_FLAT將指定三角形上的每個像素都同等對待。多邊形上的每個像素都具有相同的顏色,陰影等。它的計算比每個像素按不同方法計算更為廉價,但是在這種方式下,物體看上去極為不真實。
OpenGL---光效78要使3D物體盡量真實,應該使用GL_SMOOTH
繪圖模式,它使用了一種平滑但較快速的陰影算法,稱為Gouraud算法。GL_SMOOTH是默認值。
OpenGL---光效79首先啟動光效。默認情況下,手工指定光效是被禁止的。通常情況下,光效只需在設定時啟動一次。不需要在繪圖開始前后打開和關閉。啟動光效后的效果:
OpenGL---光效//如果不啟用GL_LIGHTING光就什么都看不見gl.glEnable(GL10.GL_LIGHTING);80啟動了光效,但是沒有創建任何光源。除清除緩存用的灰色外,任何繪制的物體都被渲染成絕對的黑色。如果只對光源進行設置、定位甚至啟用,光源不會工作,除非啟用GL_LIGHTING。OpenGLES允許你創建8個光源。有一個常量對應于這些光源中的一個,常量為GL_LIGHT0
到GL_LIGHT7。可以任意組合這些光源中的五個。下面是“打開”第一個光源GL_LIGHT1的方法:OpenGL---光效gl.glEnable(GL10.GL_LIGHT1);//啟用一號光源81一旦啟動了光源,則必須設置光源的一些屬性。一般情況下,有三個不同的要素用來定義光源。光效三要素在OpenGLES中,光由三個元素組成:
環境元素(ambientcomponent)散射元素(diffusecomponent)高光元素(specularcomponent)OpenGL---光效82高光元素(specularcomponent)定義了光線直接照射并反射到觀察者從而形成了物體上的“熱點”或光澤。光點的大小取決于一些因素,但是如果你看到如上圖黃球所示一個區域明顯的光斑,那通常就是來自于一個或多個光源的高光部分。散射元素(diffusecomponent)定義了比較平均的定向光源,在物體面向光線的一面具有光澤。
環境光(ambientcomponent)沒有明顯的光源。其光線折射與許多物體,因此無法確定其來源。環境元素平均作用于場景中的所有物體的所有面。OpenGL---光效83環境光(ambient)光效中有越多的環境元素,就越不會產生引入注目的效果。場景中的總環境光效是由所有啟動光源的環境光組合在一起所決定的。如果你使用了
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 山東省棗莊達標名校2025年初三5月基礎測試數學試題含解析
- 上海市閔行區達標名校2024-2025學年初三5月學段考試語文試題含解析
- 鉛錠購銷合同
- 遼寧省撫順縣2018-2019學年八年級上學期期末模擬檢測物理試題【含答案】
- 信息技術專業服務承包合同
- 網約車平臺車牌照租賃合同范本
- 電子郵箱服務提供商合同
- 舞蹈常用術語
- 華貴大氣的牡丹動態模板
- 愛麗斯特元宵歡樂嘉年華活動策劃
- 智慧社區數字化教育方案
- 風力發電勞務施工合同
- 部編版歷史八年級下冊第四單元 第14課《海峽兩岸的交往》說課稿
- GB/T 30595-2024建筑保溫用擠塑聚苯板(XPS)系統材料
- 《中華人民共和國突發事件應對法》知識培訓
- 《智能家居系統》課件
- 胖東來企業文化指導手冊
- 注射相關感染預防與控制(全文)
- 古詩閱讀賞析泊船瓜洲
- 熔斷器安裝施工方案
- 中深層無干擾地熱供熱系統應用技術規程
評論
0/150
提交評論