三维坐标插值

时间:2017-01-29 13:17:06

标签: opengl scenekit

从顶部看,我们假设一个正方形(4个点)。 4个点中的每个点都没有相同的高度。

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

所以你有一个非水平的飞机。

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

我想我必须计算插值,但我没有设法做到......

有什么想法吗?

由于

2 个答案:

答案 0 :(得分:1)

因此,除非您确定所有点都位于一个平面上,这将简化此方法,我假设您已将方块划分为两个三角形。此外,我假设有4个顶点,v_00v_10v_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和Y坐标(只需从v_00的x和y坐标中减去第五个点的x和y坐标)。我将这一点称为P.我们想知道它的z coorinate。

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();

现在我们只需要将这两个值乘以P的X和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 :(得分:1)

作为一个梯形ABCD考虑这个统治的表面: enter image description here

然后你可以从A和B插入P1,从C和D插入P2。最后你可以从P1和P2高度插入P高度