在A3D中顯示Box

2021-06-03 05:15:21 字數 3158 閱讀 2273

繪製乙個box

參考《配置a3d開發環境》我們講解測試環境的**。新建乙個專案demo。開啟main.as,輸入如下**(加粗):

package

開始的時候我們在package裡面匯入了需要用到的類,然後在main類裡定義了4個變數。

(1)object3d是所有a3d中物件的基類。它是乙個容器,能存放其他的3d物件。和movieclip一樣,我們能通過addchild方法來存放其他的3d物件。它擁有和movieclip相似的屬性,如x、y、z、rotationx等。

(2)camera3d繼承自object3d。它被設計成渲染場景,它在螢幕上不輸出任何東西,正確的顯示3d物件是顯示器的事情。我們看不見不在可可視範圍外(場景外)的所有物件,它剔除所有不在可視區域的多邊形,這樣能節省cpu資源。下面有一段關於camera3d的通俗解釋:

camera3d:三維攝像機。對於利用camera來完成三維動畫的想法,我一直覺得很是高明。想象一下,我們的眼睛就是攝像機。如果我們想觀察乙個物體的各個側面,我們會用手轉動這個物體,然後觀察。我們為何不換一種思路,把物體放在那,而眼鏡(自己的頭)繞著物體轉呢?這也就是camera3d的作用。不但我們可以控制場景中物體的任意動畫,我們也可以控制攝像機的不同位置與角度。想想cs,不就像是自己拿著攝像機在看乙個三維世界嗎?這樣的設計更合理,也更具與人性的特點。那如何來控制攝像機呢?在a3d中也為我們設計了一下特定的類,後面的教程中將會給大家介紹。同時,在3d中,攝像機必須與view(視窗),相結合使用。那什麼又是視窗呢?

引自:(3)box是a3d中的3d物件,繼承自object3d。

(4)stage3d是adobe在flash player11中引入的一套新的actionscript api,這套api允許flash利用硬體渲染3d畫面。

以前,在flash中的3d渲染是不經過硬體加速的。事實上,在flash player11以前的所有3d渲染都是軟體渲染模式,也就是依靠cpu來完成的。軟體渲染模式非常的慢,而且不能用來渲染很細節化的3d場景。

關於stage3d的更多資訊可以參考《stage3d是如何工作的》。

通過下圖我們詳細了解一下stage3d類。

1)支援硬體渲染的影象不包含在傳統的 displaytree 中。 相反,它存在於乙個特殊的 stage 中: stage3d。 任何應用程式都可以有四種不同的 stage3d 元素,應用程式至少需要乙個stage3d。它們全部作為層放置在彼此之上,但是卻都位於 displaytree 之下。 這就保證了平面 flash 物件總是與3d 影象重疊。可以通過下面**獲取:stage3d = stage.stage3ds [0];

2)stage3d willalways be behind any displayobject'a, that is, we can not place the spritebehind 3d graphics ...

3)stage3d有乙個context3d屬性。所有在3d場景中的物件都要上傳自gpu記憶體context3d。當所有的資源被載入完成和content3d被建立,才能在顯示器上顯示圖形。

publicfunction main()

現在我們只需要注意加粗的語句,view是乙個視窗。我們來想想一下,你面前有扇門,門上有乙個正方形小孔,你想通過小孔看看門後房子裡是什麼東西,而你和門之間有一段距離,就如下面的那張圖。為了看得更全,你可以移動自己的眼鏡(camera3d),但是,你能看見的範圍卻只有那個孔那麼大。這就是視窗view與攝像機camera3d之間的關係,我們使用:camera.view 來組合他們的關係。視窗是用來觀察場景(scene3d.root)空間的乙個視窗,所以視窗不用放在3d場景之中。

依據上圖,總結一下前面的知識點。在乙個a3d專案中

(1)至少有乙個stage3d物件,可以通過stage舞台類獲取:

stage3d = stage.stage3ds[0];//獲取stage3d物件

(2)將所有顯示的3d物件放入object3d容器中(包括攝像機camera3d)

private functioninit(e:event = null):void {

rootcontainer.addchild(camera);//將攝像機載入進容器

box = new box(500, 500, 500, 5, 5, 5);

var material:fillmaterial = newfillmaterial(0xff7700);

box.setmaterialtoallsu***ces(material);

rootcontainer.addchild(box);//將box載入進容器

(3)將視窗載入進顯示列表

//view不需要放入3d場景中,只需將攝像機觀察的視窗載入進sprite(顯示列表)

addchild(camera.view);

(4)將所有的3d物件上傳到gpu的記憶體contex3d

(5)渲染stage3d

下面是後面2步的**實現。

private function oncontextcreate(e:event):void {

//遍歷在容器中所有資源

for each(var resource:resource in rootcontainer.getresources(true)) {

resource.upload(stage3d.context3d);//所有資源上傳自gpu記憶體content3d

stage.addeventlistener(event.enter_frame, onenterframe);

private function onenterframe(e:event):void {

0.01;

camera.render(stage3d);//渲染stage3d,顯示在content3d的物件

配置A3D開發環境

alternativa3d 是基於 actionscript 3.0 的 flash 3d 框架,支援 gpu 硬體加速,免費不開源。1 安裝flashdevelop 4。flex sdk4.6和playerglobal.swc都已經整合在進flashdevelop4中 你能啟動flashdevel...

在3D遊戲中顯示網頁

在遊戲中顯示網頁?為什麼要這麼做呢?其實可以做不少的應用 嵌入幫助文件,比如技能介紹,可以做得很漂亮,各種排版方式用傳統ui做起來很費勁 活動公告頁面直接在遊戲中檢視 遊戲內的bbs 社群 玩家的個性展示 資料 等等最重要的是,所有的這些內容都可以扔到web伺服器上,不用打包進客戶端 最早是用llm...

26 D3D顯示文字

為了在乙個基本層次上顯示文字,要用到兩個不同的物件,即lpd3dxfont和rect這兩個結構。lpd3dxfont用於建立和顯示文字,而rect用於確定要顯示的文字位置。為了建立lpd3dxfont物件,就要用到乙個名為d3dxcreatefont 的函式。該函式原型如程式清單5.1所示。其成員變...