擠壓造型Extrusion的節點說明和應用實例
2024-07-21 02:16:16
供稿:網友
擠壓造型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點的縮放比例。
其實只要高中的立體幾何學會了,擠壓造型理解起來就是小菜一碟。