The FL-system: a functional L-system forprocedural geometric modeling

 FL-system是由VRML97擴展與代數擴展加上L-system組成,是在"The FL-system: a functional L-system for procedural geometric modeling"的paper提出


在這使用的L-systems為無上下文L系統(也稱為OL系統),具體定義如下:

5元組Gπ= <V,Σ,ω,P,π>

V:變量符號集合

Σ:形式參數的集合

ω:初始狀態串

P:產生式規則

function π : P → (0, 1]

C(Σ):邏輯表達式,其參數來自Σ

E(Σ) :具有相同集合參數的算術表達式



FL系統基本上具有無上下文L系統的大多數功能,例如參數化規則,條件和隨機規則選擇。 上圖引用自Prusinkiewicz 。n ∈ Σ 是參數; n = 0 in C(Σ)是一個條件表達式;p ∈(0, 1] 是一個概率。


物件參考於通用參數

F(Σ)定義為Σ中具有參數的函數集,包括創建,修改列表,向量和矩陣之類的功能。

O定義為一組通用對象引用。

一個規則參數p被定義為P =Re ∪O ∪S,其中S是字符串集合,P是規則參數集合。

參數可以是實數,字符串或通用對象引用,這些引用可以引用到矢量或更高級別的對象

函數F(Σ)中,可以區分為以下兩種類型及功能。

第一個類型包括不返回值的函數。這些代替通常的L系統端子符號的功能又稱為端子功能。該通用參數作為函數的參數(parameter)給出,用於生成或修改通用對象的內容。

另一種類型包括返回P中的值的函數。這些函數通常用作參數函數,通常用於創建通用對象並返回對已創建對象的引用。當這些函數用作規則參數時,將首先執行它們,然後將它們的返回值用作重寫過程中相應規則的有效參數。

考慮到這兩個新定義,此篇paper重新定義了生成集P和公理ω如下:



端子元件函數

重寫系統在重寫隊列上運行。在推導過程的開始,此重寫隊列僅包含系統公理。

當公理被重寫時,它被隊列中的後繼者替換。當在此隊列中找到終端功能時,將立即應用它們。

使用對象引用作為參數允許函數對先前重寫的規則提供的對像或由參數函數生成的對象進行操作。

這允許終端函數在重寫過程的任何步驟生成幾何圖形並使用此新幾何圖形初始化先前生成的對象。


集和迭代

添加了眾所周知的迭代符號:A(n)→for(i = 0; i <= n; i ++)B此符號允許定義派生分支集。以一種簡單,清晰和有效的方式生成。

該表示法基本上是迭代的,它也用於描述並行重寫的有序符號集。

---


並行調整

通過引用和功能的使用,出現了將對象的創建與對其上運行的功能進行同步的約束。這就是將符號“!”引入同步操作符的原因。

該運算符剪切並行派生,並延遲標記規則的重寫,直到完成寫在其左側的非終端符號的重寫為止。

下圖所示的示例說明,規則C的推導必須在規則B的完全推導之後進行。因此,如果B動態生成結構,則C可以使用它。請注意,在此示例中,f 1和f 2是終端函數。




由於這個系統不是對字符串進行操作,而是對對象進行操作,因此使用生產隊列來處理生產過程。每個並行生產包括重寫隊列中包含的每個規則。終端符號即功能被執行,而非終端符號(例如規則)被重寫到隊列的下一步。

下圖示出了上述系統的推導的連續步驟。在此示例中,由於並行實現,D在C之前被重寫,但是也可以在C之後被重寫。



生產集P最終被重新定義為以下形式:




語法潛能

FL系統的功能特性以及對並行性的增強控制允許開發新的擴展。

過for表達式引入了對生產過程的更好控制。

由於在重寫過程中生成了幾何模型,因此可以執行惰性重寫來生成詳細程度。 這個想法是,重寫過程可以在一個級別生成之後停止,並在請求其後續級別時重新開始。



適用於3D模型

代數擴展

