freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

三維虛擬場景中三維虛擬儀表程序設(shè)計(jì)終稿畢業(yè)論文-資料下載頁

2025-06-28 12:37本頁面
  

【正文】 setDataType(GLenum)圖像像素個(gè)分量的數(shù)據(jù)類型,例如:GL_BYTEImage對象圖像數(shù)據(jù)的內(nèi)容二維紋理要求圖像的寬度和高度必須是2的冪次方,單位是紋素。如果圖像大小不符合此要求,Texture2D類內(nèi)部將自動(dòng)重新采樣,調(diào)整紋理圖像的大小,但是也會(huì)因此耗費(fèi)一定的時(shí)間和系統(tǒng)資源。(2) 一維紋理。一維紋理要求紋理寬度為2 的冪次方,一維紋理的OSG屬性類Texture1D如表55所示。表55 一維紋理的OSG屬性類Texture1DOSG的成員方法描述Texture1D對象紋理的類型標(biāo)識由Image對象的明細(xì)層次決定紋理數(shù)據(jù)分辨率的明細(xì)層次Texture::setInternalFormat(GLint)紋素中的數(shù)據(jù)分量個(gè)數(shù),取值14的整數(shù)或者其他枚舉常量Texture1D::setTextureWidth(int)紋理的寬度Texture::setBorderWidth(GLint)紋理邊框的厚度Image::setPixelFormat(GLenum)圖像像素的表達(dá)格式,例如GL_RGBAImage::setDataType(GLenum)圖像像素個(gè)分量的數(shù)據(jù)類型,例如:GL_BYTEImage對象一維圖像數(shù)據(jù)的內(nèi)容(3) 三維紋理。它最常用于醫(yī)學(xué)和地質(zhì)學(xué)方面,可以用來表達(dá)醫(yī)學(xué)CT圖像或者巖層的狀態(tài)。可以講它理解為多層二維子紋理所構(gòu)成的一個(gè)立方體,而其中的每一個(gè)紋素此時(shí)稱為一個(gè)體素。三維紋理會(huì)耗費(fèi)大量的系統(tǒng)資源。用于設(shè)置三維問題的OSG屬性類Texture3D如表56所示。表56 三維紋理的設(shè)置OSG成員方法描述Texture3D對象紋理的類型標(biāo)識由Image對象的明細(xì)層次決定紋理數(shù)據(jù)分辨率的明細(xì)層次Texture::setInternalFormat(GLint)紋素中的數(shù)據(jù)分量個(gè)數(shù),取值14的整數(shù)或者其他枚舉常量Texture3D::setTextureWidth(int)紋理的寬度Texture3D::setTextureHeight(int)紋理的高度Texture3D:: setTextureDepth(int)紋理的深度Texture::setBorderWidth(GLint)紋理邊框的厚度Image::setPixelFormat(GLenum)圖像像素的表達(dá)格式,例如GL_RGBAImage::setDataType(GLenum)圖像像素個(gè)分量的數(shù)據(jù)類型,例如:GL_BYTE三維紋理要求紋理的寬度、高度和深度均為2 的冪次方個(gè)紋素。(4)二維紋理數(shù)組,它是一種較為特殊的紋理類型,它和三維紋理的概念上無本質(zhì)上的區(qū)別;osg::Texture2DArray類的成員函數(shù)與Texture3D也別無二致。這種類型的紋理主要用于OpenGL著色語言(GLSL)程序中二維紋理數(shù)組對象的表達(dá)。(5)立方圖紋理,它是一種新的紋理映射表達(dá)方式,它使用6個(gè)二維圖像來表達(dá)一個(gè)立方體的6個(gè)面,而S/T/R坐標(biāo)軸的遠(yuǎn)的為這個(gè)立方體的中心點(diǎn)。立方圖紋理主要用于反射貼圖或環(huán)境貼圖的表達(dá),例如對于場景中天空景象的渲染。(6)矩形紋理。在OpenGL中的傳統(tǒng)紋理類型先知了圖像的尺寸必須是2的冪次方,而矩形紋理則取消了這一限制,它支持任意尺寸的二維圖像作為紋理。 不受到“2的冪次方”限制的圖像成為NPOTS紋理,它避免了傳統(tǒng)二維紋理對于任意尺寸圖像的重新采樣過程,并且可以節(jié)省更多的系統(tǒng)空間;但是NPOTS紋理不支持Mipmap的過濾,對于紋理邊界截取方式的設(shè)置也只有GL_CLAMP、GL_CLAMP_TO_EDGE和GL_CLAMP_TO_BORDER3中。 OSG中使用TextureRectangle類表達(dá)這種紋理類型,其功能函數(shù)與Texture2D相同。 三維虛擬儀表的繪制 三維虛擬儀表背景模板的繪制 繪制背景模板的流程圖如圖54所示。圖 54 背景模板繪制流程圖圖55 osg::ShapeDrawable的繼承關(guān)系圖圖56 osg::TessellationHints的繼承關(guān)系圖 其中TessellationHints類是用來設(shè)置圖元的精度,而ShapeDrawable類是用來繪制三維虛擬儀表背景模板的一種方法,新建一個(gè)shape,在其方法成員中,新建一個(gè)Box,在Box的方法成員中,設(shè)置中心為(,),其后緊接著的是分別為該背景模板的長、寬、高;最后ShapeDrawable的成員是獲取精度,關(guān)鍵代碼如下:……osg::ref_ptrosg::TessellationHints hints = new osg::TessellationHints。osg::ref_ptrosg::ShapeDrawable shape = new osg::ShapeDrawable(new osg::Box(osg::Vec3(, , ), ,),())?!?然后將shape加載到幾何節(jié)點(diǎn)geode中去,這樣一個(gè)沒有任何光澤的扁平長方體平板就畫好了,運(yùn)行效果如圖57所示。圖57 運(yùn)行效果圖然后我們需要對其進(jìn)行設(shè)置材質(zhì),顏色、紋理等等。設(shè)置材質(zhì)我們要用到Material類,它的繼承關(guān)系如圖58所示。圖58 osg::Material關(guān)系繼承圖設(shè)置顏色則比較簡單,我們只需建立一個(gè)顏色數(shù)組即可,然后對長方體的每個(gè)頂點(diǎn)設(shè)置它的顏色就行了。設(shè)置紋理則相對復(fù)雜些,它需要讀入一張圖片,這張圖片則是我們要設(shè)置的紋理,并且需要用到texture2D類和StateSet類。其繼承關(guān)系分別如圖59,510所示。圖59 osg::Texture2D關(guān)系繼承圖圖510 osg::StateSet類的繼承關(guān)系圖 在OSG中,osg::Texture紋理的通用類的基本定義如表57所示。表57 osg::Texture2D類的基本定義Texture2D默認(rèn)構(gòu)造函數(shù)Texture2D(Image*Image)構(gòu)造函數(shù)。以一個(gè)2D紋理的圖片源作為輸入?yún)?shù)void setImage(Image*Image)Image* getImage()設(shè)置/獲取該2D紋理的輸入圖片源對象void setTextureWidth(int width)void setTextureHeight(int Height)設(shè)置2D紋理圖像的大小 通過該表我們可以找到設(shè)置紋理的方法,再通過顏色的設(shè)置,就可以設(shè)置好背景模板的紋理,關(guān)鍵實(shí)現(xiàn)代碼如下:……//設(shè)置顏色 shapesetColor(osg::Vec4(,))。 //設(shè)置材質(zhì) materialsetAmbient(osg::Material::FRONT_AND_BACK,osg::Vec4f(,))。 materialsetDiffuse(osg::Material::FRONT_AND_BACK,osg::Vec4f(,))。 materialsetSpecular(osg::Material::FRONT_AND_BACK,osg::Vec4f(,))。 materialsetShininess(osg::Material::FRONT_AND_BACK,)。 //設(shè)置紋理image=osgDB::readImageFile(Image/)。//獲取一張紋理圖片 if(()) { texture2DsetImage(())。 } geodegetOrCreateStateSet()setAttributeAndModes((),osg::StateAttribute::ON)。 geodegetOrCreateStateSet()setMode(GL_BLEND,osg::StateAttribute::ON)。 geodegetOrCreateStateSet()setMode(GL_DEPTH_TEST,osg::StateAttribute::ON)。 geodegetOrCreateStateSet()setTextureAttributeAndModes(0,(),osg::StateAttribute::ON)?!ㄟ^這些類以及代碼的實(shí)現(xiàn)我們就能繪制出這個(gè)真實(shí)富有色彩的三維虛擬儀表的背景模板——扁平長方體平板了,這個(gè)平板不僅富有真實(shí)感,有棱有角,好看,還能朝著不同的方向轉(zhuǎn)動(dòng)和從各個(gè)不同的角度觀看以及放大和縮小,運(yùn)行效果如圖511所示。圖511 運(yùn)行效果圖 三維虛擬儀表刻度表的繪制 繪制刻度表的流程圖如圖512所示。在現(xiàn)實(shí)生活中的三維虛擬儀表都是一個(gè)類似于鐘表的表盤,只不過指針指向的刻度不僅僅是時(shí)間,還可以是速度或其它數(shù)據(jù)的大小,所以我們需要畫一個(gè)外圓,外圓內(nèi)側(cè)則是度量刻度,它代表速度的值,中心則是畫一根可以轉(zhuǎn)動(dòng)的指針,由于繪制三維虛擬儀表刻度表相對復(fù)雜一些,于是可以在主函數(shù)main()外建立一個(gè)函數(shù)createFace()來繪制三維虛擬儀表的刻度表,這樣做會(huì)使主函數(shù)的功能更加清晰、明朗。在函數(shù)里面,我們先畫三維虛擬儀表刻度表的外圓,然后再畫外圓里面的度量刻度,最后畫指針。首先也是通過osg::ref_ptrosg::Geode geode = new osg::Geode新建一個(gè)幾何節(jié)點(diǎn),畫圓的思路是先畫出101個(gè)頂點(diǎn),然后將這101個(gè)頂點(diǎn)用線連接起來就圍成一個(gè)圓,101個(gè)頂點(diǎn)相當(dāng)于把這個(gè)圓平均分成100份,所以就要初始化一個(gè)頂點(diǎn)數(shù)組Vertices,數(shù)組里面包括101個(gè)頂點(diǎn),即:osg::ref_ptrosg::Vec3Array vertices = new osg::Vec3Array(101)。然后 再對第一個(gè)頂點(diǎn)進(jìn)行初始化,再利用for循環(huán)通過依次增加的角度來繪出其余100個(gè)頂點(diǎn),最后通過PrimitiveSet類設(shè)置頂點(diǎn)的關(guān)聯(lián)方式就能畫好一個(gè)圓。PrimitiveSet類的繼承關(guān)系如圖513所示。圖512 繪制刻度表的流程圖圖513 osg::PrimitiveSet類的繼承關(guān)系圖在OSG中使用PrimitiveSet類來表達(dá)圖元組的信息,如果沒有設(shè)置任何圖元組,幾何體對象將無法正常工作,圖元組是用于實(shí)現(xiàn)頂點(diǎn)索引機(jī)制,將頂點(diǎn)數(shù)據(jù)有序地構(gòu)成不同幾何形狀的重要方式。PrimitiveSet類按照與OpenGL相似的方式,定義了10種圖元類型,用于構(gòu)成任意復(fù)雜程度的,由點(diǎn)、線以及多邊形面片組成的物體,如表58所示。表58 PrimitiveSet類的定義圖元類型對應(yīng)OpenGL圖元描述POINTSGL_ POINTS繪制用戶指定的所有頂點(diǎn)LINESGL_ LINES繪制直線。直線的起點(diǎn)、終點(diǎn)由數(shù)組中先后相鄰的兩個(gè)點(diǎn)決定;用戶提供的點(diǎn)不止兩個(gè)時(shí),將嘗試?yán)^續(xù)繪制新的直線LINES_STRIPGL_ LINES_STRIP繪制多段直線條帶。多段直線的第一段由數(shù)組中的前兩個(gè)點(diǎn)決定;其余段的起點(diǎn)位置為上一段的終點(diǎn)坐標(biāo),而終點(diǎn)位置由數(shù)組中隨后的點(diǎn)決定LINES_LOOPGL_ LINES_LOOP繪制封閉直線。繪圖方式與多段直線相同,但是最后將自動(dòng)封閉該直線TRIANGLESGL_ TRIANGLES繪制三角形。三角形的3個(gè)頂點(diǎn)由數(shù)組中相鄰的3個(gè)點(diǎn)決定,并按照逆時(shí)針的順序進(jìn)行繪制;用戶提供的點(diǎn)不止3個(gè)時(shí),將嘗試?yán)^續(xù)繪制新的三角形TRIANGLE_ STRIPGL_ TRIANGLE_ STRIP繪制多段三角形條帶。第一段三角形的3個(gè)頂點(diǎn)由數(shù)組中的前3個(gè)點(diǎn)決定;其余三角形的繪制,其始邊由上一段三角形的后兩個(gè)點(diǎn)決定 續(xù)表TRIANGLE_FANGL_ TRIANGLE_FAN繪制三角形面。第一段三角形的3個(gè)頂點(diǎn)由數(shù)組中的前3個(gè)點(diǎn)決定,其余段三角形的繪制,起始邊由整個(gè)數(shù)組的第一點(diǎn)和上一段三角形的最后一個(gè)點(diǎn)決定,第三點(diǎn)由數(shù)組中隨后的一點(diǎn)決定QUADSGL_ QUADS繪制四邊形。四邊形的4個(gè)頂點(diǎn)由數(shù)組中的相鄰4個(gè)點(diǎn)決定,并按照逆時(shí)針的順序進(jìn)行繪制;用戶提供的點(diǎn)不止4個(gè)時(shí),將嘗試?yán)^續(xù)繪制新的四邊形QUADS_ STRIPGL_ QUADS_ STRIP繪制多段四邊形條帶。第一段四邊形的起始邊由數(shù)組中的前兩個(gè)點(diǎn)決定,邊的矢量方向由這兩點(diǎn)的延伸方向決定;起始邊的對邊由其后的兩個(gè)點(diǎn)決定,如果起始邊和對邊的矢量方向不同,那么四邊形將會(huì)扭曲;其余段四邊形的繪制,起始邊由上一段決定,其對邊由隨后的兩點(diǎn)及其延伸方向決定POLYGONGL_POLYGON繪制任意多邊形,根據(jù)用戶提供的頂點(diǎn)的數(shù)量繪制凸多邊形 根據(jù)這個(gè)表我們就知道該用LINES_STRIP這種方法繪制多段直線條帶,即繪制外圓,然后定義一個(gè)角度angle,使之變化到對應(yīng)的角度,在對應(yīng)的地方繪制頂點(diǎn),關(guān)鍵實(shí)現(xiàn)代碼如下: ……osg::ref_ptrosg::Vec3Array vertices = new osg::Vec3Array(101)。//定義一個(gè)頂點(diǎn)數(shù)組,共個(gè) (*vertices)[0].set( , , )。//初始化第一個(gè)頂點(diǎn)在(,)處//依次繪制剩下的100個(gè)頂點(diǎn) for ( unsigned int i=1。 i=100。 ++i ) { float angle = (float)i * osg::PI / 。 (*vertices)[i].set( radius * cosf(angle), , radius * sinf(angle)+5 )。 }…… 就這樣我們就畫好了外圓,畫好外圓后,我們就琢磨著畫圓里面的刻度了,實(shí)際生活中的儀表刻度類似于一條條線段,所以畫度量刻度可以用一條條短的線段表示,然后再設(shè)置線寬就能比較真實(shí)地反映出刻度。我們通過for循環(huán),每循環(huán)一次都建立一個(gè)geometry
點(diǎn)擊復(fù)制文檔內(nèi)容
數(shù)學(xué)相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1