标签:
在三维图形处理中我们常常会用到趋势编辑这一功能,用得比较多的可能是三维Gis模拟地形仿真中,为了认为的模拟突起一座山峰等。在游戏中用的也比较多,主要也是用在3D游戏中场景自定义编辑,自己在地图中生成一块小山坡或者一个坑洼处。
上面两张图是我从网上随便找的,不能说明问题,这里只是贴出来,能看看效果,大概需要做的就是这样的效果。
好,明确了问题之后,我们来逐步分析问题。
1,首先我们需要在平面上选取一点,并设定一个需要约束到的点,就是将这个店变换到我们需要约束到的点上去。
2,根据第一步我们会得到一个平面上凸起的小尖峰。这样很影响审美。假设我们是一个三角化的网格那么如果约束了一个点之后,就会在平面上凸起一个三棱锥。这样不仅影响美观,而且没有半点趋势的效果。所以我就想,把周围的三角网格一起也跟着约束一定的幅度那样就好了,是的,事实上我也是这么做的。
3,问题来了,其它的网格哪些需要约束,哪些不需要,约束多少等,这些才是解决问题的关键。先说说哪些网格需要约束,哪些不需要。我的方案是这样的:
a,记录所有网格顶点的索引值,然后遍历它的拓扑结构,进行分层,需要约束的点的索引值层数为0,层数或者叫度。然后与这个点直接相邻的拓扑结构上的其他点层数为1,再以其他点的直接相邻的点层数为2,依次遍历所有的顶点。
b,然后我们需要一个曲线函数,并根据这个曲线函数确定每一层的约束系数。并且因为我们要保证被约束的点必须约束到约束点上去,所以当层数为0是,系数一定为1.我在考虑曲线函数的时候我首先想到的事抛物线,理由是它很好理解也很好控制,但是抛物线能出现负值,而我们这里的约束系数是不应该出现负数的。然后我又考虑的双曲线,但是双曲线不太方便约束到 f(0)=1上。最后我想到一个函数,Sigmoid函数。它是一个S型曲线,并且是根据自然指数计算而来,很好理解,控制,并且计算效率也比较高。
最后一个就是sigmoid曲线。
它的计算公式为:
当然从图像上可以看出这里并不太符合我们的需要,于是对这个函数进行一一些微调,微调后的函数为:
这里p是一个非零的正系数,在这里将决定平滑度是否陡峭,当p值越大时,生成的曲线越平缓。x就表示我们的层数,当层数为0时,计算出的S值正好为1,当怕的值取为时表示,当遍历到第四层的网格点的约束系数为0.5,自己可以根据公式推算。
4,确定了约束系数函数和层数之后,剩下的便很好理解了,在被约束点与约束点之间的向量为准,将每个点与按照系数与这个向量相乘的结果相加即可。
后续,这样计算出的结果仍然会有一点凸起的小尖峰,我们解决的思路有几种,1,再寻找更合适的曲线函数,2,微调现有的曲线函数,3,细化三角网格,再分配三角网格层数。
思考,我只是做了一个测试,看到有预期的效果于是就写了这篇博文,因为涉及项目,不方便贴出源代码,在这个例子中还有很多可以优化的部分,这里只是一个原始的思路。希望大家多多指正和批评,并可以提供更好的建议,这也是我在博客园的第一篇博文,感谢您的阅读。
标签:
原文地址:http://www.cnblogs.com/jvane/p/4397907.html