列出了適用於幾何轉換(例如平移,旋轉和縮放)的基本代數函數。 這些終端函數在F(Σ)中定義為

–轉換(M,x,y,z),

–旋轉(M,x,y,z,α),

–比例(M,sx,sy,sz

其中 M是我們對其應用變換的4×4齊次矩陣的引用。 

其他終端功能,例如

–將矩陣M應用於列表L和參數函數的元素的multMatrix(M,L)

–返回矩陣M的副本的copyMatrix(M)。 

最後,還定義了基本數學函數,例如餘弦和正弦。


Turtle simulation

海龜移動時可以使用幾何對象和幾何變換來模擬海龜。

烏龜位置矢量及其三個垂直向量被一個通過4×4齊次矩陣參數處理的局部坐標系替換。

終端函數生成網格時,可以將當前矩陣應用於其頂點集以將其置於全局坐標系中。這種功能還可以使用當前矩陣來初始化場景圖生成期間生成的場景圖內的轉換節點。

為了替換在L系統中用於指定烏龜移動分支的括號符號,使用copyMatrix終端功能複製本地坐標系,以便為每個後繼規則提供一個副本。

每個後繼規則都可以在其自己的局部坐標系上(也就是說,在其自己的當前矩陣上)運行。

必須遵循轉換層次結構的構建。




VRML97 extension

VRML97節點及其字段初始化的兩個函數:

– defVrmlNode(類型,名稱),它具有兩個參數:type是VRML97節點名稱(IndexedFaceSet,Trans-form等),並命名其可選定義名稱(用於處理DEF / USE機制)。此參數函數創建一個節點,然後返回Σ中的值,該值是指向創建的節點的形式參數。

– setVrmlfield(node,fieldName,value),它具有三個參數:node∈Σ是指向VRML97節點的形式參數,fieldName是被修改的字段的名稱,value是它的新值。該功能是終端功能。

這兩個簡單的終端允許創建完整的VRML97場景圖。可以如下實現該擴展:

首先,使用defVrmlNode參數函數創建一個節點。

然後,遞歸應用一組規則,以創建和/或操縱代表節點未來內容的數據集。

最後,使用結果數據分配節點的字段。

為此,可以用!標記setVrmlField作為終端函數。

只有創建了重新引用的VRML97節點並生成了數據集。

“ =”代表符號“→”,而()代表一個列表。

當在參數表達式中使用時,符號bol“ =”表示參數的命名。

下圖示例中,語法由公理和分別名為w,initIfs和computeQuad的兩個規則組成。這三個符號是非終結符。

公理w得出規則initIfs,該規則具有兩個引用泛型對象的參數。這些通用對像是VRML97節點,由公理使用名為defVrmlNode的參數函數創建。

第一個對像是IndexedFaceSet節點,第二個對像是Coordinate節點。

名為initIfs的規則派生名為com-puteQuad的規則,該規則將兩個列表引用作為參數-ters。

這兩個列表將由計算四元規則填充;

第一個稱為頂點,填充有四邊形的頂點,第二個稱為索引,填充有定義四邊形的頂點索引。

命名這些參數是為了可以將它們作為參數提供給兩個終端函數(統稱為setVrmlField)。

這兩個終端功能分別使用頂點列表和索引列表來初始化VRML97節點ifsNode和coordNode的字段。

終端功能均標有“!”字符。該表示法意味著必須在以下終端功能使用其結果(即兩個列表)初始化VRML97數據結構之前重寫com-puteQuad規則。

最後一個名為setVrmlField的終端函數最終設置IndexedFaceSet節點與Coordinate節點的VRML97字段坐標(它構造節點層次結構)。

最後一個終端函數可以放置在computeQuad規則之前或之後,因為它僅使用先前引用的節點最終,稱為computeQuad的規則派生兩個終結函數。

最後一條規則將四進制生成並將四進制存儲到兩個列表(稱為頂點和索引)中,這兩個列表由initIfs規則創建,其引用作為參數給出。




即時重寫

打開包含xcript節點的VRML97文件時,將通過與Magellan渲染線程並行運行的重寫線程來分析和重寫語法。 因此,可以在y上生成數據並與渲染並行地將其放置到Magellan場景圖中。為了將生成的模型添加到Magellan的VRML97場景圖中,公理被分配了一個參數,該參數是對VRML97組的引用 語法可以向其添加生成的節點的節點。 因此,一旦語法被重寫線程重寫,後者就可以將包含模型的Group節點添加到Magellan場景圖。



實際建模

相關的語法包括兩個主要部分。

-Terminal elements終端元素,是原子建築元素,例如門和窗戶。關於VRML,終端功能會生成幾何圖形,該幾何圖形將放入用於描述模型的Shape節點中。

-Productions 生產是描述非末端結構元素的規則。這樣的規則可以是分解規則(例如,將立面分解為一組地板),增長規則(例如,從建築物的佔地面積中獲取建築物的體積)或兩者兼而有之。關於VRML,這些分解可用於生成節點層次結構。


終端元素在這篇語法中是經過參數化的3D網格,這些網格描述了由終端功能產生的窗戶,牆壁和門。非末端是末端以及其他非末端的組成或分解規則。這些規則將空間分解為子空間,並在空間上進行分配。

最後,公理參數確定以下輸入:建築物作為凸多邊形的足跡(3D頂點列表),建築物的樓層數及其高度。

根據這些參數,在增長過程中使用足跡獲取建築物的正面和屋頂的過程。每個立面都被分解成由牆壁,窗戶和門(可能是門)組成的地板。

下圖所示,該建模過程可以看作是一組生長和分解步驟。



為了擴展到3D,創建一個局部坐標係並計算立面的寬度作為底部(footprint)的兩個連續頂點之間的距離。

可以使用以下方法計算立面的高度給定公理參數的樓層m的數量以及樓層h和H的高度。

編寫了一組計算這些參數的規則後,然後編寫了一組規則來計算每個立面的不同元素的大小及其位置。如下圖所示:


有詳細說明幾何圖形的生成,也沒有詳細說明VRML97節點層次結構的生成或初始化。

在這種立面樣式中,固定了所有終端元素的大小。唯一可拉伸的部分是立面的楔子。

控制立面結構的參數如下圖所示。

m為樓層數;n = fl or((width -2 * smin)/ w),沿著立面的寬度可以放置的固定寬度的垂直截面的數量(窗戶和碼頭); 
w為垂直列的寬度,H為第一層的高度;a為一個窗口的寬度; d為柱和墩的半寬; h為其他地板的高度; s =(寬度-n ∗ w)/ 2,楔入寬度與立面部分之間的差異不大,無法添加另一個窗口(s為可拉伸值)。

佈局的規則有兩個規則

–第一層,用於放置第一層的元素,第二層,用於放置所有其他層的元素。

因此,佈局執行了立面分解的一部分。

然後,規則“第一層”推導出三個規則-稱為“楔入”的兩個規則用於產生第一層左右楔形的幾何形狀,而“ for”表達式用於生成組成第一層的拱廊的重複。 因此,第一個樓層也是分解規則,而此處未詳細介紹的楔入和拱廊是產生終端元素幾何形狀的規則。

最後,nextFloors導出了六個規則-四個規則用於生成楔形和列的幾何形狀,另外兩個用於分別用於執行窗戶和橋墩放置的表達式。





留言

這個網誌中的熱門文章

🛠【ASP.NET Core + Oracle】解決 ORA-00904 "FALSE": 無效的 ID 錯誤與資料欄位動態插入顯示問題

🛠【實戰排除教學】從 VS Code 的 _logger 錯誤,到 PowerShell 找不到 npm/serve,再到 Oracle ORA-03135 連線中斷——一次搞懂!

🔎如何在 Oracle PL/SQL 儲存過程中為文字欄位加入換行符號(CHR(10))——以 Updlcmremark 為例