原創文章,來自“博客園,_阿龍clliu” http://www.cnblogs.com/clliu/,轉載請注明原文章出處。
看到自己寫的東西有人支持,也蠻欣慰的,所以頂着畢設的壓力還是再更新一篇。
在webots中使用VRML語言建模,這個語言是比較老的了,確實沒有現在的建模工具好用。這一次講的是IndexedFaceSet節點,在VRML語言里也是有的。
比方說我要建一個正六變形柱體,如圖所示,當然可以建一些復雜的,只要頂點的坐標都是已知就可以(話說模型都應該是已知的)。
先要知道這個模型所以頂點的坐標,以中心為原點。我是用Matlab算的,然后還可以按格式輸出。正六邊形邊長1.5m,高0.2m,坐標如下。
1.299 0 0.75 0 0 1.5 -1.299 0 0.75 -1.299 0 -0.75 0 0 -1.5 1.299 0 -0.75 1.299 0.2 0.75 0 0.2 1.5 -1.299 0.2 0.75 -1.299 0.2 -0.75 0 0.2 -1.5 1.299 0.2 -0.75
在shape節點插入IndexedFaceSet節點,需要在coord節點下添加所以頂點,在coordIndex節點下添加一些索引(后面講)。會發現操作起來真的很繁瑣,需要一下一下點新建,一個一個點改值,就這12個點我已經不耐煩了,要是更多人都會瘋掉的。 不過還是有方法的,千萬別傻傻的自己一個一個點加,接着往下看。
將這個節點所在的Shape節點導出成wbo格式的一個文件,用記事本打開,發現是可以讀的,其實就是VRML語言拉。導出前在頂點和索引上新建幾個,就會出現下面看到有一些0。在這里面修改可以方便很多。
接下來說說IndexedFaceSet怎么構建3D形狀的,將12個頂點添加進去后,點的索引就是0—11,在coordIndex節點下,用索引號排列便是以頂點建立面,比如 0 1 2 3 4 5,就是以這第1-6個點組成一個面,構建完一個面以-1隔開。比如0 1 2 3 4 5 -1 11 10 9 8 7 6 -1 ,這樣就構建了兩個面(實體的上下兩個正六邊形)。
注意:構建的面只要單反向的可視性,就是你從正面看是可以看到這個面的,從后面看就什么都看不到,面隱身了。以觀察方向的逆時針方向逐個添加索引號,是可以看見的。下面話一個圖理解一下。 在圖中,上面的六個頂點索引號是0-5,下面六個頂點的索引號是6-11。如果我們從上面往下看這個實體,頂面構建為0 1 2 3 4 5,是逆時針方向,所以是能看到的。從下面往上看,底面構建為11 10 9 8 7 6 ,是逆時針,所以從下面是可見的。
建立一個實體,可視的方向都是從外面看,如果你把視角調到物體的里面,這個實體就看不見了。所有面畫完的代碼如下:
#VRML_OBJ V6.0 Shape1 { geometry IndexedFaceSet { coord Coordinate { point [ 1.299 0 0.75 0 0 1.5 -1.299 0 0.75 -1.299 0 -0.75 0 0 -1.5 1.299 0 -0.75 1.299 0.2 0.75 0 0.2 1.5 -1.299 0.2 0.75 -1.299 0.2 -0.75 0 0.2 -1.5 1.299 0.2 -0.75 ] } coordIndex [ 0 1 2 3 4 5 -1 11 10 9 8 7 6 -1 9 3 2 8 -1 4 3 9 10 -1 5 4 10 11 -1 0 5 11 6 -1 1 0 6 7 -1 2 1 7 8 -1 ] } }
這樣的建模確實有點繁瑣,所以VRML語言現在用的不怎么多。