2017-01-29 100 views
0

让我们假设一个正方形(4分),从顶部看。 4点中的每一点都没有相同的测高。三维坐标插值

如果你从顶部(或从底部)看,你会看到一个正方形,但是如果你从侧面看,你会看到4个点不在同一个水平。

所以你有一架不水平的飞机。

让我们想象在广场内的第五个点。我想要做的是计算第五点的高度。这个高度测量是平方内点位置和平方4点高度的函数。

我想我已经计算插值但我没有设法做...

任何想法?

感谢

+0

除非您确定所有点都位于同一平面上,否则必须将该平方分成两个三角形。这是你的情况吗? – Bartvbl

+1

[Altimetry](http://www.dictionary.com/browse/altimetry)doens't意味着你的想法。你正在寻找的词是“高度”或“高度”。 –

回答

1

所以,除非你肯定知道所有点位于一个平面上,这将是该方法的简单化,我假设你已经划分的平方成两个三角形。此外,我假设有4个顶点,分别代表您的正方形的每个顶点的v_00,v_10,v_01v_11。我还会假设你的三角形被定义为(v_00, v_10, v_11)(v_00, v_11, v_01)

vec4 v00 = vec4(...); 
vec4 v01 = vec4(...); 
vec4 v10 = vec4(...); 
vec4 v11 = vec4(---); 

vec4[2][3] triangles = {{v00, v10, v11}, {v00, v11, v01}}; 

最后,我假设你知道X和左下顶点(只减去x和从x和v_00 y坐标的第五点的Y坐标)Y坐标相对。我会打电话给这个P点。我们想知道它的z坐标。

vec4 fifthPoint = vec4(...); 
vec4 P = fifthPoint - v00; 

这意味着这两个三角形的“共享边框”位于广场底部左侧和右上角之间的对角线上。

由于两个三角形可以完全不同,因此确定任意第五点的坐标从确定它所在的两个三角形中的哪一个开始。由于我们知道形状是一个正方形,所以我们可以将我们的点P的坐标相对于v_00(正如我之前假设的那样),看看哪个大于另一个。如果P的x坐标大于y坐标,我们知道P在右下三角形上。否则,它位于左上方。现在

bool whichTriangle = P.x > P.y; 
int triangleIndex = whichTriangle ? 0 : 1; 

,我们知道我们是哪个三角形,我们可以估算出它们的坐标,获得三角形的表面上的任何一点。

对于三角0:

vec4 vectorX = triangles[0][1] - triangles[0][0]; 
vec4 vectorY = triangles[0][2] - triangles[0][1]; 

对于三角形1:

vec4 vectorX = triangles[1][1] - triangles[1][2]; 
vec4 vectorY = triangles[1][2] - triangles[1][0]; 

注意,每个矢量这里沿着x和y轴前进。这很重要,所以我们可以直接使用P中的x和y坐标来计算插值。

接下来,我们对我们刚创建的两个向量进行归一化。

vectorX = vectorX.normalize(); 
vectorY = vectorY.normalize(); 

现在我们只需要与X相乘这两个值和P的Y坐标以获得该三角形的任何一点,并将其添加到一个基点。

对于三角0:

P = triangles[0][0] + vectorX * P.x + vectorY * P.y; 

对于三角1:

P = triangles[1][1] - vectorX * (1.0 - P.x) - vectorY * (1.0 - P.y); 

有你有它。对于那些实际上并不那么困难的事情来说,这个解释太复杂了。 P.z现在包含任意点的Z坐标。

1

作为一个梯形ABCD考虑这个直纹面: enter image description here

然后你就可以从A和B插值P1和P2从C和D.最后,你可以从插值P1和P2的高度P高度