我在我的代码中生成了一个由四边形组成的虚拟地形我现在正试图在某个点找到地形的高度。澄清一下:我的地形在X和Y方向上具有宽度和深度,在Z方向上具有高度。我想知道Z在特定X和Y处的一条直线与我的平面相交。
地形本身存储为二维数组中的四边形(索引是坐标,我只是存储高度),我使用以下代码:
(它使用从左下角到右下角和左上角的矢量的叉积)
function getTerrainHeight(float x, float y) {
int ix = (int)x;
int iy = (int)y;
Vector3 V1 = new Vector3(ix,iy,heights[ix][iy]);
Vector3 V2 = new Vector3(ix+1, iy, heights[ix + 1][iy]);
Vector3 V3 = new Vector3(ix, iy+1, heights[ix][iy+1]);
if ((x-ix) + (y-iy) > 1)
{
V1 = new Vector3(ix + 1, iy + 1, heights[ix + 1][iy + 1]);
}
Vector3 cross = Vector3.Cross(V2-V1,V3-V1);
return (cross.X * (x - ix) + cross.Y * (y - iy)) / -cross.Z + heights[ix][iy];
}
这种方法有效,但有一些不匹配,当我越过地形时总是有一些高度低于应有的凹痕。有人知道出了什么问题吗?