vr final project report -...

12
VR Final Project Report 虛擬社區建築物編輯系統 R91921018 電機研一 蕭淑方 R91921077 電機研一 張鴻棋 R91922072 資工研一 楊國鑫

Upload: others

Post on 04-Jan-2020

8 views

Category:

Documents


0 download

TRANSCRIPT

  • VR Final Project Report

    虛擬社區建築物編輯系統

    R91921018 電機研一 蕭淑方

    R91921077 電機研一 張鴻棋

    R91922072 資工研一 楊國鑫

  • 一、系統簡介

    這是一個編輯建築物場景的系統,編輯情況分為兩個部分;「編輯大建築

    物」,可以一棟建築物為單位,可以在該地圖上任意新增、選取、轉動、移動該

    物件到指定地,並可以增加或減少該建築物樓層;另一個是「編輯建築物指定樓

    層內部物件」,能夠自由的新增、選取、移動物件,並可以模擬實際行走在其中

    的狀況。此外,許多現成 3D物件可以選取使用,包括了許多不同材質的房子外牆、地板、窗戶、門、圍欄、狗屋、桌椅、沙發、櫃子、樓梯、檯燈,甚至花瓶、

    地毯、壁畫等裝飾品,讓使用者選擇良多,增加建築物的變化。 此系統所使用的 3D物件Model是以一般通用的 3D物件格式﹙.3ds檔案﹚,讓使用者能自由的增加使用各現成 3D Model。 而在編輯的過程中,使用者可以隨時切換視窗模式觀看場景物件,由「編輯

    模式」和「模擬實際場景模式」互相切換,可以以俯視場景平面或是"走"到其中,藉由兩種不同的角度觀看該建築物的不同風貌,很適合室內設計或是景觀建築的

    使用者使用,藉著模擬功能的幫助,提升其設計品質。 以下兩張是我們系統的畫面,分成編輯以及瀏覽兩種畫面: 編輯模式:

    場景結構圖

    預覽畫面

  • 瀏覽模式:

    二、系統架構

    I. 系統結構

    場景管理

    顯示 移動及瀏覽

    Meta Data

    場景管理: 負責場景資料的儲存,文字檔場景的讀取和輸出,提供介界讓其他部份方便的存取資料。 編輯視窗: 顯示資料內容和處理各種編輯場景的動作,並要負責各視窗間資料的同步。 MetaData: 由場景資料轉換成一個精簡的格式,以做瀏覽模式時的移動判斷用。 顯示: 負責畫出畫面和計畫每個物件在畫面上的位置等相對資料。 移動及瀏覽: 編輯完後可以切換到這模式來體驗在這環境中的感覺。

  • II. 資料格式

    World

    House

    Floor

    Objects(Leaf)

    ……

    ….. …

    ……

    ..

    上圖中,World代表整個場景,在World下可以存放許多棟房子(House)的資訊,各個房子都可以分成好幾個樓層(Floor),最後再樓層中放著這層中許多傢俱等物件. 為了編輯和除錯的方便,我們可將場景存成以下格式的文字檔,在一開始編輯器

    還有許多工能還未完成時,就可以先用文字編輯器做一些簡單的測試檔來測試,

    顯示等功能,場景的文字檔範例: World { House < position = 1 1, size = 20 15> { Floor { BuildingObj BuildingObj BuildingObj } Floor { BuildingObj } } House < position = 15 40, size = 20 40> { Floor { BuildingObj } } }

  • 三、系統功能介紹

    I. 編輯模式

    1. 開新檔案 滑鼠操作點選左上角圖示。 2. 儲存變更檔案 滑鼠操作點選左上角圖示。 3. 關閉視窗 滑鼠操作點選左上角圖示,結束時會自動詢問是否儲存要檔案。 4. 編輯視窗瀏覽模式 可用鍵盤上下左右移動觀看地圖,分為兩種模式; a. 大地圖

    視野較大,可看到大範圍場景,用滑鼠點選左邊數狀結構指定樓

    層,然後點選上排圖示。 b. 建築物樓層

    可選擇指定樓層,用滑鼠點選左邊數狀結構指定樓層,然後點選上

    排圖示。

    5. 新增物件 滑鼠操作點選上排圖示,然後選取欲加入的物件名稱,該物鍵則會出現

    在某固定位置。 6. 選取物件

    a. 滑鼠左鍵選取候物件放大,可用滑鼠拖曳移動位置,再次按滑鼠左鍵固定物件位置。

    b. 選取物件時可用鍵盤控制將其直角轉動和上下移動。 7. 切換視窗觀看場景模式 滑鼠操作點選上排圖示,就可以切換編輯模式和實際瀏覽模式。 ◎ 鍵盤快鍵功能列表;

    一般; ↑↓← →在視窗中移動位置

  • 選取物件時; 8;物件向上移動一單位 2;物件向下移動一單位 4;物件順時鐘旋轉 90 度 6;物件逆時鐘旋轉 90 度

    II. 實際瀏覽模式

    以鍵盤操作移動觀看建築物場景,若遇到物件會被阻隔不能前進。 ◎ 鍵盤快鍵功能列表;

    ↑;前進 ↓;後退 ←;向左平移 →;向右平移 page up;抬頭,視角往上移動 page down;低頭,視角往下移動

    四、實作技術介紹

    I. 編輯模式

    虛擬社區創作 Step by Step

    以市面的上的3D編輯器編物件外觀 建立一個空場景

  • 加入新的樓層 圍出四周的牆壁 移動旋轉物件 再加入新的物件

    完成了

    II. 模擬實際場景模式

    1. 瀏覽模式 在瀏覽模式中,我們必須處理的一個狀況就是碰撞

    份忽略不予理會的話,那以第一人稱的我們,將會直接

    在家中的傢俱或是戶外的障礙物。而這個狀況主要有兩

    知碰撞的發生,再者則是如果碰撞發生了,程式要如何

    上下樓的處理,這部份類似於碰撞,不過與碰撞不同的是

    在的 Z位置。

    以瀏覽模式觀看結果

    的發生。如果我們對此部

    穿牆而過,更遑論是擺設

    件事要解決:一是如何得

    去處理。另外的狀況則是

    上下樓會改變瀏覽者所

  • 1.1 偵測碰撞 要說明碰撞的偵測,就要先介紹我們在瀏覽模式下的運行模式。在瀏覽模式

    中,我們先將整個地圖物件分層垂直投影在 XY 平面上,然後可以決定每層樓XY 平面上的格子點(1×1,單位與 OpenGL 同)佔用的情況。如果一個格子上存在物件,則這個格子的值會被設成 127;反之,則設為 0。特例的情況發生在樓梯的處理,這部份待第三小節介紹。

    有了上述的資料,每當使用者移動時,我們便會先算出移動後的位置,然後

    以移動後位置所在格子點與移動前所在格子點作比較,若兩者格子點內的值相

    同,則表示使用者可以直接移到該位置;若兩者格子點內的值不同,則表示有樓

    梯或是障礙物存在。遇到後面這種情況的話,則再進一步去分析處理。 舉例如下:

    Y5 127 0 0 0 0

    Y4 127 0 0 0 0

    Y3 127 0 0 127 0

    Y2 127 0 0 0 0

    Y1 127 127 127 127 127

    Y0 X0

    X1 X2 X3 X4 X5

    假設我們有一個 5×5的空間,而沿著 x = X1與 y = Y1各有一道牆,在上圖

    中即為靠左緣與下緣值為 127 的部份。而我們在 (X4, Y3) 的地方置有一個桌子,則處的值同為 127。至於其他地方,因為沒放置東西,所以皆為 0。如果今天我們從 (X2, Y3) 內移動到 (X3, Y3 )的格子內,則這兩格的差值為 0,所以可以順利前進;又如果我們繼續移動,當我們走到下一步將由 (X3, Y3) 移到 (X4, Y4) 內時,我們發現移動前後所取得的值差為 127,故我們得知此時應做進一步分析與處理。

  • 1.2 碰撞處理 碰撞的情況發生在移動後的位置移入值為 127 的格子點內。遇到碰撞的時

    候,我們會先檢查移動向量的 X分量與 Y分量,分別對這兩個分量作碰撞偵測。以這樣的方式,當我們切入一個被物件佔據的格子點時,除非我們的移動向量與

    碰撞面垂直,否則仍會有一個沿物件邊緣的分量。這樣的好處是在我們碰撞到物

    體時的移動會較為平順。

    C

    B

    A

    以上圖為例,假設我們在瀏覽時維持著由 A 往 B 的方向。當我們持續往前

    走,直到撞到物體表面。若我們仍繼續沿著同樣的方向前進,則過 B 點後,程式會以原移動方向與物體的關係計算出實際應該移動的方向與量值。此時,得到

    的結果就是由 B往 C的方向。 1.3 上下樓處理 為了簡化整個問題,我們在將樓梯對應到二維的 XY平面時,會根據樓梯的

    方向,將其對應的格子點填入連續的數字。又因為每層樓的碰撞偵測是各自獨立

    的,所以上下樓處理和所在樓層的切換正確與否有著密切的關係。 我們的設計如下例所示,左邊為一樓,右邊為二樓:

    Y3 0 0 0 0 0 Y2 0 0 0 0 0 Y1 126 3 2 1 0 0 X1 X2 X3 X4 X5

    Y3 0 0 0 0 0 Y2 0 0 0 0 0 Y1 0 -126 127 127 0 0 X1 X2 X3 X4 X5

    樓梯的位置從(X1, Y1)到(X4, Y1),且沿這個方向往下。對於一樓而言,我

    們爬樓梯的動作發生在格子內的值由 0至 1、1至 2、或 2至 3…等,也就是當我

  • 移動後所在格子點的值為目前格子點的值+1 時,則有爬樓梯的動作;反之,當移動後所在格子點的值為目前格子點的值-1時,則有下樓梯的動作。當移動前後的差值大於 1,則視為碰撞,此時就需要以前一節的方式來處理。

    上下樓梯的問題解決了,但我們仍要解決從一樓切換到二樓與從二樓回到一

    樓的情形,於是我們使用 126與-126這兩個數字。當我們讀到前進後會進入值為126的格子、且目前所在格子的值大於 0的情況,則我們進行上樓梯與切換到上面一個樓層的動作。反之,若我們讀到前進後會進入值為-126的格子、而目前所在格子的值為 0時,則我們進行下樓梯與切換到下面一個樓層的動作。

    前者上樓的判斷較容易理解,但後者下樓的判斷為何是直接從 0到-126呢?

    試想像樓梯與樓層的關係。一般來說,同一個樓梯的最高點,應該會與該樓梯所

    連結的上層地板同高。因此,我們的設計中,樓梯的最高點與它所連結的上層地

    板同為 0,以避免程式在判斷時會多爬或多下一個階梯。另外,如果將上下樓層的切換點設在同一點,如上例的(X1, Y1)時,則會發生以下的狀況:當上樓從一樓的(X2, Y1)爬上(X1, Y1)時,會進行地圖的向上切換,亦即從一樓地圖切換上二樓地圖。當我們繼續從二樓的(X1, Y1)移動至(Y1, Y2)時,我們的判斷會是從-126到 0,同樣是增加了 126,此時便會造成程式判斷要再往上爬一層樓,所以當我們完成這步後,我們將會以為我們上到三樓。所以,將上下樓層的切換點設

    在不同的格子點中,是必要的,就如同上例的上樓切換點(X1, Y1)與下樓切換點(X2, Y1)。

    III. 編輯 3D 物件Model及範例場景

    1. 使用現成 3D Model 在網路上可以 download到許多現成的 3D Model,各式各樣、檔案種類也很多,但主要是 .3ds和 .lwo 兩種檔案為主。我們使用了一種免費的 load model軟體MilkShape 3D,它可以 load編輯大部分 3D Model的檔案。 由於現成Model檔案中的物件大小及座標都不盡相同,且差距頗大,所以我們依據自己的需求將Model改成是當的大小及座標位置;再來,現成Model中許多部份也都有使用倒貼材質 (texture mapping) 的技巧,但往往下載的檔案中並沒有附該材質圖檔,故會使開啟的Model很不完整,所以,得花很多時間將所有下載的Model一一過濾刪除或是自己幫該物件找材質圖檔使用,頗費時費力。

  • 2. 自己編繪 3D Model 雖然下載了許多的物件模型,但是因為該模型檔案不完整或是檔案太大

    MilkShape 3D編輯軟體沒有辦法 load,以致於實際上可以使用的Model在總下載Model中的比例很少,幾乎不到一半。所以,有些找不到或來不及找的物件就自己動手畫了。像是牆壁、地板,這些因為得剛剛好符合我們自己所訂的場景

    基本單位,又要可以彈性使用,所以就自己繪製的四角柱形狀的牆壁和正方形的

    地板,如此一來,使用者就可以利用新增物件的功能來編輯自己想要的牆壁和地

    板範圍。還有一些門、地毯、壁畫等簡單幾何圖形的物件,就自己利用材質貼圖

    編輯出 3D Model。 3. 設計 demo建築物場景 有了統一整理建立好的 3D Model後,自己利用這些物件編組了一部分建築物場景,但在實作的時候才發現得比想像中花費更多的時間。理想中的地板和牆

    壁不就是一個個基本單位排在一起,但實作起來才發現,因為我們一次只能加入

    一個新物件,所以光排地板(20*20) 和牆(20*4)就要好久時間!接著要看看各物件的模樣、大小,然後再判斷是否覺得何釋放在場景中;接著,規劃

    五、使用工具

    MilkShape 3D 1.5.7 編輯、整理或繪製 3D Model,並且將其存檔成統一格式﹙.3ds﹚。

    MS Visual C++ 6.0 編寫系統程式。 OpenGL library

    六、未來願景 1. 編輯建築物物件時視角能改變 這樣能夠方便一些看不見的死角,像是被牆壁或是其他物品遮住的物件,以

  • 利編輯、移動。

    2. 牆壁的編輯可以整面一次畫出 可以節省使用者的時間,不用一單位一單位慢慢拼湊起來。 3. 紀錄使用者在場景中移動路線 加上動態模擬,紀錄使用者走過的路線,可以存檔重複撥放,結合了作業一中學到的技巧方法。

    七、專題分工 楊國鑫;編輯模式介面及功能 系統中編輯模式介面及功能部分的程式撰寫、整合程式並測試 張鴻棋:模擬實際場景模式 系統中模擬實際場景模式部分的程式撰寫、整合程式並測試 蕭淑方;3D model及範例場景

    蒐集可用物件、調整物件大小座標位置統一、貼材質、編繪物件