Opengl 三维坐标插值

Opengl 三维坐标插值,opengl,scenekit,Opengl,Scenekit,让我们假设一个正方形(4点),从上面看。 这4个点的测高不相同 如果你从顶部(或底部)看,你会看到一个正方形,但如果你从侧面看,你会看到这4个点不在同一水平面上 所以你有一个平面,它不是水平的 让我们想象一下广场内的第五个点。我想做的是计算第五个点的测高。该测高是正方形内点位置和正方形4点测高的函数 我想我必须计算插值,但我没能做到 有什么想法吗 谢谢,除非你确定所有的点都位于一个平面上,这是这个方法的简化,否则我假设你已经把正方形分成两个三角形。此外,我假设有4个顶点,v_00,v_10,v_

让我们假设一个正方形(4点),从上面看。 这4个点的测高不相同

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

所以你有一个平面,它不是水平的

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

我想我必须计算插值,但我没能做到

有什么想法吗


谢谢,除非你确定所有的点都位于一个平面上,这是这个方法的简化,否则我假设你已经把正方形分成两个三角形。此外,我假设有4个顶点,
v_00
v_10
v_01
,和
v_11
,代表正方形的每个顶点。我还假设您的三角形定义为
(v_00,v_10,v_11)
,和
(v_00,v_11,v_01)

最后,我假设您知道相对于左下角顶点的X和Y坐标(只需从
v_00
的X和Y坐标中减去第五个点的X和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];
P = triangles[0][0] + vectorX * P.x + vectorY * P.y;
对于三角形1:

vec4 vectorX = triangles[1][1] - triangles[1][2];
vec4 vectorY = triangles[1][2] - triangles[1][0];
P = triangles[1][1] - vectorX * (1.0 - P.x) - vectorY * (1.0 - P.y);
请注意,这里的每个向量都沿x轴和y轴移动。这很重要,因此我们可以直接使用P的x和y坐标来计算插值

接下来,我们将刚刚创建的两个向量归一化

vectorX = vectorX.normalize();
vectorY = vectorY.normalize();
现在我们只需要将这两个值与p的X和Y坐标相乘,得到三角形上的任意点,并将其添加到一个基点

对于三角形0:

vec4 vectorX = triangles[0][1] - triangles[0][0];
vec4 vectorY = triangles[0][2] - triangles[0][1];
P = triangles[0][0] + vectorX * P.x + vectorY * P.y;
对于三角形1:

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

就在这里。一个过于复杂的解释,其实并不难。P.z现在包含任意点的z坐标。

因此,除非您确定所有点都位于一个平面上,这将是此方法的简化,否则我假设您已将正方形划分为两个三角形。此外,我假设有4个顶点,

v_00
v_10
v_01
,和
v_11
,代表正方形的每个顶点。我还假设您的三角形定义为
(v_00,v_10,v_11)
,和
(v_00,v_11,v_01)

最后,我假设您知道相对于左下角顶点的X和Y坐标(只需从
v_00
的X和Y坐标中减去第五个点的X和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];
P = triangles[0][0] + vectorX * P.x + vectorY * P.y;
对于三角形1:

vec4 vectorX = triangles[1][1] - triangles[1][2];
vec4 vectorY = triangles[1][2] - triangles[1][0];
P = triangles[1][1] - vectorX * (1.0 - P.x) - vectorY * (1.0 - P.y);
请注意,这里的每个向量都沿x轴和y轴移动。这很重要,因此我们可以直接使用P的x和y坐标来计算插值

接下来,我们将刚刚创建的两个向量归一化

vectorX = vectorX.normalize();
vectorY = vectorY.normalize();
现在我们只需要将这两个值与p的X和Y坐标相乘,得到三角形上的任意点,并将其添加到一个基点

对于三角形0:

vec4 vectorX = triangles[0][1] - triangles[0][0];
vec4 vectorY = triangles[0][2] - triangles[0][1];
P = triangles[0][0] + vectorX * P.x + vectorY * P.y;
对于三角形1:

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

就在这里。一个过于复杂的解释,其实并不难。P.Z现在包含了任意点的z坐标。

是梯形ABCD,考虑这个直纹面:


你可以从A和B中插入P1,从C和D中插入P2。最后,你可以从P1和P2高度插值< P高度> /P> < P>作为梯形ABCD,考虑这个直纹表面:


然后可以从A和B中插值P1,从C和D中插值P2。最后,可以从P1和P2高度中插值p高度

除非您确定所有点都位于一个平面上,否则必须将正方形分成两个三角形。你就是这样吗?这不是你认为的意思。你要找的词是“高度”或“高度”。除非你确定所有的点都在一个平面上,否则你必须把正方形分成两个三角形。你就是这样吗?这不是你认为的意思。你要找的词是“高度”或“高度”。