上次只是说了下osg场景中用怎样的树比较好,说到了一些解决方案也只是一笔带过,所以今天给补上。
如果您和我一样的苦逼,用的是3dmax建的场景,然后场景又比较大,树木又比较多。那就意味着树木和地形,建筑等必须分开建。不然的话3dmax很可能因为模型太大而自动关闭,所以根本就无法完成这样的工作,正如当初我把全部树,建筑,都添加进一个模型里面一样,到最后3dmax一不小心就关了,一下午的工作就没有了,,,被坑了好多次,,(也有可能是因为3dmax2010 比较不稳定,但遇到这个问题的也不是只有我一个!)所以要想解决这个问题还是要将树,建筑,地形分开做。然后分别导出。ive文件。
但是分开后又会遇到一个麻烦,怎样才能将树,建筑放在正确的位置呢?毕竟在3dmax里面是可见的,树该在哪里就放哪里。但如果要通过代码手动确定那么多树的位置的话显然是不可能的,所以还是要在地形中确定那些树和建筑的位置。也就是说在地形上做一个标记什么的,然后通过遍历就知道哪里是树,哪里是建筑了。
说到这,我不得不说3dmax真的很坑爹,因为3dmax不能导出空节点,(不过话又说回来,osg中的优化也会将空节点删除。在模型优化方面这应该是一个好的技术。只是用到这会给我们带来不少麻烦而已。如果可以设置的话就好了,不过听说maya在这方面就毫无压力,我也只是听大神们说!)这就意味着你要加另外一个小的物体去代替树,(具体这个小方块和模型之间有什么关系?我有在下篇博文《osg中模型的大小匹配》中提到)然后给这个物体加上树或建筑的信息(毕竟一个小的物体比一棵树少占内存,,,)导出后遍历到这个节点后再把原来的模型挂上去。
还有一个方案就是在建地形的地图中(模型是根据地图建的)再专门建全是树和建筑的场景,然后所有的树和建筑建好后和地形刚好能够合起来。当然这样还是不能达到节省内存的目的,你要做的就是把这个有树木的场景导出,然后遍历所有的树木的节点,再把这些节点的信息添加到地形导出的文件中,这样就等于给地形加上了空节点。然后把这个有空节点的场景再写成文件。最后遍历这个场景时同样可以轻松的找到树木建筑,,,。
当然你可以把两种结合,就是比较少的就直接在地形上加小物体做标记,然后比较多的树可以另外建一个模型,,,
然后就是共享了,呃,姑且怎么说吧。因为在场景中所有相同的树比如说场景中有很多柳树,那么你只要导入内存一棵柳树就行,在遍历节点的时候,只要碰到是柳树,你就把这棵柳树的模型挂上去就行了。也就是说所有柳树共享了一个柳树模型。这样就不必每棵柳树都读进一个模型,占用大量的内存了。
最后还有一个很重要的就是节点的命名,因为要遍历节点,通过节点挂模型,所以命名很重要,不然最后坑的还是你自己。根据大神的指点,我们可以这样命名:前缀-基本名称-编号。假如很多柳树那么就可以这样:T-willom-90;后面就好办了。自己写个函数,只要是T的可以全部先挂上低模,然后是willom挂的就上柳树的精模。这边可以用lod。
当然你还可以写个配置文件。通过配置文件把地形中所有的模型读进内存,然后遍历时就可以挂载了。
到这里,我要总结的就这些了,虽然看上去不多,办法也不是很奇特,但很管用。然后从开始做到做成功我也花了很多时间。所以小小的总结下,希望可以给你们一点帮助。
最后要在这里感谢一个人,一个给我很多帮助,很多支持,很多指导的,但我又不知道他姓名的好心人。谢谢他教我了很多很多东西,包括上面用到的这些都是他教我的,如果没有他,我想我不可能那么快解决这个问题。所以在这里衷心的感谢他——北邮浪人,谢谢!