webots自学笔记(七)通过定义顶点构件3D形状(IndexedFaceSet节点)
原创文章,来自“博客园,_阿龙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语言现在用的不怎么多。