PV3D-2.構(gòu)建你的第一個應(yīng)用_第1頁
PV3D-2.構(gòu)建你的第一個應(yīng)用_第2頁
PV3D-2.構(gòu)建你的第一個應(yīng)用_第3頁
PV3D-2.構(gòu)建你的第一個應(yīng)用_第4頁
PV3D-2.構(gòu)建你的第一個應(yīng)用_第5頁
已閱讀5頁,還剩28頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

.構(gòu)建你的第一個應(yīng)用本章,我們將開始著手寫第一行代碼.那些剛進入oop的程序者可以從本章的oop簡單介紹開始.如果感謝閱讀已經(jīng)很熟悉oop,可以跳過此段繼續(xù)學(xué)習(xí)Papervision3D里的3D場景.明了后,我們可以開始寫第一個基本感謝閱讀工程!部分工程將被封裝成默認的類,以后我們都會用到這些類.感謝閱讀本章包含以下內(nèi)容:面向類及對象編程介紹熟悉文檔類/主程序文件Papervision3D的3D組織的基礎(chǔ)構(gòu)建你第一個工程為書中的實例做準備面向類及對象編程介紹本書中,我們將著重使用Papervision3D類庫.我們將寫出用于Flash,FlexBuilder,FlashBuilder中的謝謝閱讀類.若你是FlashIDE的開發(fā)者,這可能是你第一次寫自己的類.面向?qū)ο蟮木幊淌潜緯闹匾糠?本書給出感謝閱讀了一些簡短的介紹.若你已經(jīng)很熟悉Flex,flash的oop編程,你可以直接閱讀本章中的Papervision3D里的精品文檔放心下載3D基本場景.若你是面向?qū)ο蟮男率忠膊槐靥珦?dān)心—本書僅用到了面向?qū)ο蟮幕A(chǔ).學(xué)習(xí)使用PaperVision3D進行精品文檔放心下載面向?qū)ο缶幊炭梢宰屇銓︻惛煜げ⑶铱赡芴岣吣銓γ嫦驅(qū)ο缶幊痰呐d趣.謝謝閱讀.什么是類?實際上,他們只是一些的函數(shù)(方法)和變量(屬性)組織在一個單獨文件中,這被稱為類的定義.謝謝閱讀一個類是創(chuàng)建新對象的設(shè)計.聽起來有些模糊?其實你一直都在使用類.從FlashAPI里創(chuàng)建的每個Object都基于類.如感謝閱讀Sprite,MovieClip,及TextField這些對象可能你都用過.實際上這些都是類.這些對象的設(shè)計及他們的類都精品文檔放心下載在Flash中.首先看一下我們使用FlashAPI創(chuàng)建Sprite對象:精品文檔放心下載varmySprite:Sprite=newSprite();精品文檔放心下載很熟悉?通過這些,你創(chuàng)建了一個叫mySprite的Sprite類的對象.這叫做一個類的實例.內(nèi)置的類與自定義的類沒什么不同.Papervision3D是一個自定義類的集合.第一章說過如何來實例化一個Papervision3D里的DisplayObject3D類,感謝閱讀varmyObject3D:DisplayObject3D=newDisplayObject3D();精品文檔放心下載一旦知道了如何使用類,就可以創(chuàng)建自己類了.創(chuàng)建自定義類ActionScript類是存放于計算機上以.as結(jié)尾的文本文件,包括ActionScript腳本代碼.這些代碼就是精品文檔放心下載前面所說的對象的設(shè)計.現(xiàn)在看看設(shè)計是什么樣子:package{publicclassExampleClass{publicvarmyName:String="Paul";感謝閱讀publicfunctionExampleClass()謝謝閱讀{}.publicfunctionreturnMyName():String謝謝閱讀{return"Mynameis"+myName;感謝閱讀}}}第一行,是包(package)語句,緊隨其后的是左大括號({)和類下面的右大括號(}).包是組織類的一種方謝謝閱讀式,代表了存放類文件的目錄.假設(shè)你創(chuàng)建了一個名為myPackage的目錄并將FLA或源碼文件存放在其中.精品文檔放心下載為了訪問此目錄及里面的類,需要用目錄名來定義包,如下:精品文檔放心下載packagemyPackage{...}子目錄的工作情況也一樣.現(xiàn)在假設(shè)在myPackage目錄下有一個名為subPackage的子目錄.應(yīng)該這樣來感謝閱讀定義子目錄subPackage:packagemyPackage.subPackage{謝謝閱讀...}如果你沒有創(chuàng)建一個目錄來組織你的類,可以使用默認包來代替相應(yīng)的包名,(即不寫包名)本書的所有例子謝謝閱讀都使用默認包.實際上,為了避免命名沖突,必須用包來組織眾多的類.謝謝閱讀包定義之后,將看到類的定義,看起來如:publicclassExampleClass{....}類的名字必須和類文件的名字一致.本例中,類文件必須存為ExampleClass.as.精品文檔放心下載實際上,包是一種很好的類文件組織方式,可以讓項目中每個類都有唯一的名字.避免命名沖突.感謝閱讀在class的前面有一個public,這是一個關(guān)鍵字用來表明項目中所有代碼都可以訪問此類.這個關(guān)鍵字被稱謝謝閱讀為訪問控制符.類的名字將被用來實例化類.像這樣來實例化類:varclassExample:ExampleClass=newExampleClass();精品文檔放心下載在類里定義的變量稱其為類屬性.類屬性的數(shù)量不限.每個類屬性均有訪問控制符.本例中的訪問控制符是感謝閱讀public,表示所有的類都可以對其進行讀寫:varclassExample:ExampleClass=newExampleClass();謝謝閱讀classExample.myName="Jeff";感謝閱讀這樣便創(chuàng)建了一個類ExampleClass的實例.我們可以將屬性myName由Paul改為Jeff.當(dāng)一個屬性聲明謝謝閱讀為public,便可以這樣操作.如果你想讓屬性只能在類中使用,需要將屬性改為private:感謝閱讀privatevarmyName:String="Paul";精品文檔放心下載這時執(zhí)行之前的代碼,會得到一個編譯時錯誤.接著我們看到類中名為ExampleClass的方法.感謝閱讀方法名與類名相同的方法被稱為構(gòu)造器(構(gòu)造方法).publicfunctionExampleClass()感謝閱讀{}.構(gòu)造器的訪問控制符均是public并且每當(dāng)實例化類時就被自動調(diào)用.這表示構(gòu)造器中的代碼將被自動執(zhí)行.精品文檔放心下載類中其他的所有函數(shù)(function)都稱為方法(method).謝謝閱讀publicfunctionreturnMyName():String感謝閱讀{return"Mynameis"+myName;謝謝閱讀}方法定義完后,你將發(fā)現(xiàn)一個冒號緊跟著一個數(shù)據(jù)類型.這是定義方法返回值的數(shù)據(jù)類型.你也可以在Flash精品文檔放心下載的時間軸上這樣定義方法,但這不是必須的.returnMyName()方法定義了返回值是字符串.如果你不想返回精品文檔放心下載任何值,可以使用void作為返回類型:publicfunctionreturnNothing():void精品文檔放心下載{//Donotreturnsomething}我們只需為普通方法定義返回類型即可,構(gòu)造器無返回值類,及其屬性和方法,都用訪問控制符,用來確定對象的訪問權(quán)限.到現(xiàn)在我們已經(jīng)看到了關(guān)鍵字public,表示感謝閱讀在任何地方都可以訪問.當(dāng)使用public時,必須注意到可能會造成類的混亂.可以用private關(guān)鍵字來避免這精品文檔放心下載樣情況,private將使屬性或方法只能在本類內(nèi)進行訪問 .其余兩個常用的訪問控制符是 internal和感謝閱讀ernal表示同一包內(nèi)可以訪問.protected表示屬性或方法只能由子類訪問.子類是oop繼承謝謝閱讀的一部分,我們稍微將解釋下.只要屬性或方法不準備在類外進行訪問,最好將其設(shè)定為private.每當(dāng)定義屬性或方法時,你都應(yīng)該確謝謝閱讀定下是否要在類外進行訪問..繼承有時想創(chuàng)建一個類,而此類和已存在的類又很相似,而你只是想添加一個新的方法.你可以拷貝已有的類,粘感謝閱讀貼到新類中,再添加一個新的方法.然而這樣做的效率很低.這時就有繼承的用武之地了.謝謝閱讀繼承是一種擴展已有類(稱為父類或基類)的技術(shù),從父類中繼承的類稱為子類.子類可以訪問父類中所有非感謝閱讀private的屬性和方法.假設(shè)你準備用代碼來創(chuàng)建一個汽車和一個摩托車.你可以直接寫2個類,汽車和摩托車.但你很快就會注意到這2個類的方法和屬性幾乎都是重復(fù)的.比如2者都可以駕駛,都有屬性:車輪數(shù)和速度.在抽象方式中,這些屬性和方法都重復(fù)了,因為汽車和摩托車都是車輛.感謝閱讀創(chuàng)建父類:車輛,汽車和摩托車都繼承車輛便可以避免重復(fù)的代碼.謝謝閱讀必要時,子類可以定義與父類不同的,自己專有的屬性或方法.謝謝閱讀如:一汽車有4個輪子并可以在相反的方向駕駛.而摩托車有2個輪子,不能在相反的方向駕駛.現(xiàn)在用2個簡單類看一下繼承是怎樣完成的:package{publicclassBasicClass{publicfunctiondoSomething():void感謝閱讀{trace("I'mdoingsomething");感謝閱讀}}}package{publicclassSubClassextendsBasicClass精品文檔放心下載.{publicfunctionsaySomething():void感謝閱讀{trace("I'msayingsomething");精品文檔放心下載}}}第一個類作為父類并只有一個方法.實例化BasicClass并直接調(diào)用其方法.精品文檔放心下載varbasicClass:BasicClass=newBasicClass();謝謝閱讀basicClass.doSomething();沒什么特別的.由SubClass的定義我們可看到它繼承了BasicClass.這樣它便可以用BbsicClass的屬性或感謝閱讀方法.現(xiàn)在看看:varsubClass:SubClass=newSubClass();感謝閱讀subClass.doSomething();subClass.saySomething();subClass調(diào)用了從BasicClass繼承的doSomething()方法.感謝閱讀不但可以從自定義的類繼承,也可以繼承一些內(nèi)置的類.現(xiàn)在看一下創(chuàng)建Sprite的子類:感謝閱讀package{importflash.display.Sprite;感謝閱讀publicclassextendedSpriteextendsSprite感謝閱讀{}.}注意需要在包聲明下面加入這句:importflash.display.Sprite;謝謝閱讀為了繼承在當(dāng)前包中沒有的類,你需要聲明一個引入.引入相關(guān)的包和類.本例中的Sprite類從包感謝閱讀flash.display引入.繼承是創(chuàng)建新類的一種途徑,以已有的類為基礎(chǔ)-不是嗎?這將使你的代碼更清晰和精煉.但如果你想改感謝閱讀變一個父類中已存在的方法?如果你想完全的擺脫現(xiàn)存類的代碼,直接改父類有時不可能,同時也不是一個感謝閱讀好方法.當(dāng)你用了一個第三方的類庫如Papervision3D,很難想象你會修改它.當(dāng)你直接修改了一些類后,一謝謝閱讀旦更新類庫的版本后你的代碼就失效了.幸運的是面向?qū)ο蟪绦蛟O(shè)計提供了一個解決方案 .看一下我們?nèi)绾卧谧宇愔行薷?BasicClass類的感謝閱讀doSomething()方法.package{publicclassSubClassextendsBasicClass感謝閱讀{overridepublicfunctiondoSomething():void謝謝閱讀{trace("Hi,youneedtodosomething");感謝閱讀}publicfunctionsaySomething():void感謝閱讀{trace("I'msayingsomething");感謝閱讀.}}}我們?yōu)樽宇愄砑右粋€doSomething()方法.但必須明確說明此方法是覆蓋了父類的同名方法.當(dāng)覆蓋后老方精品文檔放心下載法便被替換了.在子類中依然可以調(diào)用被覆蓋的父類方法.感謝閱讀overridepublicfunctiondoSomething():void精品文檔放心下載{trace("Hi,youneedtodosomething");精品文檔放心下載super.doSomething();}現(xiàn)在在SubClass中調(diào)用doSomething()方法,將輸出:感謝閱讀Hi,youneedtodosomething謝謝閱讀I'mdoingsomething這里簡單的解釋了最基礎(chǔ)的面向?qū)ο?借此你應(yīng)該明白了一些基礎(chǔ)面向?qū)ο?并能大概看懂面向?qū)ο蟮臅?如謝謝閱讀果想了解的更多,在線的面向?qū)ο蟮臅幸淮蠖?使用文檔類和主應(yīng)用文件文檔類是在FlashIDE中才有,主應(yīng)用文件在FlexBuilder或FlashBuilder中才有.精品文檔放心下載文檔類是只包含一個構(gòu)造器的特殊類,當(dāng)SWF文件載入時會調(diào)用它.也可以說文檔類的構(gòu)造器是你程序的謝謝閱讀入口.文檔類必須是Sprite或MovieClip,或他們的子類.感謝閱讀為了簡單起見,本書只使用文檔類不用主應(yīng)用文件,雖然他們的名字不同,但作用卻是一樣.感謝閱讀FlexBuilder和FlashBuilder獲取并執(zhí)行文檔類的流程一樣,但FlashIDE使用另一種方式.現(xiàn)在我們解釋下感謝閱讀.FlashIDE的工作方式.設(shè)置Flash的文檔類在Flash中,你可選擇一個文檔類作為你程序的入口.文檔類可以是有時間軸的MovieClip的子類.將其放置感謝閱讀到舞臺作為應(yīng)用的入口.雖然可以用舞臺和文檔類的組合來作為應(yīng)用的入口,但不怎么常用.謝謝閱讀指定文檔類非常簡單.打開Flash,步驟如下:新建as文件,保存為DocumentClassExample.謝謝閱讀新建Flash(as3)文件保存為DocumentClassExample.Fla,與as文件同一目錄.感謝閱讀打開FLA文件的屬性面板.在最底下的右邊有Documentclass的輸入框.輸入文檔類的類名,本例是DocumentClassExample,下圖:謝謝閱讀到此就足夠了.很簡單是吧?在Flash中構(gòu)造應(yīng)用這些基本信息是非常重要的,不論是否是3d的應(yīng)用.感謝閱讀現(xiàn)在看一下發(fā)布后將發(fā)生什么.如果以上的步驟不對的話,Flash將拋出錯誤5007.精品文檔放心下載5007:AnActionScriptflemusthaveatleastoneexternallyvisibledefnition.精品文檔放心下載這是個可預(yù)知的錯誤.因為我們在屬性面板定義文檔類名卻不存在相應(yīng)的類.精品文檔放心下載我們只創(chuàng)建了一個空的文件還沒任何類的定義.當(dāng)Flash無法繼續(xù)工作就拋出剛才的那個錯誤.提醒我們出感謝閱讀現(xiàn)了錯誤.現(xiàn)在我們修改此類.在Flash中打開DocumentClassExample.as,加入下面的代碼并保存.精品文檔放心下載package{importflash.display.Sprite;謝謝閱讀publicclassDocumentClassExampleextendsSprite謝謝閱讀{publicfunctionDocumentClassExample()謝謝閱讀.{trace("Helloworld!");}}}現(xiàn)在我們可以正常發(fā)布了.第三行我們看到此類繼承了Sprite,這是必須的.構(gòu)造器只輸出了一行字符,感謝閱讀發(fā)布后會在輸出窗口看到這行字符.設(shè)置FlashBuilder,FlexBuilder的文檔類謝謝閱讀雖然這是可以的,但在本書中不使用FlexBuilder或FlashBuilder來創(chuàng)建Papervision3D的應(yīng)用.但這謝謝閱讀2個工具都可以處理ActionScript工程.感謝閱讀FlashBuilder或FlexBuilder中創(chuàng)建文檔類步驟相同.使用這2個工具可以自動創(chuàng)建文檔類.現(xiàn)在看一精品文檔放心下載下如何創(chuàng)建文檔類:新建一個ActionScript項目.將其命名為DocumentClassExample.精品文檔放心下載單擊Next直到看到Mainapplicationfile的輸入框,默認此處的值為工程名.As,本例中為DocumentClassExample.as.精品文檔放心下載下圖是新建ActionScript項目向?qū)У牡?步.自動命名的文檔類.謝謝閱讀.4.單機Finish就設(shè)定好了文檔類.如果有多個類,可以隨時在FlexNavigator(FlexBuilder)或Package感謝閱讀Explorer(Flashbuilder)中更新文檔類.(步驟為:感謝閱讀在xxx.as右鍵選SetasDefaultApplication,文件的圖標變?yōu)?即可).感謝閱讀5.現(xiàn)在完成此類并輸入"HelloWorld".因為FlexBuilder和FlashBuilder為了運行你的代碼必須指定一個文檔類,之外不須更多的步驟.Debug方謝謝閱讀式運行你的代碼,將看到trace出的字符.Papervision3D里3D場景基礎(chǔ)在我們開始寫Papervision3D的代碼前,我們需要知道更多一些Papervision3D面的3D.接下謝謝閱讀來的這部分會讓你更明白所寫的那些代碼.這些概念跟Papervision3D用到的類有直接關(guān)系.本章,感謝閱讀將使用這些來完成第一個應(yīng)用.我們所說的對象都是3D場景里活動的元素.讓我們看一下這些對象:謝謝閱讀.場景SceneScene是在3d空間由3d對象組成的一個整體.就如flash里有3個軸的舞臺(stage)-x,y,z.每精品文檔放心下載個可視對象都可以添加到場景.如不添加到場景中就不會在出現(xiàn)在屏幕上.感謝閱讀攝影機Camera可以想象成一個真實的相機,它在3d空間中不斷的記錄場景的活動.攝影機確定了查看場景的精品文檔放心下載點.因為3d空間的相機不是可視對象,它不是場景的組成部分不必添加它.攝影機可以像真實的相機感謝閱讀一樣縮放和聚焦.3d空間的相機可以做更多的事.如,在3d中對象距離相機過近或過遠時將剔除此對象防止它被感謝閱讀渲染.相機可以忽略某些在不可見區(qū)域的對象.這些都是出于性能考慮的.對象距離太遠或處于相機謝謝閱讀后面,不需來記錄,這時會節(jié)省很多計算的資源.觀察口Viewport觀察口是一個舞臺上的sprite容器,輸出相機記錄下來的對象.對象介紹中,觀察口好比相機的鏡頭.感謝閱讀鏡頭是我們放在3d場景上面的窗口.我們可以縮小這個窗口則可以只看到3d場景的一小部分,放大一些就看的多一些.觀察口如現(xiàn)實中謝謝閱讀真實窗口一樣—窗口越大看到的外面世界越大,它影響到我們究竟可以看到多少場景.謝謝閱讀下面的圖解包含了一個大的觀察口,右側(cè)是一個小而寬的觀察口.黑邊框畫出了觀察口區(qū)域.右感謝閱讀側(cè)的圖很好的說明了觀察口如何影響我們所看到的物體..3D對象在3d空間中的圖形被稱為一個3d對象,在Papervision3D中叫DisplayObject3D.可以將其想象精品文檔放心下載成一個更高級的可視化對象如sprite和movieclip.不同的是DisplayObject3D有第三個軸,我們謝謝閱讀可以讓其繞3軸進行旋轉(zhuǎn).材質(zhì)Material材質(zhì)是附著在對象表面上的結(jié)構(gòu).當(dāng)對象沒有附著材質(zhì)時,它是不可見的.可以使用很多材質(zhì).如精品文檔放心下載一個簡單的材質(zhì):顏色;高級的材質(zhì)可能是:流(livestream).第四章會用到所有的材質(zhì).感謝閱讀渲染引擎Renderengine渲染引擎像一個滾動的相機.只要渲染引擎開始工作,它會輸出相機記錄下來的信息給觀察口.感謝閱讀當(dāng)停止渲染引擎時觀察口不會有任何新的信息輸出僅僅會看到最后的那張圖像.渲染是計算機中最謝謝閱讀繁重的任務(wù),它需要重復(fù)計算你場景內(nèi)部的對象并輸出他們到觀察口去.精品文檔放心下載左手定則笛卡爾坐標系Flash,Papervision3D,都使用笛卡爾坐標系.在Flash中,一個規(guī)則的可視化對象可以通過設(shè)置x,y感謝閱讀值改變其在舞臺的位置.對象依靠x,y的值與舞臺左上角的關(guān)系來確定位置.x值越大對象越靠右,y謝謝閱讀值增大對象便向下移動.Papervision3D里面的坐標系工作一致,只有2點不同之處.感謝閱讀Flash使用了笛卡爾坐標系的2個軸,而Papervision3D使用了3個軸精品文檔放心下載Papervision3D里的y軸與Flash里面的y軸相反.精品文檔放心下載在Papervision3D中,我們不但要設(shè)置可視化對象的x,y軸,還要設(shè)置其額外的軸,為了確定對象感謝閱讀.的深度.第三軸稱為z軸.在Flash中,依靠左上角的關(guān)系來擺放對象 ,這點是(0,0).稱為中心點或原點.可想而感謝閱讀知,Papervision3D中的原點是(0,0,0).謝謝閱讀圖中(+,-)的標志說明了坐標值相對于原點是增加還是減少.[注意]y軸與Flash2D坐標系是相謝謝閱讀反的.若準備將對象放置到屏幕的下方,需要給y軸更大的值.這是2D坐標的工作情況.上面的圖感謝閱讀解說明了Papervision3D坐標系里的y軸情況.精品文檔放心下載(注:這樣想Flash的坐標原點在屏幕的左上角,Papervision3D的坐標原點在屏幕的左下角)精品文檔放心下載創(chuàng)建一個基礎(chǔ)的Papervision3D類前面學(xué)習(xí)了基礎(chǔ)場景的使用,和如何創(chuàng)建自定義類.現(xiàn)在我們要開始實踐.謝謝閱讀使用你順手的工具.第一個應(yīng)用我們將創(chuàng)建一個3D場景包含一個可繞y軸旋轉(zhuǎn)的球體.球精品文檔放心下載體是Papervision3D內(nèi)置的一個基本體.精品文檔放心下載基本文檔類首先,看一下定義了旋轉(zhuǎn)球體應(yīng)用結(jié)構(gòu)的文檔類.package{importflash.display.Sprite;感謝閱讀importorg.papervision3d.cameras.Camera3D;精品文檔放心下載.importorg.papervision3d.objects.primitives.Sphere;importorg.papervision3d.render.BasicRenderEngine;importorg.papervision3d.scenes.Scene3D;importorg.papervision3d.view.Viewport3D;謝謝閱讀publicclassFirstApplicationextendsSprite精品文檔放心下載{privatevarscene:Scene3D;感謝閱讀privatevarviewport:Viewport3D;謝謝閱讀privatevarcamera:Camera3D;謝謝閱讀privatevarrenderEngine:BasicRenderEngine;privatevarsphere:Sphere;謝謝閱讀publicfunctionFirstApplication()謝謝閱讀{scene=newScene3D();camera=newCamera3D();sphere=newSphere();scene.addChild(sphere);viewport=newViewport3D();感謝閱讀addChild(viewport);renderEngine=newBasicRenderEngine();renderEngine.renderScene(scene,camera,viewport);感謝閱讀.}}}現(xiàn)在細說下,我們可以在Flash,Flexbuilder,FlashBuilder中建立一個新工程之后創(chuàng)建一個名為精品文檔放心下載FirstApplication的文檔類.不要忘記在FlexBuilder,FlashBuilder中導(dǎo)入Papervision3D的謝謝閱讀代碼.此前,我們了解到要把渲染結(jié)果輸出到屏幕上我們需要一個場景,攝像機,觀察口,有材質(zhì)的3d謝謝閱讀對象,和一個渲染引擎.[注意]文檔類需要繼承Sprite.之前我們需要將其引入.感謝閱讀importflash.display.Sprite;謝謝閱讀importorg.papervision3d.cameras.Camera3D;精品文檔放心下載importorg.papervision3d.objects.primitives.Sphere;感謝閱讀importorg.papervision3d.render.BasicRenderEngine;感謝閱讀importorg.papervision3d.scenes.Scene3D;謝謝閱讀importorg.papervision3d.view.Viewport3D;感謝閱讀現(xiàn)在,引入完畢,我們開始定義變量.privatevarscene:Scene3D;感謝閱讀privatevarviewport:Viewport3D;感謝閱讀privatevarcamera:Camera3D;感謝閱讀privatevarrenderEngine:BasicRenderEngine;privatevarsphere:Sphere;感謝閱讀我們只是定義了變量,并沒有賦初始值.我們在構(gòu)造器中進行賦初值.感謝閱讀.publicfunctionFirstApplication()感謝閱讀{}現(xiàn)在開始創(chuàng)建一個3D場景.場景是必須的,是3D對象的載體.精品文檔放心下載scene=newScene();創(chuàng)建了一個無參的Scene3D類的實例.接著,添加一個Camera3D,跟創(chuàng)建場景一樣容易.感謝閱讀camera=newCamera3D();攝像機在創(chuàng)建時可以指定參數(shù),現(xiàn)在使用默認值.只要場景中沒有3D對象,場景和攝像機都很少精品文檔放心下載用到.本例用到了一個內(nèi)置的球體.sphere=newSphere();Camera和Sphere都可以在創(chuàng)建時指定參數(shù),若不指定則自動使用默認值.精品文檔放心下載現(xiàn)在我們的球體創(chuàng)建完畢,需要加入到場景中,否則攝像機無法觀察到它.如同在Flash中添加規(guī)精品文檔放心下載則對象的步調(diào)一致,通過使用addChild().scene.addChild(sphere);看起來很像,對嗎?現(xiàn)在我們擁有了一個場景,一個攝像機,和一個球體,現(xiàn)在我們需要建立好可以觀察到3D場景的謝謝閱讀窗口.我們需要定義觀察口并將其加入到舞臺以使其可見.精品文檔放心下載viewport=newViewport3D();感謝閱讀addChild(viewport);創(chuàng)建新觀察口時,我們可以傳遞可選的參數(shù),否則觀察口將使用默認的參數(shù).謝謝閱讀現(xiàn)在距離完工只有一步之遙了.我們需要獲取到我們滾動的攝像機.這是渲染引擎定義好的,感謝閱讀.它將渲染場景并將拍到的圖像發(fā)送至觀察口.renderEngine=newBasicRenderEngine();精品文檔放心下載renderEngine.renderScene(scene,camera,viewport);感謝閱讀現(xiàn)在用渲染場景指令來渲染場景.運行后會得到一下的圖像:謝謝閱讀大小寫敏感值得注意的是as代碼大小寫敏感.不仔細的話便會出錯.以定義球體為例:感謝閱讀varsphere:Sphere=newSphere();謝謝閱讀這里我們看到我們定義了一個Sphere類型(大寫),引用是sphere(小寫),變量和屬性的名字相同的話往往會導(dǎo)致錯誤的產(chǎn)生感謝閱讀這幾行代碼的結(jié)果可能看起來不是很美觀,實際上這是令人振奮的開始,因為這在常規(guī)的Flash精品文檔放心下載中是無法完成.當(dāng)你編譯完畢并顯示出三角形時,你已經(jīng)通過了本例中最困難的部分.讓我們繼謝謝閱讀續(xù)構(gòu)建第一個應(yīng)用并且看看我們?nèi)绾谓o看起來還是很2d的對象添加3d效果.感謝閱讀完成第一個應(yīng)用物體看起來很2d是因為目前還沒有很明顯的透視效果.同時場景還是靜止的.當(dāng)我們讓球謝謝閱讀體繞某軸旋轉(zhuǎn)時,我們將看到更好的效果.因為透視變化了,會讓球體看起來更3d些.旋轉(zhuǎn)前我們謝謝閱讀需要添加以下代碼.在舞臺上我們僅讓渲染引擎執(zhí)行了一次單獨的渲染,然而,在真實的3D場景謝謝閱讀中是遠遠不夠的.還記得我們說過我們需要一個攝影機嗎?調(diào)用一次renderScene只會得到謝謝閱讀一次圖形輸出,就像照相機只拍了一張照片.這是不能實現(xiàn)滾動的效果的;我們需要每時每刻都精品文檔放心下載進行渲染.最普通的做法是添加一個ENTER_FRAME事件監(jiān)聽用于時刻進行渲染.感謝閱讀.我們需要導(dǎo)入Event類,之后我們就可以監(jiān)聽ENTER_FRAME事件了.下面的導(dǎo)入語句加謝謝閱讀在類的上面importflash.events.Event;謝謝閱讀現(xiàn)在Event可用了,我們可以添加一個監(jiān)聽器.如下:感謝閱讀renderEngine.renderScene(scene,camera,viewport);謝謝閱讀addEventListener(Event.ENTER_FRAME,render);謝謝閱讀每一次ENTER_FRAME事件,都會觸發(fā)一次render方法.render方法內(nèi)執(zhí)行renderScene方感謝閱讀法privatefunctionrender(e:Event):void謝謝閱讀{renderEngine.renderScene(scene,camera,viewport);精品文檔放心下載}每次播放頭進入到新幀時,場景都會被渲染.但在目前的渲染只是一種浪費.場景沒有改變時為感謝閱讀什么需要進行渲染?因此,我們開始讓球體繞y軸旋轉(zhuǎn).可以通過增加y軸的旋轉(zhuǎn)值來完成,在精品文檔放心下載render方法中加入.privatefunctionrender(e:Event):void感謝閱讀{sphere.localRotationY+=1;謝謝閱讀renderEngine.renderScene(scene,camera,viewport);謝謝閱讀}每一幀球體都會旋轉(zhuǎn)一個角度.發(fā)布后查看此動畫.這是球體旋轉(zhuǎn)的截圖!如果你使用的是Flashcs3,FlexBuilder,或FlashBuilder,你會發(fā)現(xiàn)動謝謝閱讀畫不是很平滑.這是flash的幀率導(dǎo)致的.FlashCS3的默認是 12fps,FlexBuilder默認是感謝閱讀24fps,FlashCS4默認是30fps,幀率越高動畫看起來越平滑.當(dāng)然也會耗資源越多,幀率越高需謝謝閱讀要cpu計算量越大.這種情況下FlashPlayer將盡可能的繪制出更多的幀,結(jié)果造成動畫的停頓.謝謝閱讀目前還不會出現(xiàn)這種情況,往往出現(xiàn)在一個復(fù)雜的3d場景中.感謝閱讀現(xiàn)在,我們需要改變一下默認的幀率.實際上沒有最佳的幀率.本書中的幀率都用精品文檔放心下載40.FlashIDE中可以設(shè)置下FLA的屬性,Flex中只能通過代碼改變了.可以給舞臺加入幀率屬性感謝閱讀stage.frameRate=40;通常這個值是文檔類構(gòu)造器的第一行代碼.但可以放在任何地方.為了看到更平滑的動畫,我們感謝閱讀在文檔類的構(gòu)造器中加入.我們已經(jīng)完成了第一個應(yīng)用!發(fā)布后將看到一個繞y軸旋轉(zhuǎn)的球體,現(xiàn)在運行的很平滑了.感謝閱讀讓我們重點看下這個類中的黑體部分.package{importflash.display.Sprite;感謝閱讀importflash.events.Event;感謝閱讀importorg.papervision3d.cameras.Camera3D;importorg.papervision3d.objects.primitives.Sphere;importorg.papervision3d.render.BasicRenderEngine;精品文檔放心下載.importorg.papervision3d.scenes.Scene3D;精品文檔放心下載importorg.papervision3d.view.Viewport3D;謝謝閱讀publicclassFirstApplicationextendsSprite精品文檔放心下載{privatevarscene:Scene3D;謝謝閱讀privatevarviewport:Viewport3D;精品文檔放心下載privatevarcamera:Camera3D;精品文檔放心下載privatevarrenderEngine:BasicRenderEngine;privatevarsphere:Sphere;publicfunctionFirstApplication()謝謝閱讀{stage.frameRate=40;scene=newScene3D();camera=newCamera3D();sphere=newSphere();scene.addChild(sphere);viewport=newViewport3D();謝謝閱讀this.addChild(viewport);renderEngine=newBasicRenderEngine();renderEngine.renderScene(scene,camera,viewport);this.addEventListener(Event.ENTER_FRAME,render);精品文檔放心下載}.privatefunctionrender(e:Event):void精品文檔放心下載{sphere.localRotationY+=1;renderEngine.renderScene(scene,camera,viewport);感謝閱讀}}}聰明的程序員使用更短的代碼例子FirstApplication是一個不錯并且很小的Papervision3D類.每次我們準備創(chuàng)建一個精品文檔放心下載Papervision3D應(yīng)用我們可以拷貝這個類到新的應(yīng)用中去.但有沒有更簡潔的方式呢?每個精品文檔放心下載Papervision3D項目都包含了基本的組件—攝影機、場景、渲染器、觀察口.每次定義并引入謝謝閱讀這些類都在重復(fù)勞動.聰明的程序員便想辦法找出一個更高效的方案.很幸運,Papervision3D感謝閱讀包含了一個BasicView類.此類包含我們需要的基本組件.BasicView是繼承自Sprite的,我們感謝閱讀可以實例化它并加入到舞臺去或用來擴展我們的文檔類.本書將使用它.精品文檔放心下載讓我們來看一個繞y軸旋轉(zhuǎn)球體的改良版本.package{importflash.events.Event;感謝閱讀importorg.papervision3d.objects.primitives.Sphere;importorg.papervision3d.view.BasicView;精品文檔放心下載.publicclassBasicViewExampleextendsBasicView感謝閱讀{privatevarsphere:Sphere;謝謝閱讀publicfunctionBasicViewExample()精品文檔放心下載{stage.frameRate=40;sphere=newSphere();scene.addChild(sphere);startRendering();}overrideprotectedfunctiononRenderTick(e:Event=null):void精品文檔放心下載{sphere.localRotationX+=1;謝謝閱讀super.onRenderTick();}}}構(gòu)造器內(nèi)部,我們需要設(shè)置一下工程的特殊值,如幀率和球體.在沒有創(chuàng)建Scene3D對象,感謝閱讀球體也可以添加到場景去.這些都在BasicView類中已經(jīng)被創(chuàng)建好了.我們接著調(diào)用謝謝閱讀.BasicView.startRendering()通知BasicView類開始渲染.一旦此方法被調(diào)用,會添加一個精品文檔放心下載ENTER_FRAME事件監(jiān)聽,事件發(fā)布后會一直渲染場景.我們只需在ENTER_FRAME事件監(jiān)聽精品文檔放心下載中增加y軸旋轉(zhuǎn)值即可.最簡單的方式是 覆蓋BasicView.onRenderTick(),重寫后每次謝謝閱讀ENTER_FRAME時便會執(zhí)行我們的代碼了.我們必須調(diào)用super.onRenderTick(),以使父類正謝謝閱讀常工作.注意,BasicView里面的某些設(shè)置與FirstApplication的不一樣,球體的尺寸會有變化.因為觀察口在FirstApplication中是預(yù)先定義的,而在BasicView中則會隨舞臺的尺寸自動縮放感謝閱讀使用BasicView可以省下很多代碼.當(dāng)你比較繼承自BasicView的類和FirstApplication精品文檔放心下載類,你會發(fā)現(xiàn)代碼行從43縮減到26,省下17行.本書中所有的例子都將使用BasicView類.感謝閱讀為書中的例子做準備現(xiàn)在我們知道如何創(chuàng)建一個繼承自BasicView的文檔類,更詳細的說明放在了下一章.繼謝謝閱讀承BasicView會節(jié)省很多代碼書寫時間,

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論