擠壓造型Extrusion的節點說明和應用實例 ---------------------------- 1。擠壓造型的節點說明: Extrusion節點 Extrusion { spine [0 0 0,0 1 0] # MFVec3f crossSection [1 1,1 -1,-1 -1,-1 1,1 1] # MFVec2f scale [1 1] # MFVec2f orientation [0 0 1 0] # MFRotation beginCap TRUE # SFBool endCap TRUE # SFBool ccw TRUE # SFBool solid TRUE # SFBool convex TRUE # SFBool creaseAngle 0 # SFFloat } <域>: spine 該域定義龍骨折線,包括一系列三維點,依次連接相鄰點就得到一條折線。該域的 坐標在節點的局坐標系上定義。 crossSection 定義二維折線,包括一系列二維的坐標,依次連接相鄰坐標點就得到一條 分段線性折線。該則先在節點的局部坐表系xz平面中定義,二維的坐標的第一個數是x坐 標,另一個是z坐標。 /*我們重點關心上面兩個域*/ scale 該城定義二維折線的尺度縮放變換參數。在節點局部坐標系的XZ平面內,尺度變 換以平面的坐標原點為參照點,值的第一個數對應X軸的變換,第二個數對應Z軸。尺度變 換參數值必須大于零。一般該域值的個數與spine域一樣,順序對應著每個龍骨構造點處 的二維拆線的尺度變換。如果該城只指定了一個值,每一處的二維折線都使用這個值進行 變換。 orientation 該域定義三維旋轉變換參數。一般該域值的個數與SPine域一樣,順序對應 著每個龍骨構造點處的二維折線的旋轉變換。如果該域只指定了一個值,每一處的二維折 線都使用這個值進行變換。注意這個旋轉變換并不在節點的局部坐標系上定義,而在對應 每個龍骨構造點處的一個特殊的構造點坐標系上進行。 beginCap 該域說明延伸體是否有起始端面(對應龍骨中第一個構造點)。如果 beginCap= FALSE,則不產生起始端面,否則,起始端面是將crossSection域中的二維折 線首尾相連構成的多邊形,處于龍骨第一個構造點坐標系的xz平面。 endCap 該域說明延伸體是否有終止端面(對應龍骨中最后一個構造點)。如果endCap= FALSE,則不產生終止端面,否則,終止端面是將crossSection域中的二維折線首尾相連 構成的多邊形,處于龍骨最后一個構造點坐標系的xz平面。 ccw Extlusion節點自動生成幾何面的法線,該域決定法線方向與二維折線走向的關系。 當cow=TRUE時,二維折線走向(由折點定義的順序指定)、龍骨走向(由龍骨構造點定 義的順序指定)與法線方向應成右手關系;反之,當cow=FALSE時,二維折線走向、龍骨 走向與法線方向應成左手關系。如果域solid=TRUE,只有逆著法線方向觀察,才可以看到 幾何面。 solid 對于一個幾何體的面,法線方向的表面被認為是“外”表面,與此相反的是“內” 表面, 當solid域為TRUE時,只顯示“外”表面,“內”表面并不顯示著色。當幾何體是 閉合的時候,該域用于瀏覽器實現優化。如果solid= FALSE,則意味著“內”、“外”表 面都要顯示,瀏覽器必須計算兩個表面,這時如果使用質材,面上的某點在兩個表面使用 質材圖像上的同一像點。 convex 該域告訴測覽器幾何體是否為一個完全的凸面體。如果不能確定,該域應該設為 FALSE。convex域用于測覽器實現優化。 creaseAngle 該域影響瀏覽器對幾何體相鄰表面之間棱的處理。creaseAngle指定一個大 于0的角度值(弧度),如果相鄰表面法線之間的夾角的絕對值小于這一角度,創覽器對 相鄰表面做平滑處理,棱不能被明顯地察覺到。該域通常用于生成光滑的表面。 <事件>: Set-SPine eventIn MFVc3f 設置spine路徑的值。 Set-CrossSection eventIn MFVec2f 設置crossSection路徑的值。 set-scale eventIn MFVec2f 設置scale的值。 set-orientation eventIn MFRotation 設置orientation的值 <說明>: ExtruSion節點為描述多種形狀的形體提供了一種有效和直接的方式,那些可以用ZD 截面圖形經在空間中沿某一路徑移動而形成的形體均可采用此方式。 crossSection域描述了一個x-z平面上的2D準形截面。將crossSection的拷貝放在每 個spine路徑的連接處,按照scale、orientation域的值進行縮放或旋轉,然后將相鄰連 接處的交叉部分的相應頂點連接起來形成物體的側面。如果beginCap endCap已被說明, 適當的平面多邊形端帽(caps)便可被加在所構建形體的末端。 ------------------------ 2。vrml代碼如下: #VRML V2.0 utf8 #用戶視角 Viewpoint { position 0 4 10 description "Look" } #背景 Background { skyColor [ 0.0 0.2 0.7, 0.0 0.5 1.0, 1.0 1.0 1.0 ] skyAngle [1.309,1.571] } Group { children [ DEF Body Transform #螺絲紋,擠壓造型 { children Shape { appearance DEF DColor Appearance { material Material { diffuseColor .2 .1 .32 specularColor .31 .388 .388 ambientIntensity .07 shininess 1 } } geometry DEF Whorl Extrusion { crossSection [ 0.05 0,0 0.08,-0.05 0,0.05 0 ] spine [ ] scale [ ] beginCap TRUE endCap TRUE solid TRUE } } }, # end Body DEF Top Transform #釘子帽,圓柱 { translation 0 5.05 0 children Shape { appearance USE DColor geometry Cylinder { radius 0.5 height 0.1 } } }, Transform #釘子的身子,圓錐 { translation 0 2.5 0 rotation 1 0 0 3.14 children Shape { appearance USE DColor geometry Cone { bottomRadius 0.25 height 5 side TRUE } } }, DEF myScript Script { field SFFloat a 0.01 eventOut MFVec3f spin_changed eventOut MFVec2f scal_changed url "vrmlscript: function initialize() { y_add = 0; //Y方向上的增量 cent = Math.PI/16; //螺旋時的角度的增量 angle = 0.0; sc = 0; //縮放比例 N = 64 * 5; for(i = 0; i < N - 20; i++) { b = angle / (64*Math.PI); part_x = b * Math.cos(angle); part_z = - b * Math.sin(angle); /*spin就是一個多邊形逼近形成的圓,Y上加 上增量,就形成了螺旋上升的造型。*/ spin_changed[i] = new SFVec3f(part_x, y_add, part_z); scal_changed[i] = new SFVec2f(sc,sc); angle += cent; y_add += 1 / 64; sc += 0.01; } }" } ] ROUTE myScript.spin_changed TO Whorl.set_spine ROUTE myScript.scal_changed TO Whorl.set_scale } 3。解釋 crossSection [] 就是一個在x-z平面上的封閉圖形,例子中是一個三角形; spine [ ] 是crossSection的圖形拉動的軌跡,(x,y,z)三維坐標形成的一個數組 scale [ ] 造型在各個spine點的縮放比例。 其實只要高中的立體幾何學會了,擠壓造型理解起來就是小菜一碟。
|