细分二十面体,高度图控制和质心坐标插值
星球算法吧
全部回复
仅看楼主
level 5
KnIfER 楼主
占个坑,吃酒吃醉了,晕晕的。。
质心坐标:barycentric coordinates
(Interpolating in a Triangle --CodePlea)
2019年02月03日 09点02分 1
level 5
KnIfER 楼主
传统的世界地图映射在极地拉伸明显,不能用来作为高度图。
为此,我想了一种针对正十二面体衍生物的高度图规则,让高度图上的像素与正十二面体在某一层细分深度的每一角点一一对应。
很简单,就是把20个三角形想象成直角三角形,然后互相堆垒。
下图是使用一个/四个通道的堆垒:
即便是这样,即便高度图12293*4097,依然不够表现大星球地形。
问一个群,有的说可以加地形细节贴图,有的说需要virtual texture,megaTexture,这些不失为方案,不过实施起来很难。
简便起见,我直接加了一些球面正弦波,
从此棱角变波浪,金字塔扭

地伸入空中……
2019年02月05日 05点02分 2
level 5
KnIfER 楼主
插值方法:
由于堆垒单位是直角三角形而不是正方形,使用双线性插值会在边界区域产生裂缝。
所以使用三角形插值,或者说质心坐标插值。这种插值方法对于任意形状的三角形都可以做到均匀插值,就是说,三点确定一个平面,那么利用三角形插值法得到的一个值,必定落在三个顶点定义的值平面上。
三角形插值的公式很恐怖,看上去像是恐龙……
其中P是所求点,w代表权重。
嗯,上式是解如下方程的结果:
有点混,px、Xv1应该都只是坐标值?
未知数三个w,有三个方程,那么这组方程是可以解出来的……
关于质心坐标,codeplea上面还有一个js做的图形演示,看到那个演示我就觉得,国外真是百花齐放,技术艺术积累之深难以想象……
具体代码:
js版本:
var calc_barycentric_weights = function(x, y, v1x, v1y, v2x, v2y, v3x, v3y) {
var w_v1 = ((v2y - v3y)*(x - v3x) + (v3x - v2x)*(y - v3y)) / ((v2y - v3y)*(v1x - v3x) + (v3x - v2x)*(v1y - v3y));
var w_v2 = ((v3y - v1y)*(x - v3x) + (v1x - v3x)*(y - v3y)) / ((v2y - v3y)*(v1x - v3x) + (v3x - v2x)*(v1y - v3y));
var w_v3 = 1.0 - w_v1 - w_v2;
return [w_v1, w_v2, w_v3];
}
直接复制过来的,很漂亮:
2019年02月05日 05点02分 3
